You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为所有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:10:39