Ansible – Tagging Tutorial Teil 12

Mit Tags können wir Plays besser organisieren. Wie das Tagging eingesetzt wird und welche Möglichkeiten du damit hast, zeige ich dir in diesem Teil.

Ansible Logo (Quelle: Von Ansible/Red Hat – Wikipedia)

Tagging

Mit Tags lassen sich Informationen unter einem gemeinsamen Schlagwort organisieren. Besonders bekannt sind die Hashtags, mit denen in den sozialen Medien viele verschiedene Autoren ihre Beiträge unter einem gemeinsamen Begriff auffindbar machen.

Tags im Play verwenden

Zur Demonstration lege ich eine einfache Rolle an

mkdir -p roles/tag-demo/tasks

In tasks liegen drei Plays mit den Namen step1.yml, step2.yml und step3.yml.

- name: Step 1 wird ausgeführt.
  debug:
    msg: "Ausgabe von Step 1"
  tags: step1

Exemplarisch zeige ich hier step1.yml. Die anderen Plays sehen genauso aus nur halt mit anderen Ziffern. Du findest diese im Repo.

Du siehst hier bereits, dass der debug: Task mit dem tag: step1 versehen ist.

Diese Plays werden in der main.yml in der Reihenfolge von oben eingebunden.

- import_tasks: step1.yml
- import_tasks: step2.yml
- import_tasks: step3.yml

Wenig überraschend,bringt das Playbook diese Ausgabe hervor

Die einzelnen Plays werden der Reihe nach ausgeführt.
Die einzelnen Plays werden der Reihe nach ausgeführt.

Für diese Ausführung sind die Tags völlig irrelevant. Wenn wir uns mal mit

ansible-playbook -e="target=localhost" tag_demo.yml --list-tasks

Die Liste der Tasks ausgeben lassen, werden die Tags an jedem Task angezeigt.

Jeder Task wird mit seinem Tag gelistet.
Jeder Task wird mit seinem Tag gelistet.

Tags nutzen

Was bringt und das Tagging jetzt eigentlich? Stell dir vor, step2.yml ist ein sehr lang laufender Task, der bereits ausführlich getestet ist. Um step3.yml zu testen, müsste step2 jedes mal mit laufen und kostet dich viel Zeit.

ansible-playbook -e="target=localhost" tag_demo.yml --skip-tag=step2

Mit diesem Kommando weisen wir ansible-playbook an, alle Tasks, die mit step2 getagged sind, zu überspringen. Bei unserem Demo Playbook ist dies nur step2.

Step 2 wird übersprungen, da er das Tag step2 trägt.
Step 2 wird übersprungen, da er das Tag step2 trägt.

Dies ist natürlich nur sinnvoll, wenn trotzdem alle Voraussetzungen erfüllt sind, dass step3.yml korrekt abgearbeitet werden kann!

Umgekehrt kannst mit den Optionen --tags oder verkürzt -t Nur die Tasks mit einem bestimmten Tag ausführen lassen.

Der Aufruf

ansible-playbook -e="target=localhost" tag_demo.yml -t step3

führt nur die Tasks aus, die das Tag step3 tragen.

Mit dem Parameter -t step3 wird nur step3 ausgeführt, da nur er dieses Tag besitzt.
Mit dem Parameter -t step3 wird nur step3 ausgeführt, da nur er dieses Tag besitzt.

Du kannst auch eine Liste von Tags zur Ausführung übergeben, sie werden einfach durch Kommata getrennt übergeben. In diesem Beispiel werden nur step1 und step2 ausgeführt und step3 ausgelassen.

ansible-playbook -e="target=localhost" tag_demo.yml --tags step1,step2

Du findest unter Umständen manchmal noch den Tipp, mehrere Tags in Anführungszeichen zu setzen. Dies bezieht sich aber vermutlich auf eine ältere Ansible Version. In der Version 2.19.0b6, die ich unter Debian trixie einsetze, ist das nicht mehr nötig.

Beispiellauf des obigen Kommandos mit mehreren Tags im --tags Parameter
Beispiellauf des obigen Kommandos mit mehreren Tags im –tags Parameter

vordefinierte Tags

Ansible stellt mit always und never zwei Standardtags bereit, die genau das tun, was sie ausdrücken. Mit always taggst du Tasks, die immer ausgeführt werden sollen, mit never die, die niemals ausgeführt werden sollen.

Zur Demonstration wird step2 zusätzlich mit always getagged.

- name: Step 2 wird ausgeführt.
  debug:
    msg: "Ausgabe von Step 2"
  tags: 
    - step2
    - always

Wenn ich jetzt nur step3 ausführen will, wird step2 trotzdem ausgeführt, da er ja mit always getagged ist.

Dies ist nützlich, wenn du einen speziellen Task testen willst, der aber von anderen abhängig ist.

bwohl nur step3 ausgeführt werden soll, läuft  step2 auch.
Obwohl nur step3 ausgeführt werden soll, läuft step2 auch.

Zwei weitere vordefinierte Tags sind tagged und untagged. Sie dienen nicht dem Tagging selbst sonder sind mehr für die Aufrufkontrolle gedacht.

Ich erstelle einen weiteren Step step4.yml ohne ein Tag

- name: Step 4 wird ausgeführt.
  debug:
    msg: "Ausgabe von Step 4"

Außerdem entferne ich das always Tag von Step 2 wieder.

Der Aufruf

ansible-playbook -e="target=localhost" tag_demo.yml --tags untagged

Führt jetzt nur die Tasks aus, die kein Tag besitzen.

Mit "--tags untagged" wird nur Step 4 ausgeführt, da er als einziger kein Tag besitzt.
Mit „–tags untagged“ wird nur Step 4 ausgeführt, da er als einziger kein Tag besitzt.

Du ahnst vermutlich schon, dass

ansible-playbook -e="target=localhost" tag_demo.yml --tags tagged

die Umkehrfunktion ist und nur die Tasks ausführt, für die du ein Tag vergeben hast.

Umgekehrt führt  "--tags tagged" wird alle Steps außer 4 aus.
Umgekehrt führt „–tags tagged“ wird alle Steps außer 4 aus.

Tags vererben

Tags müssen nicht direkt an den Task gehängt werden. Bei vielen Tasks in einem Play wird das lästig und unübersichtlich. Stell dir vor, in step4.yml werden mehrere Dutzend Tasks ausgeführt. Die alle mit dem gleichen Tag zu versehen ist mühsam. Noch mehr Arbeit würde es machen, wenn sich der Tagname ändern sollte und Arbeit wollen wir schließlich mit Ansible vermeiden 🙂 Für diesen Zweck können wir das Tag in der main.yml vergeben und alle Tasks in step4.yml erben dies vollautomatisch. Also vergeben wir jetzt in der main.yml das Tag step4 für step4.yml. Dies wird direkt am import_task: Statement verwendet.

- import_tasks: step1.yml
- import_tasks: step2.yml
- import_tasks: step3.yml
- import_tasks: step4.yml
  tags: step4

Dieses Tag gilt jetzt für alle Task innerhalb von step4.yml. Dies prüfen wir nach, in dem wir uns die Tasks anzeigen lassen.

ansible-playbook -e="target=localhost" tag_demo.yml --list-tasks
ie Liste der Tasks zeigt jetzt step4 als Tag für Step4 an.
Die Liste der Tasks zeigt jetzt step4 als Tag für Step4 an.

Fazit

Tags sind sehr nützlich, um Tasks zu kategorisieren und die Ablaufkontrolle innerhalb eines Playbook zu steuern.

Natürlich sind alle Dateien im Git Repository verfügbar.

Schreibe einen Kommentar

Insert math as
Block
Inline
Additional settings
Formula color
Text color
#333333
Type math using LaTeX
Preview
\({}\)
Nothing to preview
Insert
Creative Commons License
Except where otherwise noted, the content on this site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
raspithek.de - Olli Graf
WordPress Cookie Hinweis von Real Cookie Banner