You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ansible的when条件中使用列表循环匹配设备?

解决Ansible动态多设备条件判断问题

我来帮你搞定这个需求!你想要把原来when条件里的静态设备名,改成用list3里的所有设备做动态判断,只要item.names包含list3中的任意一个设备就执行任务,对吧?

其实用Ansible的Jinja2过滤器就能轻松实现,这里推荐两种简洁的写法来完成这个逻辑:

方法一:使用any过滤器(推荐)

any过滤器会遍历list3的每个元素,检查是否存在于item.names中,只要有一个匹配就返回True。修改后的任务代码如下:

- 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'
    - "{{ list3 | any(it in item.names) }}"

方法二:使用intersect过滤器

通过计算item.names和list3的交集,如果交集长度大于0,说明存在匹配的设备:

- 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'
    - "{{ item.names | intersect(list3) | length > 0 }}"

代码说明

两种写法都能实现你的需求:

  • 保留了你原来的第一个条件item.type == 'CpmiGatewayCluster',确保只有指定类型的条目才会被处理
  • 第二个条件动态遍历list3的所有设备,只要item.names包含其中任意一个,就满足执行条件

你可以根据自己的阅读习惯选择其中一种写法~

内容的提问来源于stack exchange,提问作者mikeraj2019

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:12:28