Monthly Archives: 十一月 2014

zabbix中remote command 执行两次的异常分析和解决

这篇文章写的

众所周知(?),zabbix是一款强大得令人发指的企业级的用于可用性和性能监控的软件。在我们得知zabbix之后就开始大面积使用它作为服务的监控了。

事情源于我们的一个需求:在某个特定trigger被触发后,除了发邮件通知管理员以外,自动执行恢复自定义脚本尝试恢复服务。
在了解到有个概念叫做“Remote Command”后,我便添加了如下一个Action(具体方法在参考文档里面有提及):

zabbix_action_1

它在特定Conditions下:

zabbix_condition_1会自动执行以下Operations:

zabbix_operation_1Operations具体如下:

zabbix_operation_2看起来就是发送一封邮件给CIPHER。
So easy是不是?在配置好该Action后,我便愉快的触发了LogServer。

但是情况有变:我收到了两封邮件!

如果把Commands改为执行其它命令,是不是也意味着这个命令会被执行两次?
当然是的。

这肯定是不行的。我叫你执行一次,你就执行一次。这么不听话的执行两次是为了什么?

我百思不得其解。

出于我对Action的不够了解,我做了一些改变(瞎改)。

果然不出我所料 🙁 ,它还是给我发了两封邮件。

于是我使出了大招:

zabbix_google_1
我是如此的幸运,全片Google只有一条而且是第一条是相关的资料。
于是我打开了这个链接,通篇有几句对话:

zabbix_google_2
这么简单的几句居然解决了那位兄台的问题。

这特么是啥意思?我怎么完全没看出来keypoint在哪?

我苦思冥想(==发呆)并对Operations的一堆参数作了各种修改,还是没有解决问题。

数个小时过后,我决定先解决”三急之一“。

就在我回来的路上,我想到了!

啊!我想到了!
神奇的厕所!
你就像是一盏启明灯启发着我前进。
假如我是个诗人,
我一定要写1024首诗歌来赞美你!

关键确实是在Condition!
但还有一句更关键的啊:

zabbix_google_3
于是,我做出了大胆的假设:

这个Condition被触发的条件
有两种可能啊!

    1. Trigger触发了!
    2. Trigger恢复了!

当然,第二种可能是我猜的,但我估计八九不离十了。

所以那位兄台说的是,Action会在两种可能下被执行:“好->坏”和“坏->好”。

万万没想到啊!这特么还是Trigger吗?

不管是不是,先小心求证看看那,加上这个条件:

zabbix_condition_2

再一次如我所料,它成功了!它成功执行了!它成功执行了一次!有且只有一次!

其实,根据zabbix的官方文档,这个"Trigger value = PROBLEM"和"Maintenance status not in maintenance"在Action创建之初是会自动加入到Conditions里面去的。
从zabbix的官方文档上也可以看到:

Trigger value:

    * If a trigger changes status from OK to PROBLEM, trigger value is PROBLEM
    * If a trigger changes status from PROBLEM to OK, trigger value is OK

这也说明了Trigger的值有两种,它并不是一个动作,而是一个状态值。


参考:

    1. https://www.zabbix.com/documentation/2.2/manual/config/notifications/action/operation/remote_command
    2. https://www.zabbix.com/documentation/2.0/manual/config/notifications/action/conditions
    3. https://www.zabbix.com/forum/showthread.php?t=26905