バグレポート
ansible 1.7
OSの実行元:OSX 10.9
管理:Ubuntu 14.04
タスクが「with_dict」と「when」で使用され、whenの値がfalseと評価された場合、ansibleはdict値をチェックしようとし、タスクをスキップする必要があるときに失敗します。
ホスト:
[test]
testhost
playbook.yml:
- hosts: all
tasks:
- name: Delete a user
user: name="{{item}}" state=absent
when: users_deleted is defined
with_dict: users_deleted
コマンド: ansible-playbook -i hosts playbook.yml
users_deletedを定義していないため、このタスクはスキップする必要があります。
playbook.ymlで、「with_dict」を「with_items」に変更すると、タスクは正しくスキップされます。
「with_dict」の代わりに「with_items」を使用してタスクを実行した結果:
PLAY [all] ********************************************************************
GATHERING FACTS ***************************************************************
ok: [testhost]
TASK: [Delete a user] *********************************************************
skipping: [testhost] => (item=users_deleted)
PLAY RECAP ********************************************************************
testhost : ok=2 changed=0 unreachable=0 failed=0
PLAY [all] ********************************************************************
GATHERING FACTS ***************************************************************
ok: [testhost]
TASK: [Delete a user] *********************************************************
fatal: [testhost] => with_dict expects a dict
FATAL: all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
testhost : ok=1 changed=0 unreachable=1 failed=0
やあ!
これは少し誤解ですが、ここでの条件は、必要な機能であるすべてのアイテムに対して評価されます。 アイテムごとに評価するには、反復できるものから始める必要があります。
そのため、次のようなことをしたいと思うかもしれません。
with_dict: "{{users_deleted | default({})}}"
これはこれを解決するのに役立つはずです。
また、リストの長さが未定義ではなくゼロになるため、when句を削除することもできます。
ご不明な点がございましたら、ansible-projectにお気軽にお立ち寄りください。喜んでお手伝いさせていただきます。
ありがとう!
私は最終的に以下を使用しました:
with_dict:users_deleted | ディフォルト({})
これは期待どおりに機能し、タスクをスキップします。 タスクの条件が必要なときに「when:」を一貫して使用できると期待するため、ユーザーとしては少し混乱しました。 これを明確にしてくれてありがとう!
バージョン2.0.1.0
でもこのエラーが発生します
[DEPRECATION WARNING]: Skipping task due to undefined Error, in the future this will be a fatal error.. This feature will be removed in a future
release. Deprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
fatal: [xxx.xxx.xxx.xxx]: FAILED! => {"failed": true, "msg": "with_dict expects a dict"}
バイパスするにはignore_errors
を使用する必要があります。
最も参考になるコメント
やあ!
これは少し誤解ですが、ここでの条件は、必要な機能であるすべてのアイテムに対して評価されます。 アイテムごとに評価するには、反復できるものから始める必要があります。
そのため、次のようなことをしたいと思うかもしれません。
with_dict: "{{users_deleted | default({})}}"
これはこれを解決するのに役立つはずです。
また、リストの長さが未定義ではなくゼロになるため、when句を削除することもできます。
ご不明な点がございましたら、ansible-projectにお気軽にお立ち寄りください。喜んでお手伝いさせていただきます。
ありがとう!