Ansible-Tags können verwendet werden, um nur eine Teilmenge von Aufgaben / Rollen auszuführen. Dies bedeutet, dass standardmäßig alle Aufgaben ausgeführt werden und wir nur einige Aufgaben daran hindern können, ausgeführt zu werden.
Können wir eine auszuführende Aufgabe nur einschränken , wenn das Tag "foo" angegeben ist? Können wir aktuelle Tags in einem when
Abschnitt einer Aufgabe verwenden?
Antworten:
Ansible 2.5 kommt mit speziellen Tags
never
undalways
. Tagnever
kann genau für diesen Zweck verwendet werden. Z.B:In diesem Beispiel wird die Task nur ausgeführt, wenn das
debug
(odernever
) -Tag explizit angefordert wird. [Verweis auf anible docs]quelle
Dies ist zwar eine Umgehungslösung, funktioniert aber.
Registrieren Sie in der Aufgabenliste eine Variable, wenn die normale Ausführung ausgeführt wird. Fügen Sie dann eine when-Bedingung hinzu, die diese Variable zur markierten Aufgabe prüft.
quelle
untagged
, um dies zu erreichen:- set_fact: untagged_run=true
tags: untagged
Ich habe nicht genug Reputation, um die Antwort, die die Verwendung von Befehlszeilenvariablen (
--extra-vars
) vorschlägt, zu verbessern oder zu kommentieren , aber ich muss Folgendes hinzufügen:Sie können Spielfehler verhindern,
--extra-vars
wenn keine Definition vorliegt, indem Sie einen Standardwert im Playbook selbst definieren:Das Überschreiben von Via
--extra-vars
funktioniert weiterhin, da in der Befehlszeile definierte Variablen Vorrang vor allen anderen Definitionen haben.Das Ergebnis ist, dass die Wiedergabe ohne Fehler ausgeführt wird, wenn
thorough
intrue
der Befehlszeile nicht auf geändert wird.quelle
thorough | default('no') | bool
.when: thorough is defined and thorough
wenn Sie diese Syntax bevorzugenis defined and
Syntax mehr. Mehr als die vielen Pfeifen, die ich nicht fühle, sind intuitiv.Sie können Conditionals verwenden , um sich vor versehentlich ausgeführten Aufgaben zu schützen, die andernfalls ausgeführt würden, wenn Sie kein Tag angeben. Die Einschränkung bei dieser Methode besteht darin, dass die Wiedergabe fehlerhaft ist und fehlschlägt, wenn Sie diese zusätzliche Variable nicht definieren.
Mit dem Argument extra-vars können Sie die Ausführung Ihrer Bedingung auslösen.
Aus ansible-playbook --help:
Beispiel:
test.yaml:
quelle
thorough | default("false") | match("true")
. Standard muss nicht seinfalse
, nur alles, was nicht passttrue
, aber es verbessert die Lesbarkeit.Das Überprüfen der Variablen 'tags' funktioniert in Ansible 2.1.1.0 nicht. Siehe unten für den Test. Ich habe eine andere Idee, eine Aufgabe nur dann auszuführen, wenn ein Tag definiert ist, und zwar für Ansible 1.9.X und 2.XY:
Wenn Sie das Playbook ohne Tags ausführen, wird die Variable 'foo' auf true und dann auf false gesetzt, sodass nichts ausgeführt wird. Wenn Sie das Tag "bar" hinzufügen, wird nur die erste Einstellung angewendet, sodass die Variable "foo" auf "true" gesetzt wird. Anschließend wird Ihre Aufgabe ausgeführt. Genießen!
Und hier ist der Test zur Variablen 'tags' in Ansible 2.1.1.0:
Hier ist das Spielbuch:
Und hier ist die Ausgabe:
quelle
Ja. Wenn Sie ansible-playbook mit dem
--tags foo
Flag ausführen, wird sichergestellt, dass nur Aufgaben ausgeführt werden, die mit einem Tag versehenfoo
sind. Angenommen, wir haben ein Playbook mit dem Namen example.yml:Laufen:
Stellt sicher, dass nur die YUM-Aufgabe ausgeführt wird.
Tatsächlich müssen Sie also keine Tags im when-Abschnitt verwenden, um eine Aufgabe bedingt auszuführen. Beachten Sie, dass Sie abhängig von der Komplexität Ihrer Playbooks / Rollen möglicherweise eine Kombination aus --tags und --skip-Tags verwenden müssen, um zu steuern, welche Aufgaben ausgeführt werden. Zum Beispiel, wenn eine Einschlussaufgabe als 'foo' markiert ist und eine Aufgabe im enthaltenen Playbook als 'bar' markiert ist und Sie ausgeführt werden
Die interne Aufgabe (nur als "Balken" gekennzeichnet) wird ausgeführt. Um zu vermeiden, dass alle internen Aufgaben ausgeführt werden, die als "Balken" gekennzeichnet sind, müssen Sie den folgenden Befehl ausführen
quelle
ansible-playbook
Optionen verwenden, aber ich glaube, das OP fragt nach einer Möglichkeit, eine Aufgabe mit Anmerkungen zu versehen, damit sie nur ausgeführt wird, wenn demansible-playbook
Befehl explizit ein bestimmtes Tag hinzugefügt wird .Es gibt ein spezielles Tag - "never" , das verhindert, dass eine Aufgabe ausgeführt wird, es sei denn, ein Tag wird speziell angefordert.
quelle
Die when- Klausel kann das Vorhandensein von Tags nicht bewerten. Um dies zu umgehen, verwende ich Variablen und Tags zusammen, um Aufgaben auszuführen, die für dieses Tag / diese Variable spezifisch sind.
Bsp .: Stellen Sie sich ein Spielbuch und ein Inventar vor
Bei diesem Ansatz verwenden Sie das Tag, um nur die Tasks in uninstall.yml auszuwählen. Sie müssen jedoch auch die Variable 'uninstall_links' auf einen Wert setzen, um sie zu aktivieren. Wenn Sie also das Playbook ohne Parameter ausführen, wird standardmäßig die Installationsaufgabe ausgeführt. So deinstallieren, können Sie den Tag ‚uninstall‘ auf Ihrem Textbuch (oder cmdline) festgelegt und muss die Variable gesetzt. Wenn Sie das Tag nicht festlegen, wird alles (installieren und deinstallieren) in dieser Reihenfolge ausgeführt. Dies ist gut, um den gesamten Prozess zu testen.
So führen Sie alles aus (es wird installiert und deinstalliert):
$
ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true"
Wie man nur das 'uninstall'-Tag auf der dev-Gruppe ausführt
$
ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true" -t uninstall
Daher können sich Variablen und Tags auch in den Dateien site.yml / inventory befinden. Auf diese Weise können Sie sich in Ihr SCM einfügen und Ihre Absichten aufzeichnen.
quelle
nootal ist richtig, mein Ansatz funktioniert nicht - ignoriere es :( Ich benutze jetzt "when: myvar is defined" und die Befehlszeilenoption "-e" myvar = X ", um Aufgaben nur auf ausdrücklichen Wunsch auszuführen.
Noch einfacher (zumindest mit ansible 2.1.1.0):
-> wird nur ausgeführt, wenn Tags bereitgestellt wurden UND die Tags "foo" enthalten
quelle
Auf
Ansible 2.3.2.0
, hier ist meine Lösung für das Problem:Es beginnt mit der Einstellung
in_tag
zu ,True
dann gibt es eine ,set_fact
die es zurück setzt ,False
wenn Sie angeben nichttags
ausansible-playbook
.Wenn Sie Tags angeben,
in_tag
bleibt beiTrue
und diefail
Task wird ausgeführt.PS: Sie können die Logik zu beliebigen Aufgaben hinzufügen
PS2: Sie können auch die Logik und den Hardcode für alle Tags erweitern, die Sie haben, und natürlich
set_fact: in_tag_blah=True
in Kombination mittags: ["blah"]
.quelle