如何在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
相关产品推荐
相关产品推荐

