Skip to content

Instantly share code, notes, and snippets.

@hakopako
Last active May 15, 2017 02:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hakopako/7a4fdfb69d4e118d2d5bee2183921baa to your computer and use it in GitHub Desktop.
Save hakopako/7a4fdfb69d4e118d2d5bee2183921baa to your computer and use it in GitHub Desktop.
fabric(python) light framework.

required

  • python2.7 pyenv install 2.7.10 && pyenv virtualenv 2.7.10 python2
  • cd fabric && pyenv local python2
  • fabric pip install fabric

Exec

$ fab -H localhost deploy:config/hogehoge.json,skip_test=True

Architecture

.
|
|- task
|    |- base.py
|    |- sample.py
|    `- hoge.py
|- config
|    |- sample.json
|    `- hoge.json
`- fabfile.py   ..... entrypoint 
# -*- coding: utf-8 -*-
from __future__ import with_statement
from fabric.api import *
from fabric.utils import error
from abc import ABCMeta, abstractmethod
import os.path
class Base:
__metaclass__ = ABCMeta
node = dict()
@abstractmethod
def validate(self):
"""node varidation"""
return
@abstractmethod
def start(self):
"""deploy script"""
return
@abstractmethod
def test(self):
"""test sctipt"""
return
# -*- coding:utf-8 -*-
from fabric.api import *
import os
import sys
import json
import re
# fabfile.py階層以下のファイルをimport対象にする
fabfile_path = os.path.realpath(__file__)
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(fabfile_path))))
node = dict()
def deploy(filepath, skip_test=False):
puts("deploy_json=%s" % (filepath))
tasks = __taskFactory(filepath, env)
for t in tasks:
t.start()
if skip_test:
puts("Skipped Test.")
return
for t in tasks:
t.test()
def test(filepath=''):
puts("test_json=%s" % (filepath))
tasks = __taskFactory(filepath, env)
for t in tasks:
t.test()
def __taskFactory(fp, e):
f = open(fp)
data = json.load(f)
f.close()
hostname = e.host
hostgroup = re.sub(r'[0-9]{4}$', "", hostname)
task_stack = []
for recipe in data["task"]:
m = recipe.replace("./", "").replace("/", ".")
module_name = os.path.basename(recipe)
components = module_name.split('_')
klassname = "".join(x.title() for x in components[0:])
mod = __import__(m, fromlist=[klassname])
klass = getattr(mod, klassname)
a = klass()
a.node.update({"hostname": hostname, "hostgroup": hostgroup})
a.node.update(node)
a.node.update(data)
a.validate()
task_stack.append(a)
return task_stack
{
"hogehoge": {
"aaa": {
"bar": "fooooo"
}
},
"task": [
"./task/bar/fooo",
"./task/hoge/huga"
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment