Ansible 如何通过第二个列表进行播放

Ansible 如何通过第二个列表进行播放,ansible,ansible-facts,Ansible,Ansible Facts,我正在尝试将项目列表应用于when条件,但它未按预期工作 循环中应用的第一个列表 { "list2": [ { "apname": "Standard", "dname": "dom-cn-1", "name": "cluster-01", "names": [ "device-cn-c1

我正在尝试将项目列表应用于when条件,但它未按预期工作

循环中应用的第一个列表

 {
        "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) }}"