
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