回答:
ansible docsから:必要な変数が設定されていない場合は、Jinja2の定義済みテストを使用してスキップまたは失敗できます。例えば:
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
あなたの場合、when: deployed_revision is not defined
うまくいくはずです
when: item.sudo is defined and item.sudo == true
when: foo is defined
(たとえば、これは機能しません:when: {{ foo }} is defined
when: ({{ foo }} in undefined)
{{ foo }}
)で始めることはできません。これはAnsibleのせいではありませんが、Yamlはこれをオブジェクトとして解釈します。変数の展開から始める必要がある場合は、全体を(のように"{{ foo }}"
)二重引用符で囲むだけで、Yamlに文字列として認識させ、そのままAnsibleに渡すことができます。
最新のAnsibleバージョン2.5に従って、変数が定義されているかどうかを確認し、これに依存してタスクを実行する場合は、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
厳密には、次のすべてをチェックする必要があります:定義済み、空ではなく、なしでもありません。
「通常の」変数の場合、定義されて設定されているかどうかによって違いが生じます。以下の例foo
とbar
を参照してください。両方が定義されていますfoo
が、設定されているだけです。
一方、登録された変数は実行中のコマンドの結果に設定され、モジュールごとに異なります。それらは主にjson構造です。。あなたはおそらく、あなたが見ることに興味がサブ要素をチェックしなければならないxyz
とxyz.msg
の例以下では:
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 == ''