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

Ansible:循环解析多列表值,筛选非Disabled的MSSQL实例

解决方案

方法1:基于你现有zip结果的筛选

先修正loop的写法,让每个[实例名, start_mode]作为单独循环项,再通过when子句过滤:

- name: 筛选非disabled的实例
  debug: 
    msg: "{{ item[0] }}"
  loop: "{{ instance_output.properties.InstalledInstances.value | zip(service_output|json_query('services[*].start_mode')) | list }}"
  when: item[1] != 'disabled'

如果需要把筛选后的实例名保存下来供后续任务使用,可以用set_fact:

- name: 提取非disabled的实例名
  set_fact:
    enabled_instances: "{{ enabled_instances | default([]) + [item[0]] }}"
  loop: "{{ instance_output.properties.InstalledInstances.value | zip(service_output|json_query('services[*].start_mode')) | list }}"
  when: item[1] != 'disabled'

后续任务直接调用{{ enabled_instances }}即可。


方法2:更可靠的直接从服务数据提取(推荐)

zip依赖注册表实例列表和服务列表顺序完全一致,一旦顺序不匹配会导致关联错误。更稳妥的方式是直接从服务数据中提取并筛选:

- name: 提取非disabled的MSSQL实例名
  set_fact:
    enabled_instances: "{{ service_output.services | selectattr('start_mode', '!=', 'disabled') | map(attribute='name') | map('split', '$') | map('last') | list }}"

逻辑说明:

  1. selectattr('start_mode', '!=', 'disabled'):筛选启动模式不为disabled的服务
  2. map(attribute='name'):提取服务名称(格式为MSSQL$实例名)
  3. map('split', '$'):按$分割服务名,得到['MSSQL', '实例名']
  4. map('last'):取分割后的最后部分,即实例名
  5. list:转换为列表,最终得到['db1', 'db2']

后续任务可直接循环该变量:

- name: 处理启用的实例
  debug:
    msg: "正在处理实例: {{ item }}"
  loop: "{{ enabled_instances }}"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 14:01:12