【问题标题】:How to generate Nagios hostgroup list from hosts by using Notepad++/RegEx or other如何使用 Notepad++/RegEx 或其他从主机生成 Nagios 主机组列表
【发布时间】:2014-03-05 11:54:54
【问题描述】:

我正在使用记事本++,我想寻求帮助以实现以下目标。

我有一些(几 1000 行)Nagios/Icinga 配置,如下所示:

define host {
    use         generic-host
    host_name   FakeNameA-748-SomeNameA
    alias       FakeNameA-748-SomeNameA
    address     10.1.1.97
    }
define host {
    use         generic-host
    host_name   H548-AP02
    alias       H548-AP02
    address     172.19.115.190
    }
define host {
    use         generic-host
    host_name   FakeNameB-302-SomeNameB
    alias       FakeNameB-302-SomeNameB
    address     192.168.149.1
    }
define host {
    use         generic-host
    host_name   FakeNameC-902-Acronym
    alias       FakeNameC-902-Acronym
    address     192.168.48.1
    }
define host {
    use         generic-host
    host_name   H902-AP01
    alias       H902-AP01
    address     192.168.48.190
    }

我需要创建一些包含所有主机名的主机组,但分为两个组。

像这样:

define hostgroup {
    hostgroup_name    GroupA
    alias    GroupA
    members FakeNameA-748-SomeNameA,FakeNameB-302-SomeNameB,FakeNameC-902-Acronym
    }

define hostgroup {
    hostgroup_name    GroupB
    alias    GroupB
    members H548-AP02,H902-AP01
    }

如您所见,如果“host_name”包含“AP”,它应该进入 GroupB,其他所有内容都进入 GroupA(注意它们应该用逗号分隔)。

有没有人知道我可以如何实现自动化?

感谢您的宝贵时间:)

【问题讨论】:

    标签: regex notepad++ nagios


    【解决方案1】:

    如果您的主机名与示例中的架构匹配,您可以使用 Nagios 附带的正则表达式匹配动态地执行此操作:

    nagios.cfg:

    use_regexp_matching=1
    

    .

    define hostgroup {
        hostgroup_name  GroupA
        members         ^[^-]+-[0-9]+-[^-]$ 
    }
    
    define hostgroup {
        hostgroup_name  GroupB
        members         ^[^-]+-AP[0-9]+$
    }
    

    很遗憾,所使用的正则表达式引擎不支持后向/前瞻,否则可以更轻松可靠地实现。实际上,您必须为所讨论的两个组找到匹配一个组但不匹配另一个组的表达式。

    顺便说一句,您为什么要设置与主机名相同的别名?

    【讨论】:

    • 感谢您的回答。我继承了这个设置。所以我没有设置这个设置:) 我可以只使用一个一次性生成的列表,因为它是手动维护的。它将在未来的某个时候更新。但目前不是。
    【解决方案2】:

    我解决了这个问题(在一些帮助下;))。

    我使用了名为LINQPad的程序,代码如下:

    void Main()
    
     {
        List<string> lines= GetLines();
        List<string> hostNames = new List<string>();
        string members = "10.0.1.191,10.0.1.193,10.0.107.190";
        foreach(string member in members.Split(','))
        {
            var index = lines.FindIndex((s) =>            s.Contains(member));
            string aliasLine = lines[index + 1];
            int count = aliasLine.IndexOf("\t\t");
            string hostName = aliasLine.Remove(0, count + 2);
            hostNames.Add(hostName);
        }
    
        string.Join(",",hostNames).Dump();
    
     }
    
    List<string> GetLines()
     {
        List<string> lines = new List<string>();
        using (var sr = new StreamReader("c:\\temp\\Nagios_Host_List.txt")) {
            while (!sr.EndOfStream)
            {
                lines.Add( sr.ReadLine());
            }
        }
        return lines;
    
     }
    

    因为我已经有一个成员列表,其中所有 IP 地址都放在一个逗号分隔的行中,所以我只是将其粘贴在“字符串成员 = ...”之外,并且 txt 文件包含所有主机条目。 结果是一行以逗号分隔的主机名。正是我需要的。

    它解决了我目前的具体问题。但是当我们将来从 Nagios 升级到 Icinga 时。我会考虑#Adrian Frühwirth 发布的内容。 这样我们就可以更加自动化。

    希望有人可以利用这些信息来获得优势:)

    快乐的一天。

    【讨论】:

      猜你喜欢
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 2022-08-18
      • 1970-01-01
      • 2019-02-03
      相关资源
      最近更新 更多