说我有这本词典
war_files:
server1:
- file1.war
- file2.war
server2:
- file1.war
- file2.war
- file3.war
现在我只想循环每个项目(键),然后遍历键中的每个项目(值) . 我这样做了
- name: Loop over the dictionary
debug: msg="Key={{ item.key }} value={{ item.value }}"
with_dict: "{{ war_files }}"
我明白了 . 这当然是正确的,但不是我想要的 .
ok: [localhost] => (item={'value': [u'file1.war', u'file2.war'], 'key': u'server1'}) => {
"item": {
"key": "server1",
"value": [
"file1.war",
"file2.war"
]
},
"msg": "Server=server1, WAR=[u'file1.war', u'file2.war']"
}
ok: [localhost] => (item={'value': [u'file1.war', u'file2.war', u'file3.war'], 'key': u'server2'}) => {
"item": {
"key": "server2",
"value": [
"file1.war",
"file2.war",
"file3.war"
]
},
"msg": "Server=server2, WAR=[u'file1.war', u'file2.war', u'file3.war']"
}
我想获得一个输出
"msg": "Server=server1, WAR=file1.war"
"msg": "Server=server1, WAR=file2.war"
"msg": "Server=server2, WAR=file1.war"
"msg": "Server=server2, WAR=file2.war"
"msg": "Server=server2, WAR=file3.war"
IOW,我怎样才能编写一个任务来遍历字典,以便遍历每个密钥,然后是每个密钥中的项目?本质上,我有一个嵌套数组,并想迭代它?
4 回答
现在Ansible允许这样做
好吧,我找不到一个非常简单的方法来做到这一点,但是,通过一点点jinja2,我们可以实现这样的东西:
而且,当剧本运行时:
这个怎么样
dict2items
,subelements
过滤器将在Ansible 2.6中出现 .仅供参考,如果您的目标的过滤器不存在,您可以在python中编写自己的过滤器,而不必诉诸于jinja2 hacks . Ansible很容易扩展;默认搜索
filter_plugins/*.py
中的过滤器,与您的播放/角色相邻,并自动包含 - 有关详细信息,请参阅Developing Plugins .这是我循环遍历词典的首选方式:
input_data.yml包含以下内容:
然后我使用keys()函数在play中使用如上所述的数据结构,并使用with_items迭代数据:
上面的剧本产生以下输出: