关于Ansible月度补丁通知:如何按主机组发送含所有主机名的邮件
解决办法
当然可以实现只发一封包含所有目标主机的邮件!问题出在当前的pre_task会在每台目标主机上都执行一次,再加上用了{{ inventory_hostname }}变量,自然会逐台发送通知。我们可以通过两个关键调整来搞定这个需求:
- 让邮件任务只执行一次,而不是每台主机都跑一遍
- 引用组内所有主机名来替换单台主机的
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
相关产品推荐
相关产品推荐

