[PYTHON] Définir une tâche pour définir l'environnement de fabric dans YAML

Tâches pour la définition de l'environnement

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.

Version 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

Définir une tâche pour définir l'environnement de fabric dans YAML
Je souhaite définir un cycle de vie dans la définition de tâche d'ECS
Si vous souhaitez changer d'utilisateur d'exécution au milieu d'une tâche Fabric, le gestionnaire de contexte des paramètres
Définir une adresse IP fixe dans l'environnement Linux
Le moyen le plus simple de configurer Last-Modified dans Flask
Enregistrer une tâche dans cron pour la première fois
Définissez DateField du formulaire sur type = date dans Django
Comment définir un dossier partagé avec le système d'exploitation hôte dans CentOS7 sur Virtual BOX
Trouvez une ligne directrice pour le nombre de processus / threads à définir sur le serveur d'applications
Définir dynamiquement des hôtes d'environnement avec Fabric
Un mémorandum pour enregistrer la bibliothèque écrit en Hy dans PyPI
Comment utiliser la méthode __call__ dans la classe Python
Changer la destination de sortie standard en un fichier en Python
Comment définir plusieurs variables dans une instruction Python for
Comment définir l'attribut de classe html dans le formulaire forms.py de Django
Combinez des listes dans un DataFrame avec des pandas
Comment générer une requête à l'aide de l'opérateur IN dans Django
Comment obtenir la dernière (dernière) valeur d'une liste en Python
Exporter la liste de clés incluse dans S3 Bucket dans un fichier
Comment définir la résolution de sortie pour chaque image clé dans Blender
[sh] Comment stocker les résultats de l'exécution de la commande dans des variables
Comment déterminer l'existence d'un élément sélénium en Python
Comment obtenir toutes les valeurs possibles dans une expression régulière
Comment vérifier la taille de la mémoire d'une variable en Python
Notifier le contenu de la tâche avant et après l'exécution de la tâche avec Fabric
[Introduction à Python] Comment utiliser l'opérateur in dans l'instruction for?
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
[Python3] Définition d'un décorateur qui mesure le temps d'exécution d'une fonction
Comment obtenir les coordonnées de sommet d'une entité dans ArcPy
Créez une fonction pour obtenir le contenu de la base de données dans Go
Trouvez tous les modèles pour extraire un nombre spécifique de l'ensemble
J'ai fait une commande pour afficher un calendrier coloré dans le terminal
Programmation pour combattre dans le monde ~ 5-1
Programmation pour combattre dans le monde ~ 5-5,5-6
Programmer pour combattre dans le monde 5-3
Programmation pour combattre dans le monde - Chapitre 4
Dans la commande python, python pointe vers python3.8
Transmettez des arguments à Task dans discord.py
Essayez Cython dans les plus brefs délais
Programmation pour combattre dans le monde ~ 5-2
[Python] J'ai essayé de résumer le type collectif (ensemble) d'une manière facile à comprendre.
[Python] Qu'est-ce qu'un argument formel? Comment définir la valeur initiale
Comment spécifier un fichier .ui dans la boîte de dialogue / interface graphique du widget dans PySide
[Linux] Une commande pour obtenir une liste des commandes exécutées dans le passé
Je souhaite trier une liste dans l'ordre des autres listes
Ajout d'une fonction pour enregistrer les décalages souhaités dans la table des décalages Django
[Environnement de développement] Comment créer un ensemble de données proche de la base de données de production
Utilisez un raccourci pour activer ou désactiver le pavé tactile dans Linux Mint
J'ai fait un programme pour vérifier la taille d'un fichier avec Python
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
Comment trier en spécifiant une colonne dans le tableau Python Numpy.
Je veux imprimer dans la notation d'inclusion
Comment définir dynamiquement des variables en Python
Ecrire le test dans la docstring python
Définir le fuseau horaire sur l'heure standard japonaise
Donner un titre à l'onglet ipywidgets