web-dev-qa-db-ja.com

戻りコードに応じて `with_items`タスクで` failed_when`を使用する

Ldapmodifyステートメントのリストを実行するタスクを作成しようとしていますが、戻りコードのいずれかが0または68(オブジェクトは既に存在している)でない場合にのみ失敗します。

- name: add needed LDAP infrastructure
  action: command ldapmodify -x -D '{{ ADMINDN }}' -w '{{ LDAPPW }}' -H {{ LDAPURI }} -c -f {{ item }}
  register: result
  failed_when: "result.results | rejectattr('rc', 'sameas', 0) | rejectattr('rc', 'sameas', 68) | list | length > 0"
  # ignore_errors: true
  with_items:
    - a.ldif
    - b.ldif

動作せず、エラーが発生します:

error while evaluating conditional: result.results | rejectattr('rc', 'sameas', 0) | rejectattr('rc', 'sameas', 68) | list | length > 0

ただし、failed_whenにコメントしてignore_errorsを使用すると、次のタスクで正しい結果が得られます。この回避策を使用して問題を解決することはできますが、failed_whenバージョンが機能しない理由を理解したいと思います。これは、よりエレガントであることがわかります。

- debug: var="result.results | rejectattr('rc', 'sameas', 0) | rejectattr('rc', 'sameas', 68) | list | length > 0"
- fail: msg="failure during ldapmodify"
  when: "result.results | rejectattr('rc', 'sameas', 0) | rejectattr('rc', 'sameas', 68) | list | length > 0"

補足事項sameasは、他のバージョンのjinja2ではequaltoである可能性があります。

15
IsoLinearCHiP

まあ、私はそれについてあまりにも複雑に取り組んでいたことがわかりました。問題は次のとおりです。Ansibleはループを繰り返すたびにfailed_whenを実行します。そのため、私は単にresult.rcにアクセスする必要があります。

- name: add needed LDAP infrastructure
  action: command ldapmodify -x -D '{{ ADMINDN }}' -w '{{ LDAPPW }}' -H {{ LDAPURI }} -c -f {{ item }}
  register: result
  # As per comment from user "ypid"
  failed_when: ( result.rc not in [ 0, 68 ] )
  # failed_when: ( result.rc != 0 ) and ( result.rc != 68 )
  with_items:
    - a.ldif
    - b.ldif

必要な結果を生成します。

ループの後、変数resultは、resultsキーの各itemの詳細を含む要約辞書で埋められます。

しかし、フィルターチェーンでresult.resultsを使用した例を見つけることができなかったので、他の誰かが役立つことを期待して、この質問を残しておきます。 (私はいつかまたそれを調べたいと思うと確信しています;))

これを指摘してくれた#ansibleのsivelに感謝します。

30
IsoLinearCHiP