Regex 如何使用记事本从主机生成Nagios主机组列表++/正则表达式或其他
我正在使用记事本+,我想寻求帮助以实现以下目标 我有一些(1000行)Nagios/Icinga配置,如下所示: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-
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;
}