正交定义主机/主机组的服务和联系人?

我正在努力把我们的Icinga面条变成更可pipe理,更less重复的东西。 到目前为止,模板,对象inheritance,多inheritance,主机组,服务组等function已经满足我的需求,但我坚持一个方面。


TL; DR:如何告诉Icinga,如果该主机是特定主机组的成员,我想为所有成员主机和服务添加一个新的联系人组,即使是针对主机也是其成员的不同主机组定义的服务?


我有两组正交的主机组 – 一个用于主机types,与主机types关联的服务和服务依赖关系相关联,例如“PostgreSQL服务器”。 另一组小组确定节点的责任区域以及需要关心每个节点的人员。

我需要根据确定责任区域的主机组将联系规范应用于服务,并且希望这样做, 不必为每个(主机types,责任区域)主机组对覆盖每个服务。

所以,我说定义一个主机组“postgresql_servers”和相关的服务“postgresql_connection”:

define hostgroup { hostgroup_name postgres_servers alias All PostgreSQL servers } define service { use some_service_template hostgroup_name postgres_servers contact_groups support_engineers_notifications service_description POSTGRES_CONNECTION check_command check_dummy!2!"Passive check failed" } 

然后我有一个主机组“servers_for_bob”和一个联系人“bob”,它们还没有相互关联:

 define hostgroup { hostgroup_name servers_for_bob, alias These are for Bob } define contact { contact_name bob alias bob: Bob B. use some_contact_template } define contactgroup { contactgroup_name team_bob members bob } 

现在,很容易让一个主机成为这两个主机组的成员:

 define host { use some_host_template host_name buildingthings.example.com hostgroups servers_for_bob, postgres_servers alias The first thing bob built } 

…在这个过程中,它会得到所有的服务定义对postgres_servers ,如POSTGRES_CONNECTION 。 但是服务通知将只会转到support_engineers_notifications如在基本服务POSTGRES_CONNECTION上定义的那样)。

现在,我想通知team_bob主机有问题或任何服务有问题 。 没有重新宣布所有这些服务。

对于主机,我可以在contact_groups对象inheritance中使用合并规则

 define host { use some_host_template host_name buildingthings.example.com hostgroups servers_for_bob, postgres_servers alias The first thing bob built contact_groups +team_bob } 

而对于更多的主机,可以使用多个主机模板inheritance来减less重复。

但是,AFAIK不会导致通过使主机成为postgres_servers隐式定义的服务team_bob发送通知。

这是拓扑结构:

 +--------------------------------------+ +-----------+ | | | Contact: | | Hostgroup: | | Team Bob | | postgresql_servers <--????--+ | | | ^^^^ | | | | how? +-----------+ | | | +----------------------------------------+ | | | | | | | | | | +-------------------------+ | | | | |-------------------------| | | | | || || | | | | || Host buildingthings || | | | | || hostgroups: || | | | | || postgres_servers, || | | | | || servers_for_bob || | | | | || || | | | | || || | | | | || || | | | | || || | | | | || || | | | | |-------------------------| | | | | +-------------------------+ | | | | | | +--------------------------------------+ | +----------------------+ | | | | | | | Service: | | <-------+ POSTGRES_CONNECTION | | | | | | Hostgroup | | | | servers_for_bob | +----------------------+ | ^ | +----------------------------------------+ +---------+------------+ | | More services... | +----------+ | +----------------------+ 

(感谢http://asciiflow.com/ )

我如何告诉Icinga,如果该主机是主机组的成员servers_for_bob我想添加联系bob到所有成员主机和服务,甚至那些通过主机组inheritance隐式定义?

我已经看到模糊的提及使用主机和服务升级来解决这个问题 ,但一直没能弄清楚。

这似乎是一个共同的要求,但我不知道该从哪里出发。 帮帮我?

你可以做升级。 我们用它发送短信给我们的NOC团队。

 define serviceescalation { service_description * host_name first_host, second_host first_notification 4 last_notification 10 notification_interval 20 contacts NOC } 

虽然这似乎是小菜一碟,显然它不是:)。 你最有可能只有2个解决scheme:

1)确保每个服务器定义模板都不会以更多服务器组中的服务器结束,从而可能将联系人放入服务器模板中。

2)使用一些自动化工具来生成你的configuration,并保持蓬松,因为它可以得到(这将是简单的工具)。 我们一直在使用Puppet来处理nagios的configuration,并且,当它产生大量的configuration时,没关系,因为生成它的代码是基于一些相当简单的模板。