如何使用Notepad ++ / RegEx或其他方法从主机生成Nagios主机组列表

时间:2014-03-05 11:54:54

标签: regex notepad++ nagios

我正在使用Notepad ++,我想请求帮助以实现以下目标。

我有一些(几千行)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(注意它们应该以逗号分隔)。

有没有人知道如何自动化这个?

感谢您的时间:)

2 个答案:

答案 0 :(得分:3)

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

nagios.cfg:

use_regexp_matching=1

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

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

不幸的是,使用的正则表达式引擎不支持lookbehind / lookahead,否则这可以更容易和可靠地实现。实际上,您必须找到与所讨论的两个组相匹配但不匹配另一个组的表达式。

另外,为什么要设置与主机名相同的别名呢?

答案 1 :(得分:0)

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

我使用名为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地址的成员列表,所以除了“string members = ...”之外我只粘贴了这个,并且txt文件包含所有主机条目。 结果是一行以逗号分隔的主机名。正是我需要的。

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

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

快乐的一天。