Une façon de définir la configuration du serveur par rôle dans Fabric est de définir une tâche qui spécifie une liste d'hôtes dans ʻenv.roledefs`.
environments.py
@task
def env_test():
u'''Paramètres de test'''
env.roledefs = {
"web": ["www.test"],
"db" : ["db.test"]
}
@task
def env_production():
u'''Paramètres de production'''
env.roledefs = {
"web": ["www01","www02"],
"db" : ["db01"]
}
Cependant, il est un peu redondant, j'ai donc essayé de le générer automatiquement à partir de YAML.
env.yaml
test:
roledefs:
web: [www.test]
db: [db.test]
production:
roledefs:
web: [www01, www02]
db: [db01]
Définissez un assistant qui lit les données et crée des tâches comme celle-ci. (Référence: 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'''Créer une tâche d'environnement d'exécution à partir d'un fichier yaml'''
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'''Définition de la tâche de l'environnement d'exécution'''
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)
Lire et utiliser avec 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())
Notez que la tâche ne peut être utilisée que si globals ()
est passé du fabfile.
TODO
--Gestion des exceptions --Autoriser la définition de nom_tâche et de description_tâche pour plus de lisibilité. ―― Y a-t-il une clé qui ne devrait pas être utilisée dans ʻenv`? (Cependant, il peut être écrit par la méthode ci-dessus)
Recommended Posts