Wie führe ich eine Aufgabe aus, wenn die Variable in ansible undefiniert ist?

114

Ich suche nach einer Möglichkeit, eine Aufgabe auszuführen, wenn eine ansible Variable nicht registriert / undefiniert ist, z

-- name: some task
   command:  sed -n '5p' "{{app.dirs.includes}}/BUILD.info" | awk '{print  $2}'
   when: (! deployed_revision) AND ( !deployed_revision.stdout )
   register: deployed_revision
sakhunzai
quelle

Antworten:

210

Aus den ansible-Dokumenten : Wenn keine erforderliche Variable festgelegt wurde, können Sie den von Jinja2 definierten Test überspringen oder fehlschlagen. Beispielsweise:

tasks:

- shell: echo "I've got '{{ foo }}' and am not afraid to use it!"
  when: foo is defined

- fail: msg="Bailing out. this play requires 'bar'"
  when: bar is not defined

Also in deinem Fall when: deployed_revision is not definedsollte funktionieren

Kyle
quelle
4
danke das hat bei mir when: deployed_revision is not defined or deployed_revision.stdout is not defined or deployed_revision.stdout == ''
funktioniert
5
Sie können es auch mit verschiedenen Bedingungen kombinieren:when: item.sudo is defined and item.sudo == true
Czerasz
5
Tu nicht das, was ich getan habe und setze geschweifte Klammern um das Foo when: foo is defined(zB funktioniert das nicht:when: {{ foo }} is defined
David
2
@ David Ich hatte das gleiche Problem wie Sie. Setzen Sie geschweifte Klammern ein, wenn die Bedingung verletzt wird. Damit dies funktioniert, müssen Sie die Bedingung in Klammern setzen. zB when: ({{ foo }} in undefined)
Tarun
7
Die Verwendung von geschweiften Klammern für Bedingungen in Ansible ist veraltet. Außerdem kann keine Ansible-Anweisung mit einer Variablenerweiterung (wie {{ foo }}) beginnen. Dies liegt nicht an Ansible, aber Yaml würde dies als Objekt interpretieren. Wenn Sie mit einer variablen Erweiterung beginnen müssen, umgeben Sie das Ganze einfach mit doppelten Anführungszeichen (wie "{{ foo }}"), um Yaml zu zwingen, es als Zeichenfolge zu sehen und es unverändert an Ansible zu übergeben.
Victor Schröder
10

Verwenden Sie gemäß der neuesten Ansible-Version 2.5 das undefinedSchlüsselwort , um zu überprüfen, ob eine Variable definiert ist, und abhängig davon, ob Sie eine Aufgabe ausführen möchten .

tasks:
    - shell: echo "I've got '{{ foo }}' and am not afraid to use it!"
      when: foo is defined

    - fail: msg="Bailing out. this play requires 'bar'"
      when: bar is undefined

Ansible Dokumentation

Abhijeet Kamble
quelle
5

Streng genommen müssen Sie alle folgenden Punkte überprüfen: definiert, nicht leer UND nicht keine.

Bei "normalen" Variablen macht es einen Unterschied, ob sie definiert und gesetzt sind oder nicht. Siehe foound barim folgenden Beispiel. Beide sind aber nur definiertfoo gesetzt.

Auf der anderen Seite werden registrierte Variablen auf das Ergebnis des laufenden Befehls gesetzt und variieren von Modul zu Modul. Es sind meistens JSON-Strukturen. Sie müssen wahrscheinlich das Unterelement überprüfen, an dem Sie interessiert sind. Siehe xyzund xyz.msgim folgenden Beispiel:

cat > test.yml <<EOF
- hosts: 127.0.0.1

  vars:
    foo: ""          # foo is defined and foo == '' and foo != None
    bar:             # bar is defined and bar != '' and bar == None

  tasks:

  - debug:
      msg : ""
    register: xyz    # xyz is defined and xyz != '' and xyz != None
                     # xyz.msg is defined and xyz.msg == '' and xyz.msg != None

  - debug:
      msg: "foo is defined and foo == '' and foo != None"
    when: foo is defined and foo == '' and foo != None

  - debug:
      msg: "bar is defined and bar != '' and bar == None"
    when: bar is defined and bar != '' and bar == None

  - debug:
      msg: "xyz is defined and xyz != '' and xyz != None"
    when: xyz is defined and xyz != '' and xyz != None
  - debug:
      msg: "{{ xyz }}"

  - debug:
      msg: "xyz.msg is defined and xyz.msg == '' and xyz.msg != None"
    when: xyz.msg is defined and xyz.msg == '' and xyz.msg != None
  - debug:
      msg: "{{ xyz.msg }}"
EOF
ansible-playbook -v test.yml
Wolfrevo
quelle