Fabric: So definieren Sie komplexe Umgebungshosts

Fabric: So definieren Sie komplexe Umgebungshosts

ich arbeite an Fabric für meine Bereitstellungstools und verteile den Befehl auch auf mehrere Hosts. aber ich weiß nicht, wie ich in meiner fabfile.py komplexe Hosts definieren kann

Beispiel: Ich habe 4 Server. ServerA, ServerB, ServerC, ServerD

def prod():
    env.hosts = ["serverA', "serverB" ]

def dev():
    env.hosts = ["serverC' "serverD"]

def all():
    prod()
    dev()

ist es mir möglich, einen Befehl auf allen Hosts auszuführen, ohne ihn erneut zu definieren?

EX: fab all {command}

Antwort1

Sie könnten einen Blick auf die Definition werfenRollenfür Ihre Umgebung.

from fabric.api import env, run
from fabric.decorators import task

env.roledefs = {
    'prod': ['ServerA', 'ServerB'],
    'dev': ['ServerC', 'ServerD'],
    'envC': ['ServerE', 'ServerF']
}

env.roledefs['all'] = [h for r in env.roledefs.values() for h in r]


@task
def hostname():
    run('hostname -f')

Dies würde bedeuten, dass Sie Ihre Fabric-Aufrufe jetzt folgendermaßen ausgeben müssen:

fab -R prod hostname
fab -R dev hostname
fab -R all hostname
fab -R dev,envC hostname

Antwort2

Eine alternative Lösung für etwas Dynamischeres … keine statische Konfiguration in der Fabfile, mit Bash.

mfab() {
    hosts=()
    while [ "$#" != 0 ]; do
        if [ "$1" = -- ]; then
            shift
            break
        fi
        hosts+=("$1")
        shift
    done

    list=$(echo "${hosts[@]}" | tr ' ' ',')
    fab -H "$list" "$@"
}

So können Sie einen Probelauf durchführen: Führen Sie dies vor Ihren Tests aus:

fab() { echo fab "$@"; }

Beispiel 1: Liste beliebiger Größe mit Shell-Erweiterungen/Globbinb/was auch immer Sie verwenden möchten

mfab node{A..D}{01..05} -- example_command

führt einen Befehl wie den folgenden aus:

fab -H nodeA01,nodeA02,nodeA03,nodeA04,nodeA05,nodeB01,nodeB02,nodeB03,nodeB04,nodeB05,nodeC01,nodeC02,nodeC03,nodeC04,nodeC05,nodeD01,nodeD02,nodeD03,nodeD04,nodeD05 example_command

Beispiel 2: Ich habe gerade 7 neue Maschinen eingesetzt und jede zweite ist kaputt und ich möchte einen Befehl ausführen, um das zu überprüfen/reparieren.

mfab node{100..106..2} -- example_command

führt einen Befehl wie den folgenden aus:

fab -H node100,node102,node104,node106 example_command

Beispiel 3: Weitere Optionen, einschließlich --der vom Stoff selbst verwendeten:

mfab node{01..10} -- -P -- uname -a

verwandte Informationen