Nagios通过Postfix中继SMTP发邮件未读取contacts.cfg配置问题
我之前帮同事排查过几乎一模一样的情况——配置了Postfix中继,也改了commands和contacts配置,但Nagios就是死活不用自定义邮箱,反而默认发件人是<oem>。结合你给出的Postfix日志(uid=1002 from=<oem>),下面是几个最可能的排查和修复方向:
1. 先确认Nagios真的在加载你的contacts.cfg
打开Nagios主配置文件nagios.cfg,检查有没有正确包含contacts.cfg的路径:
vi /usr/local/nagios/etc/nagios.cfg
找cfg_file或cfg_dir配置项,必须有类似这样的行:
# 直接指定文件 cfg_file=/usr/local/nagios/etc/objects/contacts.cfg # 或者加载整个目录(如果contacts.cfg在这个目录里) cfg_dir=/usr/local/nagios/etc/objects
如果没找到,手动添加后重启Nagios:
systemctl restart nagios
很多人都会忽略这一步——Nagios不会自动加载所有.cfg文件,必须明确指定。
2. 检查contacts.cfg的语法和配置正确性
Nagios对配置语法的要求极其严格,哪怕一个括号漏写、参数拼错,整个文件都会被忽略。用自带的校验工具扫一遍:
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
如果输出里有contacts.cfg相关的错误,比如Missing closing '}'或者Invalid contact directive,先把这些错误修复。重点检查:
- 联系人定义里的
email参数是否正确:define contact { contact_name nagiosadmin use generic-contact alias Nagios Admin email your-alert-mail@example.com # 这里必须是你要用来发告警的邮箱 } - 对应的主机/服务模板里,有没有把这个联系人加入
contact_groups或者contacts配置项,不然告警根本不会触发到这个联系人。
3. 确认commands.cfg里的邮件命令用对了变量
你在commands.cfg里定义的邮件命令,必须正确引用$CONTACTEMAIL$变量,这个变量会自动从contacts.cfg里拉取对应联系人的邮箱。比如标准的邮件告警命令应该是这样:
define command { command_name notify-host-by-email command_line /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost: $HOSTNAME$\nState: $HOSTSTATE$\nAddress: $HOSTADDRESS$\nInfo: $HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n" | /usr/bin/mailx -s "** $NOTIFICATIONTYPE$ Host Alert: $HOSTNAME$ is $HOSTSTATE$ **" $CONTACTEMAIL$ }
如果这里写成了固定邮箱(比如admin@example.com),或者变量名写错(比如少了一个$,写成CONTACTEMAIL),Nagios就会用默认的发件人。
4. 检查Nagios用户的权限和邮件工具可用性
Postfix日志里的uid=1002应该是运行Nagios的用户(一般是nagios),先确认这个用户能读取contacts.cfg:
ls -l /usr/local/nagios/etc/objects/contacts.cfg
确保文件的所有者/组是nagios,权限至少是644。然后切换到nagios用户手动测试发邮件,排除邮件工具的问题:
su - nagios echo "Test Nagios Alert" | mailx -s "Test Mail" your-alert-mail@example.com
如果测试邮件能正常收到,说明Postfix中继和邮件工具都没问题,问题还是出在Nagios的配置加载上。
5. 查看Nagios自身的日志找线索
除了Postfix日志,一定要看Nagios的运行日志(默认路径是/usr/local/nagios/var/nagios.log),里面会有配置加载失败、联系人未关联的详细错误,比如:
[1521985205] Error: Could not find contact 'nagiosadmin' in host notification list for host 'localhost'!
这类日志能直接定位到问题,比如联系人没被正确绑定到主机或服务的告警规则里。
最后验证
修复完所有问题后,先再跑一遍配置校验:
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
确认没有错误后重启Nagios,然后手动触发一个测试告警(比如把某个服务停掉),再看Postfix日志,应该就能看到from=<your-alert-mail@example.com>,而不是<oem>了。
内容的提问来源于stack exchange,提问作者Nachiketh

