loops - Ansible:遍历字典列表 - 循环与 with_items
问题描述
在尝试迭代字典列表时,我在使用 loop 与 with_items 时得到不同的结果。
我尝试过使用 loop|dict2items (结构不是字典,它告诉我很多。呵呵)并使用 flatten 过滤器循环。
以下是词典列表:
"msg": [
{
"id": "id1",
"ip": "ip1",
"name": "name1"
},
{
"id": "id2",
"ip": "ip2",
"name": "name2"
},
{
"id": "id3",
"ip": "ip3",
"name": "name3"
},
{
"id": "id4",
"ip": "ip4",
"name": "name4"
}
]
}
这是剧本中的任务:
- name: Add privateIp windows_instances to inventory
add_host:
name: "{{ item.ip }}"
aws_name: "{{ item.name }}"
groups: windows_instances
aws_instanceid: "{{ item.id }}"
ansible_user: "{{ windows_user }}"
ansible_password: "{{ windows_password }}"
ansible_port: 5985
ansible_connection: winrm
ansible_winrm_server_cert_validation: ignore
loop:
- "{{ list1 | flatten(levels=1) }}"
尝试运行上述代码时,出现“列表对象没有属性”错误。我尝试了不同的展平级别无济于事。
然而...
如果我简单地将上面的循环替换为:
with_items:
- "{{ list1 }}"
一切都很完美。我在这里的 with_items > 循环翻译中遗漏了一些东西......
解决方案
不要-
在你的清单之前放一个。
在这里,你有一个字典列表,所以你也不需要展平。
这个剧本:
- hosts: localhost
gather_facts: no
vars:
demo_list:
- ip: 1.2.3.4
id: 1
name: demo1
- ip: 2.2.3.4
id: 2
name: demo2
- ip: 3.2.3.4
id: 3
name: demo3
tasks:
- name: the list
debug:
msg: "{{ demo_list }}"
- name: unflattened list
debug:
msg: "{{ item.id }} {{ item.ip }} {{ item.name }}"
loop:
"{{ demo_list }}"
- name: flattened list == unflattened list in this case
debug:
msg: "{{ item.id }} {{ item.ip }} {{ item.name }}"
loop:
"{{ demo_list | flatten(levels=1) }}"
给出这个结果:
PLAY [localhost] ***************************************************************************************
TASK [the list] ****************************************************************************************
ok: [localhost] => {
"msg": [
{
"id": 1,
"ip": "1.2.3.4",
"name": "demo1"
},
{
"id": 2,
"ip": "2.2.3.4",
"name": "demo2"
},
{
"id": 3,
"ip": "3.2.3.4",
"name": "demo3"
}
]
}
TASK [unflattened list] ********************************************************************************
ok: [localhost] => (item=None) => {
"msg": "1 1.2.3.4 demo1"
}
ok: [localhost] => (item=None) => {
"msg": "2 2.2.3.4 demo2"
}
ok: [localhost] => (item=None) => {
"msg": "3 3.2.3.4 demo3"
}
TASK [flattened list == unflattened list in this case] *************************************************
ok: [localhost] => (item=None) => {
"msg": "1 1.2.3.4 demo1"
}
ok: [localhost] => (item=None) => {
"msg": "2 2.2.3.4 demo2"
}
ok: [localhost] => (item=None) => {
"msg": "3 3.2.3.4 demo3"
}
PLAY RECAP *********************************************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0
推荐阅读
- android - 如何将字符串数组名称设置为变量
- javascript - vue a-href下载不下载
- javascript - 当我运行此代码时,它给了我错误:login.js:12 Uncaught TypeError: Cannot read property 'value' of null at HTMLInputElement.login (login.js:12)
- python - 为什么在 Spyder 中使用 sns.set_palette 会出错?
- python - 从函数返回唯一的数据框名称
- xml - 为什么我的设计选项卡在 android studio 中是空白的?
- r - 在表格中更改栏的颜色和方向
- java - List的Java反射数组
- javascript - 如何使用 Firefox 禁用对特定 javascript 函数的访问?
- python - Pandas / Databricks - 如果另一个日期时间列在分钟内有 x,则创建一个新的日期时间列