変数がansibleで定義されていないときにタスクを実行する方法は?


114

ansible変数が/ 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

回答:


212

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うまくいくはずです


4
これは私のために働いたおかげでwhen: deployed_revision is not defined or deployed_revision.stdout is not defined or deployed_revision.stdout == ''
sakhunzai

5
また、さまざまな条件と組み合わせることもできますwhen: item.sudo is defined and item.sudo == true
。– czerasz

5
私がしたことをしないで、中括弧をfooの周りに入れてくださいwhen: foo is defined(たとえば、これは機能しません:when: {{ foo }} is defined
David

2
@David私はあなたと同じ問題に直面しました。条件を破るときに中括弧を入れる。これを機能させるには、条件を括弧で囲む必要があります。例 when: ({{ foo }} in undefined)
Tarun

7
Ansibleでの条件文の波括弧の使用は廃止されました。また、Ansibleステートメントは変数展開(など{{ foo }})で始めることはできません。これはAnsibleのせいではありませんが、Yamlはこれをオブジェクトとして解釈します。変数の展開から始める必要がある場合は、全体を(のように"{{ foo }}")二重引用符で囲むだけで、Yamlに文字列として認識させ、そのままAnsibleに渡すことができます。
ビクターシュレーダー

10

最新の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

Ansibleのドキュメント


5

厳密には、次のすべてをチェックする必要があります:定義済み、空ではなく、なしでもありません。

「通常の」変数の場合、定義されて設定されているかどうかによって違いが生じます。以下の例foobarを参照してください。両方が定義されていますfooが、設定されているだけです。

一方、登録された変数は実行中のコマンドの結果に設定され、モジュールごとに異なります。それらは主にjson構造です。。あなたはおそらく、あなたが見ることに興味がサブ要素をチェックしなければならないxyzxyz.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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.