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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 05:53:16