Ich verwende Ansible für einige einfache Benutzerverwaltungsaufgaben mit einer kleinen Gruppe von Computern. Derzeit habe ich meine Playbooks eingestellt hosts: all
und meine Hosts-Datei ist nur eine einzelne Gruppe mit allen aufgelisteten Computern:
# file: hosts
[office]
imac-1.local
imac-2.local
imac-3.local
Ich musste häufig auf eine einzelne Maschine zielen. Der ansible-playbook
Befehl kann Spiele wie folgt einschränken:
ansible-playbook --limit imac-2.local user.yml
Aber das scheint etwas fragil zu sein, besonders für ein potenziell zerstörerisches Spielbuch. Wenn Sie die limit
Flagge weglassen, wird das Spielbuch überall ausgeführt. Da diese Tools nur gelegentlich verwendet werden, lohnt es sich, Schritte zur narrensicheren Wiedergabe zu unternehmen, damit wir in Monaten nicht versehentlich etwas zerstören.
Gibt es eine bewährte Methode zum Beschränken von Playbook-Läufen auf einen einzelnen Computer? Idealerweise sollten die Spielbücher harmlos sein, wenn einige wichtige Details weggelassen wurden.
quelle
--limit office[0]
'{{ target }}'
- gemäß docs.ansible.com/…run_once
kann immer noch destruktiv sein, daher ist dies keine so gute Idee.-e
ist das Äquivalent von--extra-vars
hosts: "{{ target | default('no_hosts')}}"
Es gibt auch einen niedlichen kleinen Trick, mit dem Sie einen einzelnen Host in der Befehlszeile (oder mehrere Hosts, denke ich) ohne Zwischeninventar angeben können:
Beachten Sie das Komma ( , ) am Ende; Dies signalisiert, dass es sich um eine Liste handelt, nicht um eine Datei.
Dies schützt Sie nicht, wenn Sie versehentlich eine echte Inventardatei übergeben. Daher ist dies möglicherweise keine gute Lösung für dieses spezielle Problem. Aber es ist ein praktischer Trick zu wissen!
quelle
skipping: no hosts matched
. Vielleicht funktioniert dieser Trick nicht mehr, seit er--limit
funktioniert?$ ansible-playbook -kK --limit=myhost1 myplaybook.yml
. Siehe Marwans Antwort.all
in den Spielen eingestellt sein müssen - es hat eine Weile gedauert, bis ich herausgefunden habe ...Dieser Ansatz wird beendet, wenn mehr als ein Host bereitgestellt wird, indem die Variable play_hosts überprüft wird. Das Fail-Modul wird zum Beenden verwendet, wenn die Bedingung für einen einzelnen Host nicht erfüllt ist. In den folgenden Beispielen wird eine Hosts-Datei mit zwei Hosts, Alice und Bob, verwendet.
user.yml (Spielbuch)
Führen Sie das Playbook ohne Hostfilter aus
Führen Sie das Playbook auf einem einzelnen Host aus
quelle
--limit
ist der Weg zu gehenplay_hosts
ist in Ansible 2.2 veraltet und ersetzt durchansible_play_hosts
.--limit
Sie können auf einem Host ausführen, ohne dies zu benötigenwhen: inventory_hostname == ansible_play_hosts[0]
.[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: {{ play_hosts|length }} == ''
auf Ansible 2.8.4.Es gibt meiner Meinung nach einen bequemeren Weg. Sie können den Benutzer tatsächlich interaktiv zur Eingabe der Maschine (n) auffordern, auf die er das Playbook anwenden möchte, dank
vars_prompt
:quelle
--extra-vars
und eine normale Var in Ihrem Spielbuch…{{ hosts }}
ausgewertet zu werden, bevor der Wert eingegeben wird - oder gibt es einen speziellen Trick?Um die Antwort von Joemailer zu erweitern: Wenn Sie die Möglichkeit haben möchten, mit Mustern übereinzustimmen, um mit einer beliebigen Teilmenge von Remotecomputern übereinzustimmen (genau wie der
ansible
Befehl), es aber dennoch sehr schwierig machen möchten, das Playbook versehentlich auf allen Computern auszuführen, ist dies der Fall was ich mir ausgedacht habe:Gleiches Spielbuch wie in der anderen Antwort:
Lassen Sie uns die folgenden Hosts haben:
Um den Befehl auf allen Geräten auszuführen, müssen Sie die Zielvariable explizit auf "all" setzen.
Und um es auf ein bestimmtes Muster zu beschränken, können Sie festlegen
target=pattern_here
Alternativ können Sie
target=all
das--limit
Argument verlassen und anhängen , z.dh.
ansible-playbook user.yml --extra-vars "target=all" --limit imac-1* --list-hosts
was in ... endet:
quelle
Ich verstehe wirklich nicht, wie kompliziert alle Antworten sind. Der Weg dazu ist einfach:
In diesem
check
Modus können Sie im Trockenlaufmodus arbeiten, ohne Änderungen vorzunehmen.quelle
--check
Ich denke, dies ist in Bezug auf die Dokumentation immer noch nützlich Diese Frage kann sehr googlable seinAWS-Benutzer, die das externe EC2-Inventarskript verwenden, können einfach nach Instanz-ID filtern:
Dies funktioniert, weil das Inventarskript Standardgruppen erstellt .
quelle
Wir haben einige generische Spielbücher, die von einer großen Anzahl von Teams verwendet werden können. Wir haben auch umgebungsspezifische Inventardateien, die mehrere Gruppendeklarationen enthalten.
Um jemanden, der ein Spielbuch aufruft, zu zwingen, eine Gruppe anzugeben, gegen die ausgeführt werden soll, setzen wir einen Dummy-Eintrag oben im Spielbuch:
Als ersten Schritt nehmen wir dann die folgende Prüfung in das freigegebene Spielbuch auf:
Wenn der Dummy-Server in der Liste der Hosts angezeigt wird, für die dieses Playbook ausgeführt werden soll (ansible_play_batch), hat der Aufrufer keine Gruppe angegeben und die Ausführung des Playbooks schlägt fehl.
quelle
ansible_play_batch
listet nur den aktuellen Stapel auf, daher ist dies bei Verwendung des Stapels immer noch unsicher. Es ist besser,ansible_play_hosts
stattdessen zu verwenden .Seit Version 1.7 hat ansible die Option run_once . Der Abschnitt enthält auch einige Erläuterungen zu verschiedenen anderen Techniken.
quelle
Dies zeigt, wie die Playbooks auf dem Zielserver selbst ausgeführt werden.
Dies ist etwas schwieriger, wenn Sie eine lokale Verbindung verwenden möchten. Dies sollte jedoch in Ordnung sein, wenn Sie eine Variable für die Hosts-Einstellung verwenden und in der Hosts-Datei einen speziellen Eintrag für localhost erstellen.
In (allen) Playbooks müssen die Hosts: line auf:
Fügen Sie in der Datei mit den Inventarhosts einen Eintrag für den lokalen Host hinzu, der die Verbindung auf lokal festlegt:
Führen Sie dann in der Befehlszeile Befehle aus, die das Ziel explizit festlegen - zum Beispiel:
Dies funktioniert auch bei Verwendung von Ansible-Pull:
Wenn Sie vergessen, die Variable in der Befehlszeile festzulegen, wird der Befehl sicher fehlerhaft (solange Sie keine Hostgruppe mit dem Namen 'no_hosts' erstellt haben!) Mit der Warnung:
Und wie oben erwähnt, können Sie einen einzelnen Computer (solange er sich in Ihrer Hosts-Datei befindet) mit folgenden Zielen anvisieren:
oder eine Gruppe mit so etwas wie:
quelle
Ich habe ein Wrapper-Skript namens Provision, das Sie zwingt, das Ziel auszuwählen, damit ich es nicht anderswo behandeln muss.
Für diejenigen, die neugierig sind, verwende ich ENV-Variablen für Optionen, die meine Vagrant-Datei verwendet (Hinzufügen des entsprechenden Ansible-Args für Cloud-Systeme), und lasse den Rest der Ansible-Args durch. Wenn ich mehr als 10 Server gleichzeitig erstelle und bereitstelle, füge ich einen automatischen Wiederholungsversuch auf ausgefallenen Servern hinzu (solange Fortschritte erzielt werden - ich habe festgestellt, dass beim Erstellen von etwa 100 Servern gleichzeitig häufig einige beim ersten Mal ausfallen ).
quelle
Eine etwas andere Lösung besteht darin, die spezielle Variable zu verwenden,
ansible_limit
die den Inhalt der--limit
CLI-Option für die aktuelle Ausführung von Ansible darstellt.Hier muss keine zusätzliche Variable definiert werden. Führen Sie einfach das Playbook mit dem
--limit
Flag aus.quelle