![正交定义主机/主机组的服务和联系人?](https://linux22.com/image/636855/%E6%AD%A3%E4%BA%A4%E5%AE%9A%E4%B9%89%E4%B8%BB%E6%9C%BA%2F%E4%B8%BB%E6%9C%BA%E7%BB%84%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%92%8C%E8%81%94%E7%B3%BB%E4%BA%BA%EF%BC%9F.png)
我正在尝试将我们的 Icinga spaghetti 变成更易于管理且重复性更低的东西。到目前为止,模板、对象继承、多重继承、主机组、服务组等功能已经满足了我的需求,但我在一个方面遇到了困难。
TL;DR:我如何告诉 Icinga,如果该主机是特定主机组的成员,我想向所有成员主机添加一个新的联系人组和服务,甚至针对主机也是其成员的不同主机组定义的服务?
我有两组正交主机组 - 一组针对主机类型,与主机类型相关的服务和服务依赖项相关联,例如“PostgreSQL 服务器”。另一组组确定节点的责任区域以及谁需要关注每个节点。
我需要根据主机组确定的责任范围,将联系规范应用于服务 - 并且想要这样做没有必须为每个(主机类型、责任区域)主机组对覆盖每个服务。
因此,假设我定义了一个主机组“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
例如
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
}
对于较多主机,可以使用多个主机模板继承,以减少重复。
然而,据我所知,这不会导致服务通过使主机成为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... |
+----------+ |
+----------------------+
我如何告诉 Icinga,如果该主机是主机组的成员,servers_for_bob
我想将联系人添加bob
到所有成员主机和服务,即使是通过主机组继承隐式定义的主机和服务?
我有看到模糊地提到使用主机和服务升级来解决这个问题,但还不知道该怎么做。
这似乎是一个常见的要求,但我不知道下一步该怎么做。帮忙吗?
答案1
你可以通过升级来实现。我们使用它来向我们的 NOC 团队发送短信。
define serviceescalation {
service_description *
host_name first_host, second_host
first_notification 4
last_notification 10
notification_interval 20
contacts NOC
}
答案2
虽然这看起来很容易,但显然并非如此。您很可能只有 2 个解决方案:
1) 确保每个服务器定义模板不会以多个服务器组中的服务器结尾,从而有可能将联系人放入服务器模板中。
2) 使用一些自动化工具来生成您的配置,并使其尽可能简单(在工具中会很简单)。我们一直在使用 Puppet 来处理 nagios 配置,虽然它会生成大量配置,但没关系,因为生成它的代码基于一些非常简单的模板。