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 }}"
逻辑说明:
selectattr('start_mode', '!=', 'disabled'):筛选启动模式不为disabled的服务map(attribute='name'):提取服务名称(格式为MSSQL$实例名)map('split', '$'):按$分割服务名,得到['MSSQL', '实例名']map('last'):取分割后的最后部分,即实例名list:转换为列表,最终得到['db1', 'db2']
后续任务可直接循环该变量:
- name: 处理启用的实例 debug: msg: "正在处理实例: {{ item }}" loop: "{{ enabled_instances }}"
内容的提问来源于stack exchange,提问作者elmo
相关产品推荐
相关产品推荐

