Ansible: Überprüfen Sie, ob die bereitgestellten Tags gültig sind, bevor Sie ein Playbook ausführen

Ansible: Überprüfen Sie, ob die bereitgestellten Tags gültig sind, bevor Sie ein Playbook ausführen

Ich vermute, dass dies ein zu cleverer Versuch ist (und scheitert), aber insbesondere bei der Entwicklung eines PB ist es wirklich nützlich, Tags zu verwenden, um die ausgeführten Rollen zu begrenzen. So haben wir beispielsweise: (Ausschnitt aus dem Playbook) ...

 - { role: yum,      tags: [ 'yum' ] }
 - { role: proxy,    tags: [ 'proxy' ]  }
 - { role: firewall, tags: [ 'firewall' ] }

Jetzt laufe ich gelegentlich mit einem falsch geschriebenen Tag - zB

$ ansible-playbook servername, user=fred  my_playbook --tags=firewal

Und es werden Pre-Tasks ausgeführt, ebenso wie Post-Tasks, wodurch es so aussieht, als ob etwas passiert, aber natürlich passt keine Task zum falsch eingegebenen Tag. Ich erkenne das in der Protokollierung (jede Rolle macht das:

- include_tasks: includes/log_role_completion.yml this_role={{ role_name }}

was zu Folgendem führt:

- name: "Setup completed_roles list"
  set_fact:
    completed_roles: "{{ this_role }}"
  changed_when: false
  when: completed_roles is not defined

- name: "Add role to list of completed roles"
  set_fact:
    completed_roles: "{{ completed_roles }} {{ this_role }}"
  changed_when: false
  when: completed_roles != this_role

Anschließend schreibt eine Post_Tasks-Rolle die Liste der abgeschlossenen Rollen – oder eine Meldung, dass möglicherweise aufgrund eines falsch geschriebenen Tags keine ausgeführt wurden. Das funktioniert gut – und ich weiß, dass Ansible Protokolle schreibt, aber diese sind entweder ausführlich oder kryptisch, und ich möchte /var/log/ansible auf dem Ziel mit etwas wie dem Folgenden haben:

Ansible version 2.6.2 run commenced at 2018-08-31: 20:23:40 GMT using account vmw-user
Ansible version 2.6.2 run completed at 2018-08-31: 20:23:40 GMT for roles chrony, proxy, and log_complete

Das ist wirklich nützlich, ABER (und hier ist abschließend die Frage) ich möchte lieber, dass das Playbook prüft, ob ein Tag angegeben wird, der mit keinem im Playbook verwendeten Tag übereinstimmt, und anhält – und mich so warnt, dass ich etwas falsch geschrieben habe. Dadurch würde auch verhindert, dass ein Playbook unvollständig ausgeführt wird – die Rolle mit dem falsch geschriebenen Tag würde überhaupt nicht ausgeführt, was ein Problem verursachen könnte.

Die Variable vars.ansible_run_tags enthält die vom Benutzer bereitgestellten Tags: Gibt es eine Möglichkeit zu sehen, welche Tags in einem Playbook festgelegt sind? Ich möchte nicht zuerst im Prüfmodus ausführen und die Ausgabe manuell analysieren – ich möchte, dass dies automatisch erfolgt.

Antwort1

IMHO gibt es keine solche Variable, um "zu sehen, welche Tags in einem Playbook gesetzt sind". Es gibt nuransible_run_tagsUndansible_skip_tags. Ich fürchte, die einzige Möglichkeit wäre, einen Ansible-Playbook-Wrapper zu schreiben, um zu prüfen, ob die bereitgestellten Tags im Playbook vorhanden sind („zuerst im Prüfmodus ausführen und die Ausgabe manuell analysieren“).

Übrigens. Unten finden Sie eine vereinfachte Liste der abgeschlossenen Rollen

completed_roles: "{{ completed_roles|default('') }} {{ this_role }}"

Um zu vermeiden, dass „Vorabaufgaben ausgeführt werden, genau wie Nachabaufgaben, wodurch der Eindruck entsteht, dass etwas passiert“, möchten Sie möglicherweise Folgendes verwenden:ImportrollenUndWannBedingung statt Tags. Unten sehen Sie ein Beispiel, bei dem role3.yml und role4.yml nur eine Nachricht drucken.

abspielen.yml

- hosts:
    - localhost
  tasks:
    - import_role: name=role3
      when: selector|default('') in [ 'role3', 'all_roles' ]
    - import_role: name=role4
      when: selector|default('') in [ 'role4', 'all_roles' ]

.

> ansible-playbook -e selector=role4 play.yml | grep msg
    "msg": "role4"

.

> ansible-playbook -e selector=all_roles play.yml | grep msg
    "msg": "role3"
    "msg": "role4"

verwandte Informationen