Ansible: with_dictとwhenを使用すると、未定義のときにタスクがスキップされません

作成日 2014年08月11日  ·  3コメント  ·  ソース: ansible/ansible

問題の種類:

バグレポート

Ansibleバージョン:

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にお気軽にお立ち寄りください。喜んでお手伝いさせていただきます。

ありがとう!

全てのコメント3件

やあ!

これは少し誤解ですが、ここでの条件は、必要な機能であるすべてのアイテムに対して評価されます。 アイテムごとに評価するには、反復できるものから始める必要があります。

そのため、次のようなことをしたいと思うかもしれません。

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を使用する必要があります。

このページは役に立ちましたか?
0 / 5 - 0 評価