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
である可能性があります。
まあ、私はそれについてあまりにも複雑に取り組んでいたことがわかりました。問題は次のとおりです。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に感謝します。