私はこの質問が以前に何度も尋ねられたことを知っていますが、私はここで何かが欠けているに違いありません!
これは、問題を再現するための最小限のプレイブックです。
プレイブックは次のとおりです。
---
- hosts:
- localhost
gather_facts: false
vars:
zones_hash:
location1:
id: 1
control_prefix: '10.1.254'
data_prefix: '10.1.100'
location2:
id: 2
control_prefix: '10.2.254'
data_prefix: '10.2.100'
tasks:
- name: "test1"
debug: var="zones_hash"
- name: "test2"
debug: var="item"
with_dict:
- "{{ zones_hash }}"
出力は次のとおりです。
$ ansible --version
ansible 2.3.1.0
config file = /home/configs/_ansible/ansible.cfg
configured module search path = Default w/o overrides
python version = 2.7.5 (default, Nov 6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
$ ansible-playbook playbook.yml
PLAY [localhost] *******************************************************************************
TASK [test1] ***********************************************************************************
ok: [localhost] => {
"zones_hash": {
"location1": {
"control_prefix": "10.1.254",
"data_prefix": "10.1.100",
"id": 1
},
"location2": {
"control_prefix": "10.2.254",
"data_prefix": "10.2.100",
"id": 2
}
}
}
TASK [test2] ***********************************************************************************
fatal: [localhost]: FAILED! => {"failed": true, "msg": "with_dict expects a dict"}
PLAY RECAP *************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=1
Task2で出力されるitem変数には次のものが含まれていると思います(たとえば)。
key: location1
value: {
id: 1
control_prefix: '10.1.254'
data_prefix: '10.1.100'
}
何が欠けていますか?
Ansibleのドキュメントを更新する必要があるか、バグを見つけたようです。 http://docs.ansible.com/ansible/latest/playbooks_loops.html#looping-over-hasheswith_dict
構文を使用していますが、それはもう機能していないようです。辞書はwith_dict
と同じ行にある必要があります。
- name: "test2"
debug: var="item"
with_dict: "{{ zones_hash }}"
with_dict:
- "{{ zones_hash }}"
listを最初のインデックスとしてdictで宣言し、Ansibleはdictを期待しているので当然文句を言います。
Kfreezyが言及したソリューションは、実際にはリストではなくwith_dict
に辞書を提供するため、機能します。
with_dict: "{{ zones_hash }}"
この質問はすでに回答済みですが、別の方法で問題を解決しました。それは他の人に役立つかもしれません。
辞書の名前も問題になる可能性があります。辞書名をhdfs_dirs
と名付けましたが、with_dict expects a dict
エラーが表示されていました。どうやら同じ名前が共通の変数で定義されており、同じ名前を使用することは問題ありません。
辞書名をhdfs_paths
に変更すると、機能しました。
辞書の名前も再確認してください。:)
あなたが直面している問題は、YAML構文に関するものです!
実際には、ダッシュ/ハイフンは、後に続くものがリストの項目であることを示します。だからあなたが書くとき- "{{ zones_hash }}"
、 'dict'のリスト(1つの項目のみ)があり、 'dict '。
'dict'を提供するには、次のように記述します。
with_dict:
"{{ zones_hash }}"
1行または2行のいずれかで、重要なのはダッシュがないことです(他の回答で言われているように ここ )。
Ansibleから始めて、YAMLに慣れていない場合、ダッシュ/ハイフンで宣言を開始する必要がある場合を理解するのは必ずしも簡単ではありません。あなたはそのトピックに向けられたいくつかの説明があります ここではStackOverflowで 。
違いを理解して視覚化するのに役立つもう1つの優れたトリックは、YAMLコードをJSONに変換することです。これを行うためのツールは次のとおりです。