如何使用记事本++/正则表达式或其他方式从主机生成 Nagios 主机组列表



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

我有一些(几行 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",则应将其放入B组,其他所有内容应进入A组(请注意,它们应以逗号分隔)。

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

感谢您抽出宝贵时间:)

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

纳吉奥斯.cfg:

use_regexp_matching=1

.

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

不幸的是,所使用的正则表达式引擎不支持后视/前瞻,否则可以更轻松、更可靠地实现。实际上,您必须找到与一个组匹配的表达式,但对于两个组,则找不到另一个表达式。

附带说明一下,为什么要费心设置与主机名相同的别名?

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

我使用了名为 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("tt");
        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发布的内容。这样,我们可以更多地自动化它。

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

快乐的一天。

相关内容

  • 没有找到相关文章

最新更新