我们使用 nagios 已有一段时间了,最近决定改变接收警报的方式。为此,我们安装了 twurl (https://github.com/marcel/twurl) 并使用它发送警报。不幸的是,这会将警报记录为已发送,但没有警报到达监视器的 Twitter 帐户。twurl 使用一个非常标准的 CLI,如下所示(nagios 宏保持不变):
/usr/local/bin/twurl -d "status=d @$CONTACTEMAIL$ $NOTIFICATIONTYPE$: $TIME$ : $HOSTALIAS$ / $SERVICEDESC$ is $SERVICESTATE$ ($SERVICEOUTPUT$)" /1/statuses/update.xml
这是通知命令:
define command {
command_name notify-service-by-twurl
command_line PATH="/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/nagios/bin"; HOME="/home/nagios"; /usr/local/bin/twurl -d "status=d @$CONTACTEMAIL$ $NOTIFICATIONTYPE$: $TIME$ : $HOSTALIAS$ / $SERVICEDESC$ is $SERVICESTATE$ ($SERVICEOUTPUT$)" /1/statuses/update.xml &>/tmp/lastcheck
# command_line /bin/echo '/usr/local/bin/twurl -d "status=d @$CONTACTEMAIL$ $NOTIFICATIONTYPE$: $TIME$ : $HOSTALIAS$ / $SERVICEDESC$ is $SERVICESTATE$ ($SERVICEOUTPUT$)" /1/statuses/update.xml' > /tmp/foo
}
语法工作正常等,没有问题。第一行触发第二行命令行以输出 nagios 使用的宏的内容,并返回所有情况下的预期内容。
我们确实避免了 twurl 陷阱:
- 我们已经为 nagios 用户授权了 twitter(已登录并检查,手动操作可以正常工作)。
- 应用程序的凭证正确(再次强调,手动使用 twurl 时运行良好)
- Twitter 应用程序的设置(http://dev.twitter.com)正确(设置为读/写直接消息等)
我可以提供任何人可能需要的任何特定信息,以提供额外的背景信息,但现在就这些了。编辑:我开始怀疑这是由于 nagios 本身调用 twurl 时缺少 .profile 造成的,但我不能 100% 确定,仍然无法让它“运行”。
更新:确定脚本在 nagios 执行时未使用 nagios 主目录中的 .twurlrc。这个问题我仍无法解决,如能得到任何其他帮助,我将不胜感激。
答案1
Nagios 运行外部命令时无需任何 ENV。要模拟这种情况,您可以尝试通过“env -i”运行手动测试。您似乎已经知道这一点,因为您明确设置了 PATH 和 HOME。您应该尽量避免这种情况,并在任何脚本/命令/等中使用完整路径。
您可能还需要转义命令行中的一些非字母数字字符,因为 shell 可能会忽略它们。要测试这一点,您可以在 nagios.cfg 中启用调试输出(请参阅“debug_level”http://nagios.sourceforge.net/docs/3_0/configmain.html)或者将命令更改为“echo ... > /tmp/whatisnagiosrunning.txt”或类似的。
答案2
找到了一种可以解决问题的方法(并且也可能有助于 twurl,因此这不会破坏其他东西!)。
在 rcfile.rb 中(我的是 /usr/local/lib/ruby/gems/1.8/gems/twurl-0.6.5/lib/twurl/rcfile.rb)进行以下更改。以下是原始版本:
module Twurl
class RCFile
FILE = '.tqurlrc'
@directory ||= ENV['HOME']
class << self
attr_accessor :directory
以下是修改内容:
module Twurl
class RCFile
FILE = '.twurlrc'
@directory ||= '/home/nagios/'
class << self
attr_accessor :directory
这可能应该接受用户输入 - 在不久的将来,我可能会自己为此做出贡献。
感谢所有帮助过的人:)