我正在使用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(注意它们应该以逗号分隔)。
有没有人知道如何自动化这个?
感谢您的时间:)
答案 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发布的内容。 这样我们就可以更自动化了。
希望有人可以利用这些信息获得优势:)
快乐的一天。