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.

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/tasksIn 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

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-tasksDie Liste der Tasks ausgeben lassen, werden die Tags an jedem Task angezeigt.

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=step2Mit diesem Kommando weisen wir ansible-playbook an, alle Tasks, die mit step2 getagged sind, zu überspringen. Bei unserem Demo Playbook ist dies nur step2.

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 step3führt nur die Tasks aus, die das Tag step3 tragen.

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,step2Du 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.

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.

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 untaggedFührt jetzt nur die Tasks aus, die kein Tag besitzen.

Du ahnst vermutlich schon, dass
ansible-playbook -e="target=localhost" tag_demo.yml --tags taggeddie Umkehrfunktion ist und nur die Tasks ausführt, für die du ein Tag vergeben hast.

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
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.