Ansible2.9版本服务器连通性检查逻辑误判报错问题求助
问题根因
你的连通性校验任务的失败判断逻辑写反了。原有代码中的判断条件when: hostvars[item].ansible_facts is defined表示只要对应主机成功采集到事实就触发失败报错,和你预期的「无事实(主机不可达)才报错」的逻辑完全相反,所以连通正常、事实采集成功的主机反而触发了报错。
修正方案
方案1:直接修正原有逻辑
仅修改fail任务的when条件即可,修改后如下:
- name: Check if all hosts are reachable fail: msg: > [REQUIRED] ALL hosts to be reachable, so flagging {{ inventory_hostname }} as failed, because host {{ item }} has no facts, meaning it is UNREACHABLE. when: hostvars[item].ansible_facts is not defined with_items: "{{ ansible_play_hosts_all }}" run_once: true tags: checkserver
注意这里同时把循环变量从ansible_play_hosts改为了ansible_play_hosts_all:ansible_play_hosts仅包含当前play执行成功的可达主机,你需要遍历所有目标主机才能校验到不可达的节点。
方案2(更简洁,适配Ansible 2.9+)
不需要循环遍历所有主机,直接对比总目标主机数和可达主机数即可,代码更简洁高效,同时合并了重复的play,避免多次执行事实采集,提升执行效率:
- hosts: "{{ENV}}_*" user: "{{USER}}" gather_facts: yes pre_tasks: - name: Check PING ping: tags: checkserver - name: Check if all hosts are reachable fail: msg: "[REQUIRED] ALL hosts to be reachable, only {{ ansible_play_hosts | length }} of {{ ansible_play_hosts_all | length }} hosts are reachable." when: ansible_play_hosts | length != ansible_play_hosts_all | length run_once: true tags: checkserver
验证说明
修改后重新执行playbook,连通正常的主机会正常通过校验,仅当存在实际不可达的主机时才会触发失败中断执行。
内容的提问来源于stack exchange,提问作者Ashar
相关产品推荐
相关产品推荐

