Eine Möglichkeit, die Serverkonfiguration nach Rolle in Fabric zu definieren, besteht darin, eine Aufgabe zu definieren, die eine Hostliste in "env.roledefs" angibt.
environments.py
@task
def env_test():
u'''Testeinstellungen'''
env.roledefs = {
"web": ["www.test"],
"db" : ["db.test"]
}
@task
def env_production():
u'''Produktionseinstellungen'''
env.roledefs = {
"web": ["www01","www02"],
"db" : ["db01"]
}
Da es jedoch etwas redundant ist, habe ich versucht, es automatisch aus YAML zu generieren.
env.yaml
test:
roledefs:
web: [www.test]
db: [db.test]
production:
roledefs:
web: [www01, www02]
db: [db01]
Definieren Sie einen Helfer, der Daten liest und solche Aufgaben erstellt. (Referenz: http://www.backlog.jp/blog/2013/09/fabric-advanced.html)
helper/yaml_loader.py
# -*- coding: utf-8 -*-
import os, time
import yaml
from fabric.api import env,task
def load_env_from_yaml(yaml_file, namespace):
u'''Erstellen Sie eine Ausführungsumgebungsaufgabe aus einer Yaml-Datei'''
if os.path.exists(yaml_file):
env_data = yaml.safe_load(open(yaml_file).read())
for env_name, env_dict in env_data.items():
__create_env_task(env_name, env_dict, namespace)
else:
print('No {0} found. skipped.'.format(yaml_file))
def __create_env_task(env_name, env_dict, namespace):
u'''Definition der Task für die Ausführungsumgebung'''
f = lambda: env.update(env_dict)
f.__doc__ = u'''Set environment for {0}'''.format(env_name)
task_name = 'env_{0}'.format(env_name)
wrapper = task(name=task_name)
rand = '%d' % (time.time() * 100000)
namespace['task_%s_%s' % (task_name, rand)] = wrapper(f)
Lesen und verwenden Sie mit fabfile.py.
fabfile.py
import os
from helper.yaml_loader import load_env_from_yaml
# Execute fabric at fabfile.py directory.
__fabric_dir = os.path.abspath(os.path.dirname(__file__))
os.chdir(__fabric_dir)
# Load Environments
load_env_from_yaml('env.yaml', globals())
Beachten Sie, dass die Aufgabe nur verwendet werden kann, wenn "globals ()" aus der Fabfile übergeben wird.
TODO
--Ausnahmebehandlung --Lassen Sie die Lesbarkeit von Aufgabenname und Aufgabenbeschreibung für die Lesbarkeit zu. ――Ist es einen Schlüssel, der nicht in "env" verwendet werden sollte? (Es kann jedoch mit der obigen Methode geschrieben werden)
Recommended Posts