web-dev-qa-db-fra.com

Comment exécuter une tâche lorsque la variable est indéfinie dans ansible?

Je cherche un moyen d’exécuter une tâche lorsque la variable ansible n’est pas un registre/undefined

-- 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
94
sakhunzai

Depuis le ansible docs : Si une variable requise n’a pas été définie, vous pouvez ignorer ou échouer à l’aide du 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 defined devrait fonctionner

177
Kyle

Comme dans la dernière version 2.5 d'Ansible, pour vérifier si une variable est définie et si vous souhaitez exécuter une tâche, utilisez le mot clé undefined.

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

10
Abhijeet Kamble

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

Pour les variables "normales", cela fait une différence si elles sont définies et définies ou non. Voir foo et bar dans l'exemple ci-dessous. Les deux sont définis mais seul foo est défini.

De l'autre côté, les variables enregistrées sont définies sur le résultat de la commande en cours et varient d'un module à l'autre. Ce sont principalement des structures JSON. Vous devez probablement vérifier le sous-élément qui vous intéresse. Voir xyz et xyz.msg dans 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
4
wolfrevo