Ansible 如何通过第二个列表进行播放
我正在尝试将项目列表应用于when条件,但它未按预期工作 循环中应用的第一个列表Ansible 如何通过第二个列表进行播放,ansible,ansible-facts,Ansible,Ansible Facts,我正在尝试将项目列表应用于when条件,但它未按预期工作 循环中应用的第一个列表 { "list2": [ { "apname": "Standard", "dname": "dom-cn-1", "name": "cluster-01", "names": [ "device-cn-c1
{
"list2": [
{
"apname": "Standard",
"dname": "dom-cn-1",
"name": "cluster-01",
"names": [
"device-cn-c1",
"device-cn-c2"
],
"type": "CpmiGatewayclusterter"
},
{
"apname": "PolicyPKG1",
"dname": "dom-cn-1",
"name": "cluster-cn-02",
"names": [
"device-cn-4",
"device-cn-c3"
],
"type": "CpmiGatewayclusterter"
},
{
"apname": "Standard",
"dname": "dom-cn-2",
"name": "cluster-cn-3",
"names": [
"device-cn-5",
"device-cn-6"
],
"type": "CpmiGatewayclusterter"
},
{
"apname": "Standard",
"dname": "dom-cn-2",
"name": "cluster-cn-4",
"names": [
"device-cn-c7",
"device-cn-c8"
],
"type": "CpmiGatewayclusterter"
},
{
"apname": null,
"dname": "dom-cn-1",
"name": "device-cn-4",
"names": null,
"type": "CpmiclusterterMember"
},
{
"apname": null,
"dname": "dom-cn-2",
"name": "device-cn-5",
"names": null,
"type": "CpmiclusterterMember"
},
{
"apname": null,
"dname": "dom-cn-2",
"name": "device-cn-6",
"names": null,
"type": "CpmiclusterterMember"
},
{
"apname": null,
"dname": "dom-cn-1",
"name": "device-cn-c1",
"names": null,
"type": "CpmiclusterterMember"
},
{
"apname": "Standard",
"dname": "dom-cn-1",
"name": "device-cn-c10",
"names": null,
"type": "simple-gateway"
},
{
"apname": null,
"dname": "dom-cn-1",
"name": "device-cn-c2",
"names": null,
"type": "CpmiclusterterMember"
},
{
"apname": null,
"dname": "dom-cn-1",
"name": "device-cn-c3",
"names": null,
"type": "CpmiclusterterMember"
},
{
"apname": null,
"dname": "dom-cn-2",
"name": "device-cn-c7",
"names": null,
"type": "CpmiclusterterMember"
},
{
"apname": null,
"dname": "dom-cn-2",
"name": "device-cn-c8",
"names": null,
"type": "CpmiclusterterMember"
},
{
"apname": null,
"dname": "dom-cn-1",
"name": "dom_cn_1",
"names": null,
"type": "CpmiHostCkp"
},
{
"apname": null,
"dname": "dom-cn-2",
"name": "dom_cn_2",
"names": null,
"type": "CpmiHostCkp"
}
]
}
我正在使用上面的列表(列表2)来完成下面的任务
- name: Create a change request
snow_record:
state: present
table: u_device
username: admin
password: password
instance: dev970066
data:
u_name: "{{ item.name }}"
u_domain: "{{ item.dname }}"
u_policy: "{{ item.apname }}"
u_cluster: "{{ item.name }}"
loop: "{{ list2 }}"
when:
- item.type == 'CpmiGatewayCluster'
- "'device-cn-c1' in item.name
s“
上面的任务按预期工作,但您可以看到,在we条件中传递了一个静态值“device-cn-c1”,我想使用不同的项目列表,而不是这个静态变量
示例列表3有多个设备,我想在条件为时循环此列表。(-“'device-cn-c1'在item.names中”)
我想在条件相同时使用相同的
when:
- item.type == 'CpmiGatewayCluster'
- "'device-cn-c1' in item.name
但设备名称应该能够像下面的示例一样循环
1.
when:
- item.type == 'CpmiGatewayCluster'
- "'device-cn-c1' in item.names"
when:
- item.type == 'CpmiGatewayCluster'
- "'device-cn-c2' in item.names"
when:
- item.type == 'CpmiGatewayCluster'
- "'device-cn-c3' in item.names"
when:
- item.type == 'CpmiGatewayCluster'
- "'device-cn-c4' in item.names"
这就是你想要的条件吗
when: list3|intersect(item.names)|length > 0
可以循环包含任务。例如(或者更确切地说是提示)
详细信息。
list3 | intersect(outer_item.names
在list3
和outer_item.names
中创建一个公共项列表。如果该列表为空,则将跳过循环。如果该列表不是空,则将包括文件loop1.yml
。此文件内的循环将迭代公共项
请参阅。您好,先生,不,我想在item.name中使用相同的条件`when:-item.type=='CpmiGatewayCluster'-“'device-cn-c1'“`您好,先生,不,我想使用相同的条件,我刚刚用一个例子更新了问题。建议的代码完全符合您的要求。您可能想试试。我在答案中添加了一些细节。
when: list3|intersect(item.names)|length > 0
- include_tasks: loop1.yml
loop: "{{ list2 }}"
loop_control:
loop_var: outer_item
when:
- outer_item.type == 'CpmiGatewayCluster'
- list3|intersect(outer_item.names)|length > 0
$ cat loop1.yml
- debug:
msg: "{{ outer_item.apname }} - {{ item }}"
loop: "{{ list3|intersect(outer_item.names) }}"