Ansible生成多主机安装包报告遇不可达主机报错
问题原因
当存在不可达主机时,Ansible无法在对应主机上执行package_facts采集任务,即使给任务加了ignore_errors: true也无法覆盖连接不可达的场景——不可达主机会直接跳过所有任务执行步骤,hostvars中不会生成ansible_facts.packages字段,Jinja2模板强行访问不存在的键就会触发undefined变量报错,导致整个playbook执行失败。
修复方案
对原有playbook做3处核心调整即可:
- 在play层级添加
ignore_unreachable: yes配置,让单台主机不可达时不中断其他主机的任务执行流程 - 调整
setup模块的采集子集,明确指定采集发行版信息,避免!all配置下漏采OS版本字段 - 在报告模板中增加主机状态判断:仅对成功采集到包信息的主机遍历包列表,不可达/采集失败的主机直接标记状态,不强行访问不存在的字段;同时兼容Python3环境替换废弃的
iteritems()为items(),修正原有拼写错误。
修复后的完整playbook如下:
--- - name: main hosts: all gather_facts: no become: true ignore_unreachable: yes tasks: - name: Gather minimal system facts setup: gather_subset: - '!all' - 'distribution' - name: Gather installed packages package_facts: manager: auto ignore_errors: true - name: Generate summary report on control node local_action: module: copy content: | {% for h in groups.all %} {{h}}; OS: {{hostvars[h]['ansible_distribution']|default('N/A')}}; Release: {{hostvars[h]['ansible_distribution_version']|default('N/A')}} {% if 'packages' in hostvars[h].get('ansible_facts', {}) %} List of installed packages: #============================================== {% for k,v in hostvars[h].ansible_facts.packages.items() %} package {{ k.rjust(24) }} version {{ v[0].version }} {% endfor %} #============================================== {% else %} Status: Host unreachable or package info collection failed, skipped. {% endif %} {% endfor %} dest: '/reports/OS_info.txt'
执行命令无需调整,仍使用原命令即可:
ansible-playbook -i rh_inventory -u ansuser02 os_extract_info.yml
修复后运行效果:
- 所有可达主机的已安装软件包、OS版本信息会正常汇总到报告中
- 不可达/采集失败的主机会在报告中明确标记跳过状态,不会触发变量未定义报错
- 全程不需要修改inventory配置,也不需要提前筛除不可达主机,执行效率和原逻辑一致。
内容的提问来源于stack exchange,提问作者johnny bravo
相关产品推荐
相关产品推荐

