Ansible:基于独立列表匹配提取嵌套列表中的集群项
解决Ansible中VM匹配集群并收集结果的问题
先模拟你的数据场景,方便理解:
vm_cluster_list:JSON Query生成的嵌套列表,格式为[[VM名称, 集群名称], ...],示例:vm_cluster_list: [["vm1", "clusterA"], ["vm2", "clusterB"], ["vm3", "clusterA"], ["vm4", "clusterC"]]target_vms:待匹配的VM列表,示例:target_vms: ["vm1", "vm3", "vm5"]
方法一:循环追加法(适合复杂判断场景)
先初始化空列表,再通过循环将匹配到的集群名追加到列表中(关键是用+运算符,而非直接赋值覆盖):
- name: 初始化空的匹配集群列表 ansible.builtin.set_fact: matched_clusters: [] - name: 遍历VM-集群列表,收集匹配的集群名 ansible.builtin.set_fact: matched_clusters: "{{ matched_clusters + [item[1]] }}" loop: "{{ vm_cluster_list }}" when: item[0] in target_vms
方法二:过滤器链式处理法(简洁高效,适合简单匹配)
利用Ansible的Jinja2过滤器直接生成结果,无需循环set_fact,数据量大时性能更优:
- name: 一键生成匹配的集群列表 ansible.builtin.set_fact: matched_clusters: >- {{ vm_cluster_list | selectattr('0', 'in', target_vms) | map(attribute='1') | list }}
过滤器说明:
selectattr('0', 'in', target_vms):筛选出嵌套列表中第1个元素(VM名)在目标列表里的项map(attribute='1'):提取这些项的第2个元素(集群名)list:将结果转换为标准列表格式
后续API调用
得到matched_clusters后,直接循环调用API即可:
- name: 循环调用集群API ansible.builtin.uri: url: "https://your-api-domain/clusters/{{ item }}/operations" method: POST body_format: json body: '{"action": "your-action"}' loop: "{{ matched_clusters }}"
内容的提问来源于stack exchange,提问作者dhubert27
相关产品推荐
相关产品推荐

