我正在使用记事本++,我想寻求帮助以实现以下目标。
我有一些(几行 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发布的内容。这样,我们可以更多地自动化它。
希望有人可以利用这些信息来获得优势:)
快乐的一天。