【问题标题】:Is it possible to ack nagios alerts from the terminal?是否可以从终端确认 nagios 警报?
【发布时间】:2012-03-02 02:03:22
【问题描述】:

我已将 nagios 警报设置为通过带有 http 链接的 jabber 来确认。

是否有可能有一个脚本可以从远程工作站上的终端运行,该脚本将主机名作为参数并确认警报?

./ack 主机名

虽然看似平凡,但好处却是三倍的。首先,从 nagios 中移除 http 负载。其次,nagios http 页面可能需要 10-20 秒才能加载,所以我想在那里节省时间。第三,避免使用鼠标+网页界面+火狐/其他令人讨厌的慢速浏览器。

理想情况下,我想要一个绑定到键盘快捷键的脚本,该快捷键可以简单地确认最近的警报。最后,我想从操纵杆、按钮和诸如此类的东西中获取输入,并将一个连接到绑定到脚本的一个大红色按钮,这样我就可以通过点击按钮来确认最新的 nagios 警报 lol。 (如果按钮在外壳上有一个屏幕显示警报的文本得到确认大声笑)

随便取笑我,但这实际上对我有用。如果我可以为每个警报节省 5 秒,并且我每天需要 ack 收到 200 个警报,那么我每天可以节省 15 分钟。系统管理员的重点不就是自动化可以自动化的东西吗?

谢谢!

【问题讨论】:

    标签: scripting nagios


    【解决方案1】:

    是的,可以通过解析 /var/lib/nagios3/retention.dat 文件来确认 nagios。

    见:

    #!/usr/bin/env python
    # -*- coding: utf8 -*-
    # vim:ts=4:sw=4
    
    import sys
    
    file = "/var/lib/nagios3/retention.dat"
    
    try:
        sys.argv[1]
    except:
        print("Usage:\n"+sys.argv[0]+" <HOST>\n")
        sys.exit(1)
    
    f = open(file, "r")
    line = f.readline()
    
    c=0
    name = {}
    state = {}
    host = {}
    
    while line:
        if "service_description=" in line:
            name[c] = line.split("=", 2)[1]
        elif "current_state=" in line:
            state[c] = line.split("=", 2)[1]
        elif "host_name=" in line:
            host[c] = line.split("=", 2)[1]
        elif "}" in line:
            c+=1
    
        line = f.readline()
    
    for i in name:
        num = int(state[i])
    
        if num > 0 and sys.argv[1] == host[i].strip():
            print(name[i].strip("\n"))
    

    您只需将主机作为参数,脚本将显示损坏的服务。

    【讨论】:

    • 一点也不!我只是慢了哈哈。我也意识到我应该在服务器故障上发布这个。我假设您从 nagios 服务器运行脚本?我希望可以从远程工作站运行的东西,但我应该澄清这一点。
    • 是的,来自 nagios 服务器。您可以使用 ssh 在远程主机上执行相同操作:ssh nagios-server /path/to/executable/script.py
    猜你喜欢
    • 1970-01-01
    • 2022-12-19
    • 2012-12-27
    • 1970-01-01
    • 2021-05-07
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多