使用ansible循环在列表字典上迭代
我有下面的测试剧本来循环列表字典使用ansible循环在列表字典上迭代,ansible,Ansible,我有下面的测试剧本来循环列表字典 - hosts: localhost connection: local vars: machine_roles: masters: ["master1","master2"] workers: ["worker1","worker2"] tasks: - name: toto debug: msg: "{{ item.0.role}} --- {{ item.1 }}"
- hosts: localhost
connection: local
vars:
machine_roles:
masters: ["master1","master2"]
workers: ["worker1","worker2"]
tasks:
- name: toto
debug:
msg: "{{ item.0.role}} --- {{ item.1 }}"
loop:
- "{{ machine_roles | dict2items(key_name='role', value_name='machine') | subelements('machine') }}"
我希望得到以下输出:
masters --- master1
masters --- master2
workers --- worker1
workers --- worker2
基于我对文档和类似帖子的理解,我希望我的剧本能完成这项工作。但是,在运行它时,我得到以下错误:
fatal: [localhost]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'role'\n\nThe error appears to be in '/root/git/visa-jupyter/jupyterhub-kubespawner/test.yml': line 14, column 7, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n - name: toto\n ^ here\n"}
令人惊讶的是,在调试{{machine|roles | dict2items(key_name='role',value_name='machine')| subelements('machine')}
的结果时,我得到了:
[
[
{
"machine": [
"master1",
"master2"
],
"role": "masters"
},
"master1"
],
[
{
"machine": [
"master1",
"master2"
],
"role": "masters"
},
"master2"
],
[
{
"machine": [
"worker1",
"worker2"
],
"role": "workers"
},
"worker1"
],
[
{
"machine": [
"worker1",
"worker2"
],
"role": "workers"
},
"worker2"
]
]
在我看来,当组合dict2items
和子元素时,这就是文档中解释的预期结果
为什么在此数据结构上应用loop
命令会失败,或者至少不会产生我所期望的结果
[编辑和回答]
我终于找到了错误。我通过以下操作引入了另一个循环关卡,让自己大吃一惊:
loop:
- "{{ machine_roles | dict2items(key_name='role', value_name='machine') | subelements('machine') }}"
正确的语法是(就我而言):
这一定是一些奇怪的格式/缩进问题。您的代码运行良好
"msg": "masters --- master1"
"msg": "masters --- master2"
"msg": "workers --- worker1"
"msg": "workers --- worker2"
FWIW。这是到测试的链接。我终于找到了我的错误。Cf我的编辑信息。与你的版本相比,我找到了方向。谢谢
"msg": "masters --- master1"
"msg": "masters --- master2"
"msg": "workers --- worker1"
"msg": "workers --- worker2"