Frage Ansible: Task nur ausführen, wenn ein Tag angegeben ist


Ansible-Tags kann verwendet werden, um nur eine Teilmenge von Aufgaben / Rollen auszuführen. Dies bedeutet, dass standardmäßig alle Aufgaben ausgeführt werden und nur einige Aufgaben ausgeführt werden können.

Können wir eine zu erfüllende Aufgabe einschränken? nur Wann wird das "foo" -Tag angegeben? Können wir aktuelle Tags verwenden? when Abschnitt einer Aufgabe?


57
2017-08-24 10:08


Ursprung


es klingt wie das, was Sie brauchen, ist eine Aufgabe Einstellung wie limit_to_tags: foo, die nicht existiert und ich glaube nicht, dass das im Moment möglich ist. Eine zukünftige Implementierung muss auch einen Plan haben, ob diese Tags miteinander verknüpft werden sollen. - dgh
Sehen Sie sich meine Antwort in "Ansible - Default / Explicit Tags" an stackoverflow.com/questions/28789912/... - sirkubax


Antworten:


Obwohl dies eine umständliche Lösung ist, funktioniert es.

Innerhalb der Aufgabenliste registrieren Sie eine Variable, wenn die normale Ausführung ausgeführt wird. Fügen Sie dann eine when-Bedingung hinzu, die diese Variable für die getaggte Task überprüft.

- shell: /bin/true
  register: normal_task_list

- name: Only run when tag is specified
  shell: /bin/echo "Only running because of specified tag"
  when: normal_task_list is not defined
  tags: specified

20
2018-01-13 16:25



wirklich gute Idee - perigee
Sie können auch verwenden untagged um das zu erreichen: - set_fact: untagged_run=true  tags: untagged - Pyzo
Kannst du etwas mehr darüber erklären? Ein Beispiel aus der Praxis? - Quintin Par


Ich habe nicht genug Reputation, um die Antwort zu verbessern oder zu kommentieren, die die Verwendung von Befehlszeilenvariablen vorschlägt (--extra-vars), aber ich muss das hinzufügen:

Der Nachteil dieser Methode ist, dass die Wiedergabe fehlerhaft ist und fehlschlägt, wenn Sie diese zusätzliche Variable nicht definieren.

Sie können Spielausfall in Abwesenheit von verhindern --extra-vars Definition durch Definition eines Vorgabewertes im Playbook selbst:

---
- hosts: ...
# ↓↓↓
  vars:
    thorough: false
# ↑↑↑
  tasks:
  - name: apt - install nfs-common only when thorough is true
    when: thorough | bool
    apt:
      cache_valid_time: 86400
      force: yes
      pkg:
        - nfs-common

Überschreiben über --extra-vars funktioniert weiterhin, weil in der Befehlszeile definierte Variablen Vorrang vor allen anderen Definitionen haben.

Das Ergebnis ist, dass das Spiel ohne Fehler ausgeführt wird thorough wird nicht geändert in true in der Befehlszeile.


17
2018-05-08 01:17



Das Gleiche kann unter Verwendung von erreicht werden thorough | default('no') | bool. - Costi Ciudatu
Oder when: thorough is defined and thorough wenn Sie diese Syntax bevorzugen - KCD
Danke, liebe die is defined and Syntax mehr. mehr als die mehreren Rohre, die ich nicht fühle, sind intuitiv. - Elijah Lynn


Ansible 2.5 kommt mit speziellen Tags never und always. Etikett never kann genau für diesen Zweck verwendet werden. Z.B:

tasks:
  - debug: msg='{{ showmevar}}'
    tags: [ 'never', 'debug' ]

In diesem Beispiel wird die Aufgabe nur ausgeführt, wenn debug (oder never) tag wird explizit angefordert. [Hinweis auf ansible Dokumente]


10
2018-04-12 10:58





Sie können verwenden Bedingungen zum Schutz vor versehentlich ausgeführten Tasks, die andernfalls ausgeführt würden, wenn Sie kein Tag angeben. Der Nachteil dieser Methode ist, 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:

 -e EXTRA_VARS, --extra-vars=EXTRA_VARS
    set additional variables as key=value or YAML/JSON

Beispiel:

ansible-playbook test.yaml -e "thorough=true"

test.yaml:

...
- name: apt - install nfs-common only when thorough is true
  apt:
    cache_valid_time: 86400
    force: yes
    pkg:
    - nfs-common
  when: thorough | match("true")
...

9
2018-03-12 20:51



Um einen Fehler zu vermeiden, wenn Sie nicht "gründlich" definieren, verwenden Sie einfach thorough | default("false") | match("true"). Standard muss nicht sein false, einfach alles, was nicht zusammenpasst true, aber es verbessert die Lesbarkeit. - Tom Wilson


Ja. Ansible-Playbook mit dem --tags foo Flag stellt sicher, dass nur mit getaggte Aufgaben foo werden ausgeführt. Angenommen, wir haben ein Playbook namens beispiel.yml:

tasks:

  - yum: name={{ item }} state=installed
    with_items:
       - httpd
       - memcached
    tags:
       - packages

  - name: some other task
    ..
    tags:
      - some other tag

Laufen:

ansible-playbook example.yml --tags "packages"

Stellt sicher, dass nur die yum-Task ausgeführt wird.

Eigentlich müssen Sie Tags nicht wirklich verwenden, wenn der Abschnitt eine Aufgabe bedingt ausführen soll. 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 ein Include-Task als 'foo' markiert ist und ein Task innerhalb des mitgelieferten Playbooks als 'bar' markiert ist und Sie laufen

ansible-playbook --tags "foo"

Die interne Aufgabe (nur als 'bar' getaggt) wird ausgeführt. Um die Ausführung aller internen Aufgaben, die als 'bar' gekennzeichnet sind, zu vermeiden, müssen Sie den folgenden Befehl ausführen

ansible-playbook --tags foo --skip-tags bar

3
2017-08-24 16:49



Das ist nicht wahr: "Das Angeben eines Tags für einen Task bedeutet, dass diese Task nur ausgeführt wird, wenn dieses Tag explizit an den Befehl ansible-playbook übergeben wird." - gimboland
Abgesagte Aussage ist nicht wahr. - Chris
Du hast Recht. Ich habe es neu formuliert. Vielen Dank! - Shahar
Ja, Sie können das Verhalten erreichen, indem Sie sicherstellen, dass Sie immer das Recht verwenden ansible-playbook Optionen, aber ich denke, das OP fragt nach einer Möglichkeit, eine Aufgabe mit Anmerkungen zu versehen, so dass sie nicht ausgeführt wird, es sei denn, ein bestimmtes Tag wird explizit in der ansible-playbook Befehl. - dgh
Ja, das beantwortet nicht die Frage des OP. - Allen Luce


Das Überprüfen der Variable 'Tags' funktioniert in Ansible 2.1.1.0 nicht. Siehe unten für den Test. Ich habe eine andere Idee, Task nur auszuführen, wenn ein Tag definiert ist, das sowohl für Ansible 1.9.X als auch für 2.X.Y funktioniert:

- set_fact: foo=true
  tags: bar
- set_fact: foo=false
- name: do something when 'bar' tag is defined
  debug: var=foo
  when: foo
  tags: bar

Wenn Sie also das Playbook ohne Tag 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" true ist und Ihre Aufgabe ausgeführt wird. Genießen!


Und hier ist der Test über die Variable 'Tags' in Ansible 2.1.1.0:

Hier ist das Spielbuch:

- hosts: localhost
  connection: local
  tasks:
    - name: display tags variable
      debug: var=tags
      tags: foo

    - name: do something only when tag 'foo' is provided
      debug: var=tag
      when: tags is defined
      tags: foo

Und hier ist die Ausgabe:

$ ansible-playbook --version ; ansible-playbook ./test.yml -t foo
ansible-playbook 2.1.1.0
  config file = /home/nootal/projects/ivy/src/ansible/ansible.cfg
  configured module search path = Default w/o overrides

PLAY [localhost] ***************************************************************

TASK [display tags variable] ***************************************************
ok: [localhost] => {
    "tags": "VARIABLE IS NOT DEFINED!"
}

TASK [do something only when tag 'foo' is provided] ****************************

PLAY RECAP *********************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0   

2
2017-09-29 07:30





wann Klausel kann das Vorhandensein von Tags nicht auswerten. Zur Umgehung verwende ich Variablen und Tags, um Aufgaben auszuführen, die für dieses Tag / diese Variable spezifisch sind.

Beispiel: Stellen Sie sich ein Spielbuch und Inventar vor

# Inventar
[Entwickler]
192.168.1.1

# site.yml
- Gastgeber: Entwickler
  Rollen:
    - {Rolle: Allgemein}

und gemeinsam / Aufgaben / main.yml

# roles / common / tasks / main.yaml
- Name: Installiere Links
  apt: name = links state = vorhanden

- Enthalten: uninstall.yml
  Wann: uninstall_links definiert ist
  Stichworte:
    - deinstallieren

# roles / common / tasks / uninstall.yml
- Name: Links deinstallieren
  apt: name = links state = abwesend

Bei diesem Ansatz verwenden Sie das Tag, um nur die Tasks in uninstall.yml auszuwählen, aber Sie müssen auch die Variable 'uninstall_links' auf etwas setzen, um es zu aktivieren. Wenn Sie das Playbook also ohne Parameter ausführen, führt es standardmäßig die Installationsaufgabe aus. Um es zu deinstallieren, kannst du den Tag 'uninstall' auf dein Playbook (oder cmdline) und MUSS setze die Variable. Wenn Sie das Tag nicht festlegen, wird es in dieser Reihenfolge ausgeführt (installiert und deinstalliert). Dies ist gut, um den gesamten Prozess zu testen.

Wie man alles ausführt (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 Variablen und Tags auch in site.yml / inventory-Dateien enthalten sein, sodass Sie sich in Ihren SCM einschreiben und Ihre Absicht aufzeichnen können.


0
2018-04-18 18:35





Nootal ist richtig, mein Ansatz funktioniert nicht - ignoriere es :( Ich benutze jetzt "wann: myvar ist definiert" und die Befehlszeile wechseln "-e" myvar = X ", um Aufgaben nur auszuführen, wenn explizit angefordert.

Noch einfacher (zumindest mit ansible 2.1.1.0):

- name: do something only when tag 'foo' is provided
  when: tags is defined
  tags: foo

-> wird nur ausgeführt, wenn Tags bereitgestellt wurden und Tags "foo" enthalten


0
2017-08-23 21:27