如何在Ansible中创建汇总所有受管主机服务状态的fact以生成汇总邮件
Ansible多主机服务状态汇总实现方案
问题根因
原有代码存在两处核心问题:
- 未添加
delegate_facts: yes参数:委派到localhost执行set_fact时,默认会将变量存储到当前执行任务的远程主机上,而非localhost本身,导致每个主机的赋值操作实际是修改自身变量,互不影响。 - 变量读取逻辑错误:累加时直接读取
Summary变量,拿到的是当前远程主机的本地副本,而非localhost上的最新汇总值,并行执行场景下只有最后完成的主机结果会被保留。
推荐实现方案(更稳定,无并行冲突)
不需要中途累加变量,所有主机完成状态检查后,一次性遍历聚合所有主机的状态数据:
--- # 第一步:所有主机执行状态检查 - name: 获取当前服务状态 shell: /usr/app/current/app/bin/status_script.sh status register: app_status # 可选:避免单台主机命令执行失败中断整个play failed_when: false # 第二步:单节点执行,统一生成汇总结果 - name: 生成服务状态汇总文本 set_fact: Summary: | 服务运行状态汇总: {% for host in groups['all'] %} {{ host }}: Service Status - {{ hostvars[host].app_status.stdout | default('状态获取失败') }} {% endfor %} run_once: true delegate_to: localhost
说明:将
groups['all']替换为你实际使用的inventory主机组名即可,如果部分主机可能未执行到状态检查任务,用default过滤器设置兜底值避免报错。
原有逻辑兼容方案(中途累加)
如果需要保持中途累加的逻辑,补充缺失的参数和变量读取逻辑即可:
--- # 第一步:所有主机执行状态检查 - name: 获取当前服务状态 shell: /usr/app/current/app/bin/status_script.sh status register: app_status failed_when: false # 第二步:初始化localhost上的空汇总变量 - name: 初始化汇总变量 set_fact: Summary: "" run_once: true delegate_to: localhost delegate_facts: yes # 第三步:逐个累加主机状态到localhost的汇总变量 - name: 追加当前主机状态到汇总结果 set_fact: Summary: "{{ hostvars['localhost'].Summary + inventory_hostname + ':\nService Status - ' + (app_status.stdout | default('状态获取失败')) + '\n' }}" delegate_to: localhost delegate_facts: yes
后续使用
生成的Summary变量可以直接传给mail模块发送邮件,格式已经符合预期输出要求。
内容的提问来源于stack exchange,提问作者Sam0161
相关产品推荐
相关产品推荐

