如何为所有Ansible主机生成单份邮件告警?
解决方法:汇总所有主机信息后发送单封邮件
你可以把信息收集和邮件发送拆成两个独立的play来实现:先在所有目标主机上收集版本信息,再在本地主机(localhost)汇总所有数据,最后只发一封邮件。
修改后的Playbook如下:
- name: 收集所有服务器版本信息 hosts: all tasks: - name: 检查系统版本 shell: cat /etc/redhat-release register: server_version - name: 汇总信息并发送邮件 hosts: localhost tasks: - name: 生成汇总报告内容 set_fact: report_content: | 所有服务器版本信息汇总: {% for host in groups['all'] %} - {{ hostvars[host]['ansible_hostname'] }}: {{ hostvars[host]['server_version']['stdout'] }} {% endfor %} - name: 发送汇总邮件 mail: from: server@email.com to: user@email.com subject: 服务器版本信息汇总报告 body: "{{ report_content }}"
关键改动说明
- 第一个play只负责干活:针对所有主机执行版本收集,把结果存在
server_version变量里,这一步每台主机都会跑,但不会发邮件。 - 第二个play只在localhost上执行:
- 用
set_fact配合Jinja2循环,遍历所有主机,通过hostvars调取每台机器的主机名和之前收集的版本信息,生成整齐的汇总内容。 - 最后调用一次
mail模块,把所有信息打包成一封邮件发出去,彻底解决邮件轰炸的问题。
- 用
额外优化小技巧
- 不用shell命令也能拿版本信息,直接用Ansible内置变量更靠谱:
- name: 检查系统版本(内置变量方式) set_fact: server_version: "{{ ansible_distribution }} {{ ansible_distribution_version }} ({{ ansible_distribution_release }})" - 想要邮件格式更美观,可以把
report_content写成HTML格式,然后在mail模块里加个subtype: html参数。
内容的提问来源于stack exchange,提问作者chitraljain
相关产品推荐
相关产品推荐

