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

Regex 如何使用记事本从主机生成Nagios主机组列表++/正则表达式或其他,regex,notepad++,nagios,Regex,Notepad++,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-

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

我有一些(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(注意,它们应该用逗号分隔)

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


感谢您的时间:)

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

nagios.cfg:

use_regexp_matching=1

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

另一方面,为什么要费心设置与主机名相同的别名呢?

我通过一些帮助解决了这个问题

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

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;

 }
void Main()
{
列表行=GetLines();
列表主机名=新列表();
字符串成员=“10.0.1.191,10.0.1.193,10.0.107.190”;
foreach(members.Split(',')中的字符串成员)
{
var index=lines.FindIndex((s)=>s.Contains(member));
字符串别名行=行[索引+1];
int count=aliasLine.IndexOf(“\t\t”);
字符串hostName=aliasLine.Remove(0,计数+2);
hostNames.Add(主机名);
}
juin(“,”,主机名).Dump();
}
列表GetLines()
{
列表行=新列表();
使用(var sr=new StreamReader(“c:\\temp\\Nagios\u Host\u List.txt”)){
而(!sr.EndOfStream)
{
添加(sr.ReadLine());
}
}
回流线;
}
因为我已经有了一个成员列表,所有IP地址都在一个逗号分隔的行中,所以除了“stringmembers=…”和包含所有主机条目的txt文件之外,我还粘贴了这个列表。 结果是一行用逗号分隔的主机名。正是我需要的

它解决了我目前的具体问题。但是当我们将来从Nagios升级到Icinga时。我将考虑阿德里安·弗吕霍斯(Adrian Frühwirth)发表的文章。 这样我们可以使它更加自动化

希望有人能利用这些信息为您带来好处:)


祝您愉快。

谢谢您的回答。我继承了这个设置。所以我没有设置这个设置:)我可以接受一个一次性生成的列表,因为它是手动维护的。它将在将来某个时候更新。但现在不行。
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;

 }