Comment exécuter une tâche lorsque la variable n'est pas définie dans ansible?

115

Je recherche un moyen d'effectuer une tâche lorsque la variable ansible n'est pas des registres / non défini par exemple

-- 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
la source

Réponses:

213

À partir de la documentation ansible : Si une variable requise n'a pas été définie, vous pouvez ignorer ou échouer en utilisant le test défini par Jinja2. Par exemple:

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

Donc dans votre cas, when: deployed_revision is not defineddevrait fonctionner

Kyle
la source
4
merci, cela a fonctionné pour moiwhen: deployed_revision is not defined or deployed_revision.stdout is not defined or deployed_revision.stdout == ''
sakhunzai
5
Vous pouvez également le combiner avec différentes conditions:when: item.sudo is defined and item.sudo == true
czerasz
5
Ne faites pas ce que j'ai fait et mettez des accolades autour du toto when: foo is defined(par exemple, cela ne fonctionne pas:when: {{ foo }} is defined
David
2
@David J'ai rencontré le même problème que vous. mettre des accolades quand casse le conditionnel. Pour que cela fonctionne, vous devez ajouter des parenthèses autour du conditionnel. par exemple when: ({{ foo }} in undefined)
Tarun le
7
L'utilisation d'accolades pour les conditions dans Ansible est obsolète. De plus, aucune instruction Ansible ne peut commencer par une expansion variable (comme {{ foo }}). Ce n'est pas à cause d'Ansible, mais Yaml interpréterait cela comme un objet. Si vous avez besoin de commencer par une expansion variable, entourez simplement le tout avec des guillemets doubles (comme "{{ foo }}"), pour forcer Yaml à le voir comme une chaîne et à le passer tel quel à Ansible.
Victor Schröder
11

Selon la dernière version d'Ansible 2.5, pour vérifier si une variable est définie et en fonction de cela si vous souhaitez exécuter une tâche, utilisez le undefinedmot clé.

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

Documentation Ansible

Abhijeet Kamble
la source
5

Strictement indiqué, vous devez vérifier tous les éléments suivants: défini, non vide ET non Aucun.

Pour les variables «normales», cela fait une différence si elles sont définies et définies ou non. Voir fooet bardans l'exemple ci-dessous. Les deux sont définis mais seuls foosont définis.

De l'autre côté, les variables enregistrées sont définies sur le résultat de la commande en cours d'exécution et varient d'un module à l'autre. Ce sont pour la plupart des structures json. Vous devez probablement vérifier le sous-élément qui vous intéresse. Voir xyzet xyz.msgdans l'exemple ci-dessous:

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
la source