Ansible按条件分类Windows主机ping结果存入列表发送Slack问题
Ansible Windows连通性测试结果归集解决方案
问题根源
你之前使用groups.all遍历的是Ansible Tower全清单主机,未被选入本次测试的主机没有执行ping任务,ping_results.ping默认值为空,全部命中了不等于"pong"的条件,所以会混入nok_list。同时归集逻辑跑在每台目标主机上,每个主机只会生成自己维度的列表,无法得到全局统一的统计结果。
修复方案
调整playbook结构,拆分测试执行和结果归集两个环节,使用Ansible内置变量ansible_play_hosts_all获取本次测试的所有目标主机,归集逻辑统一跑在控制节点localhost上:
1. 连通性测试Play
- name: 测试Windows主机连通性 hosts: all gather_facts: no # play级别配置忽略不可达,确保所有测试主机都纳入统计 ignore_unreachable: true roles: - Hello-windows
角色内仅保留ping测试逻辑即可,删除原有的列表归集任务:
--- - name: get powershell version ignore_unreachable: true raw: $PSVersionTable - name: ping win_ping: register: ping_results
2. 结果归集与Slack发送Play
- name: 归集测试结果并发送Slack hosts: localhost gather_facts: no vars: ok_list: [] nok_list: [] tasks: - name: 归集连通正常主机列表 set_fact: ok_list: "{{ ok_list + [item] }}" when: hostvars[item].ping_results.ping | default('') == 'pong' # 仅遍历本次测试的目标主机 loop: "{{ ansible_play_hosts_all }}" - name: 归集连通异常主机列表 set_fact: nok_list: "{{ nok_list + [item] }}" when: hostvars[item].ping_results.ping | default('') != 'pong' loop: "{{ ansible_play_hosts_all }}" - name: 结果验证(可选) debug: msg: - "连通正常主机:{{ ok_list }}" - "连通异常主机:{{ nok_list }}" - name: 发送Slack通知 community.general.slack: token: "你的Slack Bot令牌" channel: "#通知频道名称" msg: | Windows主机连通性测试完成 测试主机总数:{{ ansible_play_hosts_all | length }} 连通正常数:{{ ok_list | length }} 连通异常数:{{ nok_list | length }} 异常主机列表:{{ nok_list | join(', ') }}
核心优化点
- 用
ansible_play_hosts_all替代groups.all:该变量仅包含本次Job Template选中的测试主机,不会混入全清单其他无关主机 - 归集逻辑跑在localhost:仅生成一份全局统一的统计列表,避免每个目标主机单独计算导致的结果分散
- play级别配置
ignore_unreachable: true:确保不可达主机不会被排除出遍历范围,统计结果完整
内容的提问来源于stack exchange,提问作者Y.H
相关产品推荐
相关产品推荐

