You need to enable JavaScript to run this app. Ansible2.9版本服务器连通性检查逻辑误判报错问题求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 00:48:02