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

关于Ansible月度补丁通知:如何按主机组发送含所有主机名的邮件

解决办法

当然可以实现只发一封包含所有目标主机的邮件!问题出在当前的pre_task会在每台目标主机上都执行一次,再加上用了{{ inventory_hostname }}变量,自然会逐台发送通知。我们可以通过两个关键调整来搞定这个需求:

  1. 让邮件任务只执行一次,而不是每台主机都跑一遍
  2. 引用组内所有主机名来替换单台主机的inventory_hostname

下面是修改后的完整配置:

hosts: groupOne
become: true
any_errors_fatal: true
pre_tasks:
  - name: Notification email of patching beginning
    mail:
      host: XXXXXXXXXXXXXXXXXXXXX.com
      port: XXXXXX
      to: hello@gmail.com
      sender: patching@gmail.com
      subject: Patching_Notification
      body: |
        Monthly patching is about to commence for the following servers:
        {% for host in groups['groupOne'] %}
        - {{ host }}
        {% endfor %}
        A further email will be sent on completion
    delegate_to: localhost  # 让任务在控制机本地执行,无需在目标服务器配置邮件环境
    run_once: true          # 强制任务仅执行一次,不受目标主机数量影响

关键细节说明:

  • run_once: true:确保邮件任务只会被触发一次,彻底避免逐台发送的问题
  • delegate_to: localhost:把邮件发送任务转移到你的Ansible控制机执行,不需要在每台目标服务器上配置邮件客户端
  • groups['groupOne']:Ansible的内置变量,直接获取groupOne组内的所有主机列表,配合Jinja2循环可以清晰列出每台主机
  • 用|定义多行邮件体,让内容格式更易读,收件人能一眼看到所有待补丁的服务器

如果偏好把主机名用逗号分隔成一行,也可以简化邮件内容部分:

body: "Monthly patching is about to commence for {{ groups['groupOne'] | join(', ') }}. A further email will be sent on completion"

这样就能一次性发送一封包含所有目标主机的通知邮件了!

内容的提问来源于stack exchange,提问作者rm916463

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:25:00