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