[PYTHON] Definieren Sie eine Aufgabe zum Festlegen der Fabric-Umgebung in YAML

Aufgaben zur Umgebungsdefinition

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.

YAML-Version

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

Definieren Sie eine Aufgabe zum Festlegen der Fabric-Umgebung in YAML
Ich möchte einen Lebenszyklus in der Aufgabendefinition von ECS festlegen
Wenn Sie den Ausführungsbenutzer mitten in einer Fabric-Aufgabe wechseln möchten, stellen Sie den Kontextmanager ein
Legen Sie eine feste IP in der Linux-Umgebung fest
Der einfachste Weg, um Last-Modified in Flask einzurichten
Registrieren Sie zum ersten Mal eine Aufgabe in cron
Setzen Sie DateField des Formulars in Django auf type = date
So legen Sie einen freigegebenen Ordner mit dem Host-Betriebssystem in CentOS7 auf Virtual BOX fest
Suchen Sie eine Richtlinie für die Anzahl der Prozesse / Threads, die auf dem Anwendungsserver festgelegt werden sollen
Stellen Sie env.hosts dynamisch mit Stoff ein
Ein Memorandum zur Registrierung der in Hy in PyPI geschriebenen Bibliothek
Verwendung der Methode __call__ in der Python-Klasse
Ändern Sie das Standardausgabeziel in eine Datei in Python
So definieren Sie mehrere Variablen in einer Python for-Anweisung
So legen Sie das HTML-Klassenattribut in Djangos forms.py fest
Kombinieren Sie Listen zu einem DataFrame mit Pandas
So generieren Sie eine Abfrage mit dem IN-Operator in Django
So erhalten Sie den letzten (letzten) Wert in einer Liste in Python
Geben Sie die in S3 Bucket enthaltene Schlüsselliste in eine Datei aus
So stellen Sie die Ausgabeauflösung für jeden Keyframe in Blender ein
[sh] Das Speichern der Befehlsausführung führt zu Variablen
So bestimmen Sie die Existenz eines Selenelements in Python
So erhalten Sie alle möglichen Werte in einem regulären Ausdruck
So überprüfen Sie die Speichergröße einer Variablen in Python
Benachrichtigen Sie den Inhalt der Aufgabe vor und nach der Ausführung der Aufgabe mit Fabric
[Einführung in Python] Wie verwende ich den Operator in in der for-Anweisung?
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
[Python3] Definition eines Dekorators, der die Ausführungszeit einer Funktion misst
So ermitteln Sie die Scheitelpunktkoordinaten eines Features in ArcPy
Erstellen Sie eine Funktion, um den Inhalt der Datenbank in Go abzurufen
Finden Sie alle Muster, um eine bestimmte Zahl aus dem Satz zu extrahieren
Ich habe den Befehl gegeben, einen farbenfrohen Kalender im Terminal anzuzeigen
Programmieren, um in der Welt zu kämpfen ~ 5-1
Programmierung, um in der Welt zu kämpfen ~ 5-5,5-6
Programmieren, um in der Welt zu kämpfen 5-3
Programmierung für den Kampf in der Welt - Kapitel 4
Im Python-Befehl zeigt Python auf Python3.8
Übergeben Sie Argumente in discord.py an Task
Probieren Sie Cython in kürzester Zeit aus
Programmieren, um in der Welt zu kämpfen ~ 5-2
[Python] Ich habe versucht, den kollektiven Typ (Satz) auf leicht verständliche Weise zusammenzufassen.
[Python] Was ist ein formales Argument? So stellen Sie den Anfangswert ein
So geben Sie eine .ui-Datei in der Dialog- / Widget-GUI in PySide an
[Linux] Ein Befehl zum Abrufen einer Liste der in der Vergangenheit ausgeführten Befehle
Ich möchte eine Liste in der Reihenfolge anderer Listen sortieren
Es wurde eine Funktion hinzugefügt, um gewünschte Verschiebungen in der Django-Verschiebungstabelle zu registrieren
[Entwicklungsumgebung] So erstellen Sie einen Datensatz in der Nähe der Produktionsdatenbank
Verwenden Sie eine Verknüpfung, um das Touchpad in Linux Mint zu aktivieren oder zu deaktivieren
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
Sortieren durch Angabe einer Spalte im Python Numpy-Array.
Ich möchte in der Einschlussnotation drucken
Dynamisches Definieren von Variablen in Python
Schreiben Sie den Test in die Python-Dokumentzeichenfolge
Stellen Sie die Zeitzone auf japanische Standardzeit ein
Geben Sie der Registerkarte ipywidgets einen Titel