Odpowiedzi:
Z dokumentów ansible : Jeśli wymagana zmienna nie została ustawiona, możesz pominąć lub zakończyć się niepowodzeniem, używając testu zdefiniowanego przez Jinja2. Na przykład:
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
Więc w twoim przypadku when: deployed_revision is not defined
powinno działać
when: item.sudo is defined and item.sudo == true
when: foo is defined
(np. To nie działa:when: {{ foo }} is defined
when: ({{ foo }} in undefined)
{{ foo }}
.). Nie dzieje się tak z powodu Ansible, ale Yaml zinterpretowałby to jako przedmiot. Jeśli chcesz zacząć od rozwinięcia zmiennej, po prostu "{{ foo }}"
otocz całość podwójnymi cudzysłowami (jak ), aby zmusić Yamla do postrzegania go jako ciągu i przekazania go w takim stanie, w jakim jest do Ansible.
Zgodnie z najnowszą wersją Ansible 2.5, aby sprawdzić, czy zmienna jest zdefiniowana iw zależności od tego, czy chcesz uruchomić jakieś zadanie, użyj undefined
słowa kluczowego.
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
Ściśle mówiąc, musisz zaznaczyć wszystkie następujące elementy: zdefiniowane, nie puste ORAZ nie Brak.
W przypadku „normalnych” zmiennych ma znaczenie, czy są zdefiniowane i ustawione, czy nie. Zobacz foo
iw bar
poniższym przykładzie. Obie są zdefiniowane, ale tylko foo
ustawione.
Z drugiej strony zarejestrowane zmienne są ustawiane na wynik uruchomionego polecenia i różnią się w zależności od modułu. W większości są to struktury json. Prawdopodobnie musisz sprawdzić podelement, który Cię interesuje. Zobacz xyz
iw xyz.msg
poniższym przykładzie:
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
when: deployed_revision is not defined or deployed_revision.stdout is not defined or deployed_revision.stdout == ''