监测基础知识¶
Icinga 2文档的这一部分概述了运行Icinga 2所需了解的所有基本监控概念。请记住,这些示例是用Linux服务器创建的。如果您使用的是Windows,则需要相应地更改服务。看到ITL参考为进一步的信息。
属性值类型¶
Icinga 2配置使用不同的属性值类型。
类型 | 例子 |
---|---|
数量 | 5 |
持续时间 | 1米 |
字符串 | “这些都是笔记” |
布尔 | 真正的 |
数组 | ["value1", "value2"] |
字典 | {"key1" = "value1", "key2" = false} |
为对象属性使用正确的值类型是很重要的,否则配置验证将会失败。
主机和服务¶
Icinga 2可用于监控主机和业务的可用性。主机和服务实际上可以是任何可以通过某种方式进行检查的东西:
- 网络服务(HTTP、SMTP、SNMP、SSH等)
- 打印机
- 交换机或路由器
- 温度传感器
- 其他本地或网络可访问的服务
主机对象提供了一种机制来对运行在同一物理设备上的服务进行分组。
下面是一个宿主对象的例子,它定义了两个子服务:
object主机"my-server1"{地址= "10.0.0.1" check_command = "hostalive"} object服务"ping4" {host_name = "my-server1" check_command = "ping4"} object服务"http" {host_name = "my-server1" check_command = "http"}
该示例创建了两个服务ping4
而且http
哪些属于主机my-server1
.
它还指定主机应该使用hostalive
检查命令。
的地址
属性被检查命令用来确定哪个网络地址与主机对象相关联。
可以找到关于故障排除检查问题的详细信息在这里.
主机状态¶
主机有以下几种状态:
的名字 | 描述 |
---|---|
向上 | 已准备待更换的主机。 |
下来 | 主机不可用。 |
服务状态¶
服务可以处于以下任一状态:
的名字 | 描述 |
---|---|
好吧 | 服务运行正常。 |
警告 | 该服务正在经历一些问题,但仍被认为是在工作状态。 |
至关重要的 | 检查成功地确定服务处于紧急状态。 |
未知的 | 检查无法确定服务的状态。 |
检查结果状态映射¶
检查插件返回一个退出码,该退出码被转换为状态号。服务直接映射各州,而主机则负责处理0
或1
作为向上
为例。
价值 | 主机状态 | 服务状态 |
---|---|---|
0 | 向上 | 好吧 |
1 | 向上 | 警告 |
2 | 下来 | 至关重要的 |
3. | 下来 | 未知的 |
软硬两种状态¶
当检测到主机/服务的问题时,Icinga会重新检查该对象很多次(基于max_check_attempts
而且retry_interval
设置)。这可以确保不会为短暂故障发送不必要的通知。在此期间,对象处于软
状态。
当所有的检查都执行完后,该对象仍然处于非ok状态,主机/服务切换到一个硬
发送状态和通知。
的名字 | 描述 |
---|---|
硬 | 主机/服务的状态最近没有改变。check_interval 在这里也同样适用。 |
软 | 主机/服务最近更改了状态,正在重新检查retry_interval . |
主机和服务检查¶
主机和服务通过定期运行检查来确定它们的状态。
Host "router" {check_command = "hostalive" address = "10.0.0.1"}
的hostalive
命令是几个内置检查命令之一。向指定的IP地址发送ICMP回显请求地址
属性用于判断主机是否在线。
提示
hostalive
就等于平
但默认阈值不同。都使用的平
顺序检查命令。如果您需要更快的ICMP检查,请查看icmpCheckCommand。
还有很多其他的内置检查命令也可用。除了这些命令之外,接下来的几章将详细解释如何设置你自己的检查命令。
主机检查方案¶
如果主机无法通过ICMP、HTTP等方式访问,您还可以使用假CheckCommand设置默认状态。
object Host“dummy- Host”{check_command =“dummy”vars。dummy_state = 0 //Up vars。假_text = "Everything OK." }
在发送时也使用此方法外部检查结果.
一种更高级的技术是基于所有服务计算总体状态。这是描述在这里.
模板¶
模板可用于将一组相同的属性应用于多个对象:
Service "generic-service" {max_check_attempts = 3 check_interval = 5m retry_interval = 1m enable_perfdata = true} apply Service "ping4" {import "generic-service" check_command = "ping4" assign where host。Service "ping6" {import "generic-service" check_command = "ping6"分配主机。address6}
在本例中ping4
而且ping6
服务从模板继承属性通用服务
.
对象和模板本身都可以导入任意数量的其他模板。如果需要,可以在对象中重写从模板继承的属性。
也可以导入已有的非模板对象。
请注意
模板和对象共享相同的命名空间,也就是说,你不能定义一个像对象一样有相同名字的模板。
多个模板¶
下面的示例使用自定义变量在每个模板中都提供了。的的网络服务器
模板被用作任何提供web服务的主机的基本模板。除此之外,它还指定了自定义变量webserver_type
,如。apache
.由于该模板也是基模板,所以我们导入generic-host
这里的模板。这提供了check_command
属性的默认值,以后我们不需要在任何地方设置它。
导入“generic-host”vars = {webserver_type =“apache”}}
的wp-server
host模板指定一个Wordpress实例并设置application_type
自定义变量。请注意,+ =
操作符这增加了字典项,但不覆盖前面的任何项var
属性。
模板主机“wp-server”{vars += {application_type = "wordpress"}}
最后的主机对象导入两个模板。这里的顺序很重要:首先是基本模板的网络服务器
添加到对象中,然后从wp-server
对象。
对象主机“wp.example.com”{import "web-server" import "wp-server"地址= "192.168.56.200"}
如果要重写从模板继承的特定属性,可以在主机对象上指定它们。
对象主机“wp1.example.com”{导入“web-server”导入“wp-server”变量。webserver_type= "nginx" //overrides attribute from base template address = "192.168.56.201" }
自定义变量¶
除了内置对象属性之外,您还可以在var
属性。
提示
这就是所谓的
自定义变量
整个文档,后端和web界面。旧的文档版本将其称为
自定义属性
.
下面的示例指定了密钥ssh_port
作为自定义变量,并分配一个整数值。
object主机“localhost”{check_command =“ssh”变量。Ssh_port = 2222}
var
是一个字典可以将特定的键设置为值。上面的例子使用了较短的索引器语法。
另一种表达方式可以这样写:
Vars = {ssh_port = 2222}
或
var(“ssh_port”)= 2222
自定义变量值¶
自定义变量的有效值包括:
还可以定义嵌套值,比如字典中的字典。
本例定义了自定义变量磁盘
作为字典。第一个键设置为磁盘/
本身设置为具有一个键值对的字典。
var。磁盘["disk /"] = { disk_partitions = "/" }
这可以写成这样的解析结构:
Vars = {disks = {"disk /" = {disk_partitions = "/"}}}
在尝试访问apply规则或函数中的特定子键时,请记住这一点。
另一个例子显示在示例配置中:
var。不ification["mail"] = { groups = [ "icingaadmins" ] }
它定义了通知
自定义变量作为具有键的字典邮件
.它的值是一个带有键的字典组
它本身有一个数组作为值。注意:这个数组与user_groups
属性通知应用规则预计。
var。不ification = { mail = { groups = [ "icingaadmins" ] } }
函数作为自定义变量¶
Icinga 2允许您指定功能自定义变量。这里的特殊情况是,每当Icinga 2需要这样一个自定义变量的值时,它就会运行函数并使用函数返回的任何值:
object CheckCommand "random-value" {command = [PluginDir + "/check_dummy", "0", "$text$"] vars。text = {{Math.random() * 100}}}
此示例使用缩写λ语法.
这些函数可以访问许多变量:
变量 | 描述 |
---|---|
用户 | User对象(用于通知)。 |
服务 | Service对象(用于服务检查/通知/事件处理程序)。 |
宿主 | 宿主对象。 |
命令 | 命令对象(例如用于检查的CheckCommand对象)。 |
这里有一个例子:
var。Text = {{host。check_interval}}
除了这些变量之外宏函数可用于检索任意宏表达式的值:
var。text = {{if(宏("$address$") == "127.0.0.1") {log("正在检查localhost!")} return "Some text"}}
的resolve_arguments
函数可以用于解析命令及其参数,其方式与Icinga解析命令及其参数的方式大致相同命令
而且参数
属性的命令。的by_ssh
command使用这个功能来让用户指定应该通过SSH执行的命令和参数:
参数= {"-C" = {{var command =宏("$by_ssh_command$") var arguments =宏("$by_ssh_arguments$") if (typeof(command) == String && !arguments){返回命令}var escaped_args = [] for (arg in resolve_arguments(command, arguments)) {escaped_args.add(escape_shell_arg(arg))}返回escaped_args。Join(" ")}}…}
在运行时访问这些函数中的对象属性的方法中进行了描述高级的主题一章。
运行宏¶
宏可用于访问其他对象的属性和自定义变量在运行时。例如,它们在命令定义中用于确定应该针对哪个IP地址运行检查:
object CheckCommand "my-ping" {command = [PluginDir + "/check_ping"] arguments = {"-H" = "$ping_address$" "-w" = "$ping_wrta$,$ping_wpl$%" "-c" = "$ping_crta$,$ping_cpl$%" "-p" = "$ping_packets$"} //从主机属性或自定义变量解析。var。平_address = "$address$" // Default values vars.ping_wrta = 100 vars.ping_wpl = 5 vars.ping_crta = 250 vars.ping_cpl = 10 vars.ping_packets = 5 } object Host "router" { check_command = "my-ping" address = "10.0.0.1" }
在本例中,我们使用解决美元
宏来引用主机的地址
属性。
我们也可以直接引用自定义变量,例如使用ping_wrta美元
.Icinga会自动尝试为您指定的属性寻找最接近的匹配。下一节将解释具体的规则。
请注意
当使用
$
Sign为单个字符,必须使用额外的美元字符($ $
).
评估顺序¶
当执行命令时,Icinga 2会按此顺序检查以下对象,以查找宏及其各自的值:
- 用户对象(仅用于通知)
- 服务对象
- 宿主对象
- 命令对象
- 控件中的全局自定义变量
var
常数
此执行顺序允许您为命令对象中的自定义变量定义默认值。
下面是重写自定义变量的方法ping_packets
在前面的例子中:
object服务"ping" {host_name = "localhost" check_command = "my-ping" vars. object服务"ping" {host_name = "localhost" check_command = "my-ping" vars. "ping_packets = 10 //覆盖命令中给出的默认值5
如果在任何地方都没有定义自定义变量,则使用空值并向Icinga 2日志写入警告。
你也可以通过指定完整的属性名来直接引用特定的属性,从而忽略这些求值规则:
service.vars.ping_wrta美元
的值ping_wrta
服务的自定义变量。如果服务没有这样的自定义变量,那么无论主机等其他对象是否具有此属性,都会返回一个空值。
主机运行宏¶
以下主机自定义变量在针对主机或服务执行的所有命令中都可用:
的名字 | 描述 |
---|---|
host.name | 主机对象的名称。 |
host.display_name | 的值display_name 属性。 |
host.state | 主机当前状态。可以是其中之一遥不可及的 ,向上 而且下来 . |
host.state_id | 主机当前状态。可以是其中之一0 (),1 (下),2 (访问)。 |
host.state_type | 主机当前的状态类型。可以是其中之一软 而且硬 . |
host.check_attempt | 当前的检查尝试次数。 |
host.max_check_attempts | 在变为硬状态之前执行的最大检查次数。 |
host.last_state | 主机之前的状态。可以是其中之一遥不可及的 ,向上 而且下来 . |
host.last_state_id | 主机之前的状态。可以是其中之一0 (),1 (下),2 (访问)。 |
host.last_state_type | 主机之前的状态类型。可以是其中之一软 而且硬 . |
host.last_state_change | 上次状态更改的时间戳。 |
host.downtime_depth | 活动停机时间的数量。 |
host.duration_sec | 自上次状态变化以来的时间。 |
host.latency | 主机检查时延。 |
host.execution_time | 主机检查执行时间。 |
host.output | 最后一次检查的输出。 |
host.perfdata | 最后检查的性能数据。 |
host.last_check | 执行最后一次检查的时间戳。 |
host.check_source | 执行上次检查的监视实例。 |
host.num_services | 与主机关联的服务数量。 |
host.num_services_ok | 与主机关联的服务数量好吧 状态。 |
host.num_services_warning | 与主机关联的服务数量警告 状态。 |
host.num_services_unknown | 与主机关联的服务数量未知的 状态。 |
host.num_services_critical | 与主机关联的服务数量至关重要的 状态。 |
除了这些特定的运行时宏宿主对象属性也可以被访问。
服务运行时宏¶
以下服务宏在服务执行的所有命令中都是可用的:
的名字 | 描述 |
---|---|
service.name | 服务对象的短名称。 |
service.display_name | 的值display_name 属性。 |
service.check_command | 命令的短名称以及用于检查的任何参数。 |
service.state | 服务的当前状态。可以是其中之一好吧 ,警告 ,至关重要的 而且未知的 . |
service.state_id | 服务的当前状态。可以是其中之一0 (好),1 (警告)2 (关键)3. (未知的)。 |
service.state_type | 服务的当前状态类型。可以是其中之一软 而且硬 . |
service.check_attempt | 当前的检查尝试次数。 |
service.max_check_attempts | 在变为硬状态之前执行的最大检查次数。 |
service.last_state | 服务以前的状态。可以是其中之一好吧 ,警告 ,至关重要的 而且未知的 . |
service.last_state_id | 服务以前的状态。可以是其中之一0 (好),1 (警告)2 (关键)3. (未知的)。 |
service.last_state_type | 服务以前的状态类型。可以是其中之一软 而且硬 . |
service.last_state_change | 上次状态更改的时间戳。 |
service.downtime_depth | 活动停机时间的数量。 |
service.duration_sec | 自上次状态变化以来的时间。 |
service.latency | 服务检查时延。 |
service.execution_time | 服务的检查执行时间。 |
service.output | 最后一次检查的输出。 |
service.perfdata | 最后检查的性能数据。 |
service.last_check | 执行最后一次检查的时间戳。 |
service.check_source | 执行上次检查的监视实例。 |
除了这些特定的运行时宏服务对象属性也可以被访问。
命令运行宏¶
以下自定义变量在所有命令中都是可用的:
的名字 | 描述 |
---|---|
command.name | 命令对象的名称。 |
用户运行宏¶
以下自定义变量在用户执行的所有命令中都可用:
的名字 | 描述 |
---|---|
user.name | 用户对象的名称。 |
user.display_name | 的值display_name 属性。 |
除了这些特定的运行时宏用户对象属性也可以被访问。
通知运行时宏¶
的名字 | 描述 |
---|---|
notification.type | 通知的类型。 |
notification.author | 通知注释的作者(如果存在)。 |
notification.comment | 通知的注释(如果存在)。 |
除了这些特定的运行时宏通知对象属性也可以被访问。
全球运行宏¶
以下宏在所有执行的命令中都是可用的:
的名字 | 描述 |
---|---|
icinga.timet | 当前UNIX时间戳。 |
icinga.long_date_time | 当前日期和时间,包括时区信息。例子:2014-01-03 11:23:08 + 0000 |
icinga.short_date_time | 当前日期和时间。例子:2014-01-03 11:23:08 |
icinga.date | 当前日期。例子:2014-01-03 |
icinga.time | 当前时间,包括时区信息。例子:11:23:08 + 0000 |
icinga.uptime | Icinga 2进程当前正常运行时间。 |
以下宏提供全局统计信息:
的名字 | 描述 |
---|---|
icinga.num_services_ok | 当前状态为“OK”的服务数量。 |
icinga.num_services_warning | 当前处于“警告”状态的服务数量。 |
icinga.num_services_critical | 当前处于“紧急”状态的服务数量。 |
icinga.num_services_unknown | 当前状态为“未知”的服务数量。 |
icinga.num_services_pending | 当前待处理服务的数量。 |
icinga.num_services_unreachable | 当前不可达服务数。 |
icinga.num_services_flapping | 当前的服务数量。 |
icinga.num_services_in_downtime | 当前停机服务的数量。 |
icinga.num_services_acknowledged | 当前确认的服务问题数量。 |
icinga.num_hosts_up | 当前状态为“Up”的主机数量。 |
icinga.num_hosts_down | 当前状态为“Down”的主机数量。 |
icinga.num_hosts_unreachable | 当前不可达主机数量。 |
icinga.num_hosts_pending | 当前挂起的主机数量。 |
icinga.num_hosts_flapping | 当前震荡主机数量。 |
icinga.num_hosts_in_downtime | 当前停机的主机数量。 |
icinga.num_hosts_acknowledged | 当前确认的主机问题数量。 |
应用规则¶
有几种对象类型需要对象关系,例如:服务,通知,依赖,ScheduledDowntime对象。对象关系在链接的章节中有文档说明。
例如,如果您创建一个服务对象,您必须指定host_name属性并引用现有的主机属性。
对象服务“ping4”{check_command = "ping4" host_name = "icinga2-agent1. "localdomain "}
当管理一组庞大的配置对象时,这是不舒服的匹配在一个共同的模式。
相反,你想使用应用规则.
如果希望对所有主机进行基本的监控,可以添加一个ping4
服务应用规则适用于所有主机地址
属性指定的。1000个主机只有一个规则,而不是1000个服务对象。应用规则将自动为您生成它们。
应用服务“ping4”{check_command =“ping4”分配主机。地址}
更多关于赋值表达式的解释可以找到在这里.
应用规则:先决条件¶
在你开始应用规则之前,请记住以下几点:
- 定义最佳匹配。
- 所有表达式必须返回一个布尔值(一个空字符串等于
假
例如。)
以下章节描述了更具体的对象类型需求:
应用规则:用法示例¶
可以在apply规则中分别使用该作用域内的可用对象(主机和/或服务对象)设置/覆盖对象属性。
var。application_type = host.vars.application_type
自定义变量还可以存储嵌套的字典和数组。这样,您不仅可以使用它们来匹配它们在apply表达式中的存在或值,还可以将它们的值赋值(“继承”)到从apply规则生成的反对对象中。
的例子还记得吗自定义变量值:
var。不ification["mail"] = { groups = [ "icingaadmins" ] }
你可以在这里做两件事:
- 检查是否存在
通知
自定义变量及其嵌套的字典键邮件
.如果此值为布尔值,则将生成通知对象。 - 赋值
组
关键user_groups
属性。
应用通知"mail-icingaadmin"到主机{[…][user_groups = host.vars.notification.mail.groups分配where host.vars.notification.mail}
下面将使用一个更高级的示例在数组或字典上应用for循环规则所提供的自定义atttributes或组。
的例子还记得吗自定义变量值:
var。磁盘["disk /"] = { disk_partitions = "/" }
中定义的所有字典键都可以迭代磁盘
.您可以选择使用该值来指定其他对象属性。
在host.vars.disks中申请服务(disk => config){[…]var。磁盘_partitions = config.disk_partitions }
请阅读申请章以获得更具体的见解。
提示
应用规则表达式¶
您可以使用apply规则表达式的简单或高级组合。每个表达式都必须计算为布尔值真正的
价值。例如,一个空字符串将被解释为假
.以类似的方式返回未定义的属性假
.
返回假
:
分配在host.vars.attribute_does_not_exist
多个指定的地方
条件行被计算为或
条件。
您可以组合多个表达式来只匹配对象的子集。在某些情况下,您希望能够添加多个匹配特定条件的赋值/忽略where表达式。要实现这一点,您可以使用逻辑而且
而且或
操作符。
应用规则表达式示例¶
在“host.groups”中指定“hostgroup-dev”
当自定义变量为时,赋值对象平等的一个值:
host.vars分配。application_type== "database" assign where service.vars.sms_notify == true
如果对象是字典,则赋值对象包含一个给定的关键:
分配在host.vars.app_dict.contains(“应用程序”)
匹配主机名不分大小写匹配:
指定where match("webserver*", host.name)
指定regex("^webserver-[\\d+]", host.name)
匹配所有* mysql *
主机名和(& &
)自定义变量prod_mysql_db
匹配db - *
模式。使用自定义变量的所有主机test_server
设置为真正的
应该忽略的,或者任何主机名结尾的*内部
模式。
object HostGroup "MySQL - Server" {display_name = "MySQL Server"分配where match("* MySQL *", host.name) && match("db-*", host.vars.prod_mysql_db)忽略where host.vars。Test_server == true忽略where match("*internal", host.name)}
高级通知应用规则过滤器的类似示例:如果服务属性笔记
匹配的黄金支持24x7吗
字符串和
两个条件中的一个通过,或者客户
主机自定义变量设置为customer-xy
或
宿主自定义变量always_notify
被设置为真正的
.
对于主机名以结尾的服务,将忽略该通知*内部
或
的优先级
自定义变量不到2
.
模板的通知“cust-xy-notification”{用户=(“noc-xy”、“mgmt-xy”)命令=“mail-service-notification”}通知“notify-cust-xy-mysql”适用于服务{导入“cust-xy-notification”分配匹配(“*黄金支持24 x7 *”,service.notes) & & (host.vars。客户== " Customer -xy" || host.vars。always_notify== true) ignore where match("*internal", host.name) || (service.vars.priority < 2 && host.vars.is_clustered == true) }
本文将介绍更高级的示例在这里.
向主机应用服务¶
示例配置中已经包含了一个详细的示例hosts.conf而且services.conf对于这个用例。
的例子ssh
控件将服务对象应用于所有主机地址
属性和自定义变量操作系统
设置为字符串Linux
在var
.
apply Service "ssh" {import "generic-service" check_command = "ssh" assign where host。address && host.vars.os == "Linux"}
例如,其他详细的例子将在各自的章节中使用使用自定义命令参数应用服务.
向主机和服务应用通知¶
通知适用于特定目标(宿主
或服务
),并以类似的方式工作:
应用通知“mail-noc”到服务{导入“mail-service-notification”user_groups = ["noc"]分配主机.vars. Notification .mail}
在本例中mail-noc
通知将被创建为具有notification.mail
自定义变量的定义。notification命令设置为mail-service-notification
以及用户组的所有成员noc
将得到通知。
通常也可以应用通知模板,并通过检查自定义变量来动态覆盖模板中的值。这可以通过使用条件语句:
应用通知" Host -mail-noc"到主机{导入"mail-host-notification" //将从' mail-host-notification '模板继承的时间间隔替换为由主机自定义变量if (Host .vars.notification_interval)设置的新的通知时间间隔{interval = Host .vars。Notification_interval} //与通知周期相同if (host.vars.notification_period) {period = host.vars。通知_period } // Send SMS instead of email if the host's custom variable `notification_type` is set to `sms` if (host.vars.notification_type == "sms") { command = "sms-host-notification" } else { command = "mail-host-notification" } user_groups = [ "noc" ] assign where host.address }
在上面的例子中通知模板mail-host-notification
包含所有相关的通知设置。应用规则应用于所有主机对象host.address
定义。
如果主机对象有一个特定的自定义变量集,它的值将继承到本地通知对象范围,例如:host.vars.notification_interval
,host.vars.notification_period
而且host.vars.notification_type
.这将覆盖已导入中指定的属性mail-host-notification
模板。
对应的宿主对象可以是这样的:
object主机“host1”{import“Host -linux-prod”display_name =“host1”地址=“192.168.1.50”vars。Notification_interval = 1h vars。通知_period = "24x7" vars.notification_type = "sms" }
将依赖关系应用到主机和服务¶
详细的例子可以在依赖关系一章。
对主机和服务应用周期性停机时间¶
示例配置包括一个示例downtimes.conf.
详细的例子可以在反复出现宕机一章。
使用申请规则¶
接下来是标准的使用方法应用规则需要使用基于集合(数组或字典)的应用对象申请表达式。
示例配置中已经包含了一个详细的示例hosts.conf而且services.conf对于这个用例。
举例如下:主机为不同的服务检查类型提供snmp oid。这看起来像下面的例子:
object主机"router-v6" {check_command = "hostalive" address6 = "2001:db8:1234::42" vars。oid ["if01"] = "1.1.1.1.1"变量。oid ["temp"] = "1.1.1.1.2"变量。oid ["bgp"] = "1.1.1.1.5"}
其思想是创建服务对象if01
而且临时
但不是边界网关协议
.oid值也应该用作服务自定义变量snmp_oid
.方法所需的命令参数snmp检查命令。服务的display_name
应该设置为字典内的标识符,例如。if01
.
应用服务(标识符=> oid in host.vars.oids) {check_command = "snmp" display_name =标识符vars。Snmp_oid = oid ignore where identifier == "bgp" //不为bgp检查生成服务}
Icinga 2评估申请
规则用于所有具有自定义变量的对象oid
集。方法中遍历所有字典项为
循环并计算分配/忽略
表达式。你可以在这些表达式中访问循环变量,例如忽略特定的值。
在本例中边界网关协议
标识符被忽略。这避免了产生不必要的服务。另一种方法是匹配oid
值与正则表达式/通配符匹配模式为例。
忽略在正则表达式(“^ \ d。\ d。\ \ d d。5美元”,oid)
请注意
你不需要
指定的地方
表达式,用于检查oid
自定义变量。
这种方法可以避免创建多个apply规则。它还将属性规范逻辑从服务移动到主机。
申请和自定义变量覆盖¶
想象一个不同的更高级的示例:您正在使用许多接口(服务)监视网络设备(主机)。以下要求/问题适用:
- 每个接口服务都应该使用前缀和在主机对象中定义的名称命名(可以从CMDB等生成)。
- 每个接口都有自己的VLAN tag
- 部分接口已开启QoS
- 其他属性,例如
display_name
或笔记
,notes_url
而且action_url
必须动态生成。
提示
将SNMP团体定义为您的欧宝app官网网址constants.conf文件。
const IftrafficSnmp欧宝app官网网址Community = "public"
定义接口
自定义变量在思科6509 - 34 -催化剂
宿主对象并添加三个示例接口作为字典键。
在嵌套字典中指定附加属性自定义变量值:
object主机"cisco-catalyst-6509-34" {import "generic-host" display_name = "Catalyst 6509 #34 VIE21" address = "127.0.1.4" /* "GigabitEthernet0/2"是接口名称,*在服务和关键的名字申请以后* / vars.interfaces GigabitEthernet0/2[” "] = { /* 定义具有相同名称的所有自定义变量所需的命令参数/参数*服务应用(看着CheckCommand定义)* / iftraffic_units =“g”iftraffic_community = IftrafficSnmpCommunity iftraffic_bandwidth = 1 vlan =“内部”qos =“禁用”}vars.interfaces(“GigabitEthernet0/4”)= {iftraffic_un欧宝app官网网址its = / / iftraffic_community = IftrafficSnmpCommunity“g”iftraffic_bandwidth = 1 vlan = "remote" qos = "enabled"} var .interfaces["MgmtInterface1"] = {iftraffic_co欧宝app官网网址mmunity = IftrafficSnmpCommunity vlan = "mgmt" interface_address = "127.99.0.100" #特殊管理ip}}
从apply for定义开始,遍历host.vars.interfaces
.这是一个字典,应该使用变量interface_name
关键和interface_config
作为每个生成的对象范围的值。
“如果,”
为产生的每个服务指定对象名称前缀如果- - - - - - < interface_name >
为每个迭代。
/*循环主机.vars.interfaces字典*,因为(key =>值在字典中)表示键*为“interface_name”,值为“interface_config”。使用indexer(' . ')字符访问配置属性。*/ apply Service "if-" for (interface_name => interface_config in host.vars.interfaces) {
导入通用服务
模板,分配iftrafficcheck_command
.使用字典键interface_name
设置一个合适的display_name
外部接口的字符串。
import "generic-service" check_command = "iftraffic" display_name = "IF-" + interface_name
的interface_name
键的值与命令参数使用的字符串相同iftraffic
:
/*使用键作为命令参数(host.vars.interfaces中没有重复的值)*/ vars。iftraffic_interface = interface_name
记住,interface_config
是嵌套字典。在第一次迭代中,它是这样的:
interface_config = {iftraffic_units = "g" iftraffic_c欧宝app官网网址ommunity = IftrafficSnmpCommunity iftraffic_bandwidth = 1 vlan = "internal" qos = "disabled"}
使用。访问字典键索引器的命令参数,并将它们赋给自定义变量iftraffic
检查命令。
/*映射自定义变量为命令参数*/ vars。iftraffic_units = interface_config。iftraffic_units var。iftraffic_community = interface_config.iftraffic_community
方法中指定的所有属性interface_config
字典,把它添加到生成的服务自定义变量中,像这样:
/*如果host.vars.interfaces *中的名称与check command *定义中命令参数所需的_exact_相同,则可以以更短的方式实现上述操作。*/ vars += interface_config
如果用户没有为所需的服务自定义变量指定默认值,那么在这里添加它们。这还有助于避免不必要的配置验证错误或运行时失败。请阅读更多关于条件句的内容在这里.
/*设置单位和带宽的默认值*/Iftraffic_units == ""){变量。iftraffic_units = "m" } if (interface_config.iftraffic_bandwidth == "") { vars.iftraffic_bandwidth = 1 } if (interface_config.vlan == "") { vars.vlan = "not set" } if (interface_config.qos == "") { vars.qos = "not set" }
如果主机对象没有指定自定义SNMP团体字,则设置由欧宝app官网网址全球常数IftrafficSnmp欧宝app官网网址Community
.
/*如果主机上的' interfaces '字典没有提供,则设置全局常量*/ if (len(interface_config.iftraffic_community) == 0 || len(vars.iftraffic_community) == 0) {vars.iftraff欧宝app官网网址ic_community == 0)iftraffic_欧宝app官网网址community = IftrafficSnmpCommunity}
使用提供的值计算更多可以在外部接口中看到的对象属性。
/*填充' vars '字典后计算一些额外的对象属性*/ notes = "接口检查为" + interface_name + "(单位:'" + interface_config。iftraffic_units + ' ') in VLAN ' ' ' + var。vlan + "' with ' QoS '" + vars。Qos + "'" notes_url = "https://foreman.company.com/hosts/" + host.name action_url = "https://snmp.checker.company.com/" + host.name + "/if-" + interface_name}
提示
验证apply-for-rule使用继承的自定义变量成功创建了服务对象:
# icinga2 daemon -C # icinga2对象列表——type Service——name *catalyst* object 'cisco-catalyst-6509-34!类型为“Service”的if-GigabitEthernet0/2: ......* var % =修改/ etc / icinga2 / conf.d iftraffic.conf”,行59:3-59:26 * iftraffic_bandwidth = 1 * iftraffic_community =“公共欧宝app官网网址”% =修改/ etc / icinga2 / conf.d iftraffic.conf”,行53:3-53:65 * iftraffic_interface = % =“GigabitEthernet0/2”修改“/ etc / icinga2 / conf.d / iftraffic.conf”,行49:3-49:43 * iftraffic_units =“g”% =修改/ etc / icinga2 / conf.d iftraffic.conf”,行52:3-52:57 * qos =“禁用”* vlan =“内部”对象的思科-催化剂- 6509 - 34 !if-GigabitEthernet0/4'的类型为'Service':…* var % =修改/ etc / icinga2 / conf.d iftraffic.conf”,行59:3-59:26 * iftraffic_bandwidth = 1 * iftraffic_community =“公共欧宝app官网网址”% =修改/ etc / icinga2 / conf.d iftraffic.conf”,行53:3-53:65 % =修改/ etc / icinga2 / conf.d iftraffic.conf”,行79:5-79:53 * iftraffic_interface = % =“GigabitEthernet0/4”修改“/ etc / icinga2 / conf.d / iftraffic.conf”,行49:3-49:43 * iftraffic_units =“g”% =修改/ etc / icinga2 / conf.d iftraffic.conf”,第52:3-52:57行* qos =“enabled”* vlan =“remote”对象的cisco-catalyst-6509-34!类型为服务的if-MgmtInterface1:…* var % =修改/ etc / icinga2 / conf.d iftraffic.conf”,行59:3-59:26 * iftraffic_bandwidth = 1% =修改/ etc / icinga2 / conf.d iftraffic.conf”,行66:5-66:32 * iftraffic_community =“公共”% =修改/ etc / 欧宝app官网网址icinga2 / conf.d iftraffic.conf”,行53:3-53:65 * iftraffic_interface = % =“MgmtInterface1”修改“/ etc / icinga2 / conf.d / iftraffic.conf”,行49:3-49:43 * iftraffic_units =“m”% =修改/ etc / icinga2 / conf.d iftraffic.conf”,第52:3-52:57 % =修改'/etc/icinga2/conf.d/iftraffic.conf',行63:5-63:30 * interface_address = "127.99.0.100" * qos = "not set" % =修改'/etc/icinga2/conf.d/iftraffic.conf',行72:5-72:24 * vlan = "mgmt"
在应用规则中使用对象属性¶
由于应用规则是在通用对象之后计算的,因此可以引用现有的主机和/或服务对象属性作为该应用规则中指定的任何对象属性的值。
object主机“open星云- Host”{import“generic-host”address =“10.1.1.2”vars。举办["cust1"] = { http_uri = "/shop" customer_name = "Customer 1" customer_id = "7568" support_contract = "gold" } vars.hosting["cust2"] = { http_uri = "/" customer_name = "Customer 2" customer_id = "7569" support_contract = "silver" } }
举办
是一个具有Dictionary值类型的自定义变量。迭代是必须的键= >值
下面的符号适用规则。
申请服务(客户=>配置在主机.vars.hosting){导入"generic-service" check_command = "ping4" vars。Qos = "disabled" vars += config vars。http_uri = "/" + customer + "/" + config.http_uri display_name = "Shop Check for " + vars.customer_name + "-" + vars.customer_id notes = "Support contract: " + vars.support_contract + " for Customer " + vars.customer_name + " (" + vars.customer_id + ")." notes_url = "https://foreman.company.com/hosts/" + host.name action_url = "https://snmp.checker.company.com/" + host.name + "/" + vars.customer_id }
每个循环迭代都有不同的for值客户
和config '在局部作用域中。
1.
customer = "cust 1" config = {http_uri = "/shop" customer_name = " customer 1" customer_id = "7568" support_contract = "gold"}
2.
customer = "cust2" config = {http_uri = "/" customer_name = " customer 2" customer_id = "7569" support_contract = "silver"}
现在可以添加配置
字典var
.
var + =配置
现在第一次迭代的结果如下:
customer = "cust 1" vars = {http_uri = "/shop" customer_name = " customer 1" customer_id = "7568" support_contract = "gold"}
记住,你已经知道这个结构了。还可以使用索引器语法。
var。http_uri = ... + config.http_uri
也可以写成
Vars += config Varshttp_uri =…+ vars.http_uri
组¶
组是相似对象的集合。组主要用于web界面的可视化辅助。
组成员关系是在各自的对象本身定义的。如果您有主机组名称窗户
例如,并希望分配特定的主机到这个组,以便稍后在警报仪表板上查看该组,首先创建一个HostGroup对象:
object主机组“windows”{display_name =“windows Servers”}
然后将您的主机添加到这个组:
template主机"windows-server" {groups += ["windows"]} object主机"mssql-srv1" {import "windows-server" vars。mssql_port = 1433} object主机“mssql-srv2”{导入“windows-server”变量。Mssql_port = 1433}
对服务和用户组也可以这样做:
object UserGroup "Windows - MSSQL - Admins" {display_name = "Windows MSSQL Admins"} template User "generic-windows-mssql-users" {" groups += ["Windows - MSSQL - Admins"]} object User "win-mssql-noc" {import "generic-windows-mssql-users" email = "noc@example.com"} object User "win-mssql-ops" {import "generic-windows-mssql-users" email = "ops@example.com"}
组成员分配¶
除了手动将每个对象分配给一个组,你还可以根据对象的属性将对象分配给一个组:
对象主机组“prod-mssql”{display_name =“生产MSSQL服务器”分配host.vars。mssql_port & & host.vars。prod_mysql_dbignore where host.vars.test_server == true ignore where match("*internal", host.name) }
在本例中,所有带有var
属性mssql_port
会被添加为主机组的成员吗该软件
.然而,所有主机匹配的字符串\ *内部
或test_server
属性设置为真正的
是不添加到该组。
细节上的指定的地方
语法可以在语言参考.
通知¶
服务和主机问题通知是监视设置中不可分割的一部分。
当主机或服务处于停机状态、确认了问题或依赖逻辑确定主机/服务不可达时,不会发送通知。您可以配置额外的类型和状态过滤器,以细化实际发送的通知。
发送通知的方式有很多种,例如通过电子邮件、XMPP、IRC、Twitter等。Icinga 2本身不知道如何发送通知。相反,它依赖于外部机制(如shell脚本)来通知用户。控件中列出了更多通知方法插件和插件一章。
通知规范要求在出现问题时通知一个或多个用户(和/或用户组)。控件中使用的所有自定义属性必须已定义NotificationCommand
在执行。
用户icingaadmin
在下面的例子中只会得到通知警告
而且至关重要的
问题。除此之外复苏
发送通知(它们需要好吧
状态)。
object User "icingaadmin" {display_name = "Icinga 2 Admin" enable_notifications = true states = [OK, Warning, Critical] types = [Problem, Recovery] email = "icinga@localhost"}
如果你不设置州
而且类型
的配置属性。用户
对象,所有状态和类型的通知将被发送。
可以找到关于故障排除通知问题的详细信息在这里.
请注意
确保通知特性启用,以便执行通知命令。
在紧急情况下,您应该选择您(和您的通知用户)感兴趣的信息,以及对您和您的环境没有任何价值的信息。
使用实例说明notification命令在这里.
可以将所有共享属性添加到a通知
模板,它继承给已定义的通知。这样,您就可以在每个文件中保存重复的属性通知
对象。属性可以在本地重写。
template Notification "generic-notification" {interval = 15m command = "mail-service-notification" states = [Warning, Critical, Unknown] types = [Problem, Acknowledgement, Recovery, Custom, FlappingStart, FlappingEnd, DowntimeStart, DowntimeEnd, DowntimeRemoved] period = "24x7"}
的时间段24 x7
作为Icinga 2的示例配置。
使用应用
关键字创建通知
服务对象:
应用通知“notify- cst -xy-mysql”到服务{导入“generic-notification”users = ["noc-xy", " gmt-xy"]分配where match("*has gold support 24x7*", Service .notes) && (host.vars. conf . conf)客户== " Customer -xy" || host.vars。always_notify== true ignore where match("*internal", host.name) || (service.vars.priority < 2 && host.vars.is_clustered == true) }
除了为用户分配通知之外,您还可以添加user_groups
属性的用户组列表通知
对象。Icinga 2会向所有群组成员发送通知。
请注意
只有以前收到过问题通知的用户(
警告
,至关重要的
,未知的
州的服务,下来
对于主机)将收到复苏
通知。
Icinga 2 v2.10允许配置确认
和/或复苏
没有一个问题
通知。这些通知将在没有任何问题的情况下提前发送,并可用于票务系统等。
types =[确认,恢复]
通知:来自主机/服务的用户¶
一种常见的模式是将用户和用户组存储在主机或服务对象上,而不是通知对象本身。
中提供的示例配置hosts.conf而且notifications.conf已经为这个问题提供了一个例子。
提示
在主机对象上指定用户和组作为嵌套的自定义变量:
icinga2-agent1对象主机”。localdomain“{[…var。不ification["mail"] = { groups = [ "icingaadmins" ] users = [ "icingaadmin" ] } vars.notification["sms"] = { users = [ "icingaadmin" ] } }
如您所见,这里可以选择使用两种不同的通知应用规则邮件
,一个用于短信
.
本例将用户
而且组
的嵌套键。通知
自定义变量到实际通知对象属性。
由于如果主机对象没有指定所需的配置属性,则很难调试错误,因此可以添加一个安全条件,记录哪个主机对象受到影响。
关键/配置:主机icinga2-client3。Localdomain '没有为通知'mail-icingaadmin'指定所需的用户/user_groups配置属性。
你也可以使用脚本调试器获取更高级的见解。
应用通知"mail-host-notification"到主机{[…]/*主机没有指定用户/user_groups属性的日志。这将在配置验证期间立即失败,但非常有用。*/ if (len(host.vars.notification.mail.users) == 0 && len(host.vars.notification.mail.user_groups) == 0) {log(LogCritical, "config","Host '" + Host .name + "'没有为通知指定所需的用户/user_groups配置属性'" + name + ")} users = Host .vars.notification.mail.users user_groups = Host .vars.notification.mail.groups分配where Host .vars.notification.mail && typeof(Host .vars.notification.mail) ==字典}应用通知"sms-host-notification"到主机{[…]/*主机没有指定用户/user_groups属性的日志。这将在配置验证期间立即失败,但非常有用。*/ if (len(Host .vars.notification.sms.users) == 0 && len(Host .vars.notification.sms.user_groups) == 0) {log(LogCritical, "config", "Host '" + Host .name + "'不指定需要的用户/user_groups配置属性通知'" + name + "')} users = Host .vars.notification.sms.users user_groups = Host .vars.notification.sms && typeof(Host .vars.notification.sms) ==字典}
上面的例子使用了typeof作为安全功能,确保邮件
Key实际上提供了一个字典作为值。否则,如果管理员在另一台主机上添加以下内容,配置验证可能会失败:
vars.notification.mail = "是的"
你也可以对服务对象进行更细粒度的赋值:
应用服务“http”{[…]var。不ification["mail"] = { groups = [ "icingaadmins" ] users = [ "icingaadmin" ] } [...] }
此通知应用规则与上述规则不同。服务通知用户和组从服务继承,如果没有设置,则从主机对象继承。也设置了默认用户。
将通知“mail-service-notification”应用到服务{[…]if (service.vars.notification.mail.users) {users = service.vars.notification.mail.users} else if (host.vars.notification.mail.users) {users = host.vars.notification.mail.users} else{/*接收所有邮件的默认用户。*/ users = ["icingaadmin"]} if (service.vars.notification.mail.groups) {user_groups = service.vars.notification.mail.groups} else if (host.vars.notification.mail.groups) {user_groups = host.vars.notification.mail.groups} assign where (host.vars.notification.mail && typeof(host.vars.notification.mail) == Dictionary) || (service.vars.notification.mail && typeof(service.vars.notification.mail) == Dictionary)
通知升级¶
当发送了问题通知,而在重新通知时问题仍然存在时,您可能希望将问题升级到下一个支持级别。另一种方法是通过电子邮件配置默认通知,如果问题尚未解决,则通过SMS升级。
可以将通知的开始和结束时间定义为附加配置属性通知
对象一个所谓的通知升级
.使用模板,您可以共享基本的通知属性,如用户或时间间隔
(然后为升级而重写它们)。
使用上面的示例,您可以定义在开始和结束时间之间为短信通知升级的其他用户。
object用户"Icinga -oncall-2nd- Level" {display_name = "Icinga 2nd Level" vars。移动= "+1 555 424642"}对象用户"icinga-oncall-1st-level" { display_name = "Icinga 1st Level" vars.mobile = "+1 555 424642" }
定义一个额外的NotificationCommand的短信通知。
请注意
这个例子并不完整,因为有许多不同的SMS提供者。请注意,发送短信通知将需要一个短信供应商或具有活动SIM卡的本地硬件。
object NotificationCommand "sms-notification" {command = [PluginDir + "/send_sms_notification", "$mobile$", "…"}
两个新的通知升级被添加到本地主机及其服务中ping4
使用一般性通知
模板。用户icinga-oncall-2nd-level
会收到短信通知(短信通知
后命令)30米
直到1 h
.
请注意
的
时间间隔
被设定为15米一般性通知
模板的例子。在升级中使用辅助模板或直接重写属性来降低该值通知
数组位置escalation-sms-2nd-level
.
如果问题没有得到解决或确认,将阻止进一步通知escalation-sms-1st-level
用户将升级1 h
在最初的问题被通知之后,但只持续了一个小时(2 h
作为结束
的关键次
字典)。
应用通知“邮件”服务{导入“一般性通知”命令=“邮件通知”用户=(“icingaadmin”)分配,service.name = =“ping4”}通知“escalation-sms-2nd-level”适用于服务{进口“一般性通知”命令=“短信通知”用户=(“icinga-oncall-2nd-level”)* ={开始= 30 m结束= 1 h}分配service.name = =“ping4”}通知“escalation-sms-1st-level”适用于服务={进口“一般性通知”命令"sms-notification" users = ["icinga-oncall-1st-level"] times = {begin = 1h end = 2h} assign where service.name == "ping4"}
延迟通知¶
有时问题不应该在通知到期时宣布(对象到达硬
国家),但在一段时间后。在Icinga 2中,你可以使用次
字典和设置开始= 15米
如果您想将通知窗口延迟15分钟,则作为键和值。离开了结束
key -如果没有设置,Icinga 2将不会检查此通知的任何结束时间。确保指定一个相对较低的通知时间间隔
很快又收到通知。
apply Notification“mail”to Service {import "generic-notification" command = "mail- Notification " users = ["icingaadmin"] interval = 5m times。Begin = 15m //延迟通知窗口分配where service.name == "ping4"}
禁用Re-notifications¶
如果您希望只收到一次通知,可以通过设置时间间隔
属性来0
.
apply Notification "notify-once" to Service {import "generic-notification" command = "mail-notification" users = ["icingaadmin"] interval = 0 // disable re-notification assign where Service .name == "ping4"}
通知过滤器根据状态和类型¶
控件上没有定义通知状态和类型筛选器属性通知
或用户
对象时,Icinga 2假设所有状态和类型都被通知。
可用的通知状态和类型过滤器有:
模板通知"generic-notification" {states = [OK, Warning, Critical, Unknown] types = [Problem, Acknowledgement, Recovery, Custom, FlappingStart, FlappingEnd, DowntimeStart, DowntimeEnd, DowntimeRemoved]}
命令¶
Icinga 2使用三种不同的命令对象类型来指定应该如何执行检查、发送通知和处理事件。
检查命令¶
CheckCommand对象定义了如何调用检查的命令行。
CheckCommand对象由宿主而且服务对象的使用check_command
属性。
请注意
确保检查程序特性被启用以执行检查。
将插件与CheckCommand定义集成¶
除非你已经这样做了,下载你的检查插件,并把它放在PluginDir目录中。下面的示例使用check_mysql
监控插件包中包含的插件。
插件路径和所有命令参数被制成一个双引号字符串参数列表,用于正确的shell转义。
调用check_disk
插件的——帮助
参数查看所有可用选项。我们的例子定义了警告(- w
)及关键(- c
)磁盘使用率阈值。没有任何分区定义(- p
)它将检查所有本地分区。
icinga@icinga2 $ /usr/lib64/nagios/plugin /check_mysql——help…使用方法:check_mysql [-d database] [-H host] [-P port] [-s socket] [-u user] [-P password] [-s] [-l] [-a cert] [-k key] [-C ca-cert] [-d ca-dir] [-l ciphers] [-f optfile] [-g group]
下一步是了解如何命令参数正在从主机或服务对象传递,并添加CheckCommand基于这些必需的参数和/或默认值定义。
请继续阅读插件部分查看其他集成示例。
通过主机或服务的检查命令参数¶
检查命令参数定义为自定义变量,可以通过执行检查命令访问运行时宏。
ITL提供的插件检查命令定义的检查命令参数有文档记录在这里例如,磁盘.
为了练习传递命令参数,您应该集成你自己的插件.
下面的例子将使用check_mysql
提供的监控插件.
定义默认的检查命令自定义变量,例如mysql_user
而且mysql_password
(可自由定义的命名模式)和可选的默认阈值。然后可以使用这些自定义变量作为运行时宏命令参数在命令行中。
提示
使用通用命令类型作为命令参数的前缀,以提高可读性。
mysql_user
有助于更好地理解上下文,而不仅仅是用户
作为参数。
使用check命令可以使用主机或服务中定义的自定义变量覆盖默认的自定义变量my-mysql
.自定义变量也可以使用附加继承从父模板继承(+ =
).
# vim /etc/icinga2/conf.d/commands.conf对象CheckCommand“my-mysql”{命令= [PluginDir + " / check_mysql "] / / constants.conf - > const PluginDir参数={“- h”=“mysql_host美元”“- u”={要求= true值=“mysql_user美元”}“p”=“mysql_password美元”“p”=“mysql_port美元”“s”=“mysql_socket美元”“——”=“mysql_cert美元”“- d”=“mysql_database美元”“- k”=“mysql_key美元”“c”=“mysql_ca_cert美元”“- d”=“mysql_ca_dir美元”“- l”=“mysql_ciphers美元”“- f”=“mysql_optfile美元”“g”=“mysql_group美元”"-S" = {set_if = "$mysql_check_slave$" description = "检查从线程是否正常运行"} "-l" = {set_if = "$mysql_ssl$" description = "使用ssl加密"}}var。Mysql_check_slave = false vars。Mysql_ssl = false vars。mysql_host= "$address$" }
check命令定义还设置mysql_host
到解决美元
默认值。例如,如果MySQL主机没有运行在同一服务器的ip地址上,则可以覆盖该命令参数。
确保传递所有必需的命令参数,例如mysql_user
,mysql_password
而且mysql_database
.MysqlUsername
而且MysqlPassword
被指定为全局常量在这个例子中。
# vim /etc/icinga2/conf.d/services.conf apply Service "mysql-icinga-db-health" {import "generic-service" check_command = "my-mysql" vars。mysql_user = MysqlUsername vars。mysql_password= MysqlPassword vars.mysql_database = "icinga" vars.mysql_host = "192.168.33.11" assign where match("icinga2*", host.name) ignore where host.vars.no_health_check == true }
下面是一个不同的示例:示例主机配置hosts.conf也适用于一个ssh
服务检查。主机的ssh端口不是默认的22
,但设置为2022
.您可以将命令参数作为自定义变量传递ssh_port
直接在服务内部应用规则services.conf:
apply Service "ssh" {import "generic-service" check_command = "ssh" vars。Ssh_port = 2022 //自定义命令参数分配where (host。host.vars.os == "Linux"}
如果您希望在主机而不是服务上配置该对象,那么就修改主机配置对象。描述了运行时宏解析顺序在这里.
icinga2-agent1对象主机”。localdomain{…var。ssh_port = 2022 }
通过Apply For检查命令参数¶
主机本地主机
中生成的服务basic-partitions
字典(见申请(有关详细信息)使用修改的自定义变量(警告阈值为10%
,临界阈值5%
空闲磁盘空间)。
自定义变量disk_partition
可以保存单个字符串或字符串值数组传递多个分区的check_disk
检查插件。
object主机"my-server"{导入"generic-host"地址= "127.0.0.1" address6 = "::1"变量。local_disks["basic-partitions"] = {disk_partitions = [" /", "/tmp", "/var", "/home"]}} apply Service for (disk => config in host.vars.local_disks) {import "generic-service" check_command = "my-disk" vars += config vars。Disk_wfree = "10%"变量。Disk_cfree = "5%"}
关于在自定义变量中使用数组的更多细节可以在这一章.
命令参数¶
在短的旁边命令
在命令对象中指定插件/脚本参数时,建议在参数
字典属性。
的值——参数
Key本身是一个带有附加键的字典。它们允许创建通用的命令对象,也用于文档目的,例如使用描述
字段复制插件的帮助文本在那里。Icinga Director使用这个字段来显示选择该参数时的目的。
参数={"——参数”= =“…”价值={描述“……”}}
每个参数默认是可选的,如果没有设置值,则省略。
了解更多关于将插件与CheckCommand对象集成的信息这一章.
还有其他的方法可以只创建一次命令,使用不同的参数和参数,如下所示。
命令参数:值¶
为了找到关于命令参数的信息,请调用插件的帮助或查阅README。
/ check_systemd.py——帮助…-u UNIT,——UNIT UNIT正在测试的systemd单元名称。
只要长参数名可用,就选择长参数名,而不是短参数名。
参数={"——unit" = {}}
定义一个独特的前缀
命令的特定参数。最佳实践是遵循以下模式:
<命令名称> _ <参数名称>
因此使用systemd_
作为前缀,并使用长插件参数名单位
在运行宏语法。
参数={"——unit" = {value = "$systemd_unit$"}}
要指定默认值,请指定a自定义变量在CheckCommand对象内部。
var。systemd_unit = " icinga2 "
这个值可以作为命令参数从host/service对象重写。
命令参数:描述¶
最好的做法,也在里面ITL,总是将命令参数帮助输出复制到描述
检查命令的字段。
了解更多关于将插件与CheckCommand对象集成的信息这一章.
与上面的例子,检查参数的帮助文本。
/ check_systemd.py——帮助…-u UNIT,——UNIT UNIT正在测试的systemd单元名称。
将此复制到命令参数中描述
条目。
arguments ={"——unit" = {value = "$systemd_unit$" description = "正在测试的systemd单元的名称。"}}
命令参数:需要¶
指定是否需要此命令参数。默认情况下,所有参数都是可选的。
提示
好的插件会在方括号中提供可选参数。
(- w秒)
.
的要求
字段可以用布尔价值。
参数={"——host" = {value = "…" description = "…" required = true}}
每当执行检查时,如果缺少参数,Icinga就会记录一个错误。这允许更好地调试配置错误,而不是有时在缺少参数时不可读的插件错误。
命令参数:Skip Key¶
的参数
属性需要一个键,不允许空值。对于不需要在值前加上名称的参数,可以使用skip_key
布尔切换。
command = [PrefixDir + "/bin/icingacli", "businessprocess", "process", "check"] arguments ={"——process" = {value = "$icingacli_businessprocess_process$" description = "要监控的业务流程" skip_key = true required = true order = -1}}
服务指定自定义变量icingacli_businessprocess_process
.
var。icingacli_businessprocess_process = " bp-shop-web "
这将导致命令行中没有——过程
参数:
“/ bin / icingacli”“businessprocess”“过程”“检查”“bp-shop-web”
您可以使用此方法将所有内容放入参数
属性,且不带键。的条目命令
属性。
命令参数:设置If¶
可用于以下场景:
没有值的参数,例如——sni
.
command = [PluginDir + "/check_http"] arguments ={"——sni" = {set_if = "$http_sni$"}}
当主机/服务对象设置http_sni
自定义变量来真正的
,参数被添加到命令行。
“/ usr / lib64 / nagios /插件/ check_http”“——sni”
数字也允许使用值。
参数有值,但额外控制一个自定义变量布尔标志。
下面的示例摘自postgresCheckCommand。host参数应该使用价值
但只有当postgres_unixsocket
自定义变量设置为false。
注意:set_if
使用运行时lambda函数,因为值是在运行时计算的。这在这一章.
command = [PluginContribDir + "/check_postgres.pl"] arguments = {"-H" = {value = "$postgres_host$" set_if = {{macro("$postgres_unixsocket$") == false}} description = "hostname(s) to connect to;默认为none (Unix套接字)"}
这个主机和服务的执行检查…
object Host "postgresql-cluster"{//…var。Postgres_host = "192.168.56.200"变量。Postgres_unixsocket = false}
使用下面的命令行:
“/ usr / lib64 / nagios /插件/ check_postgres.pl”“- h”“192.168.56.200”
设置的主机/服务对象postgres_unixsocket
来假
不添加- h
参数及其值发送到命令行。
命令参数:订单¶
插件可能需要特殊顺序的参数。一个接一个,或者一个参数总是在第一个位置。
参数={”——第一个“= {value = "…"描述=“…”= 5}”,第二次“= {value = "…"描述=“…”秩序= 4}”——去年”= {value = "…"描述=“…”秩序= 99}}
请记住,位置参数需要彻底测试。
命令参数:重复键¶
参数可以使用数组值类型。每当Icinga遇到数组时,默认情况下都会重复参数key和每个value元素。
command = [NscpPath + "\\nscp.exe", "client"] arguments = {"-a" = {value = "$nscp_arguments$" description = "…" repeat_key = true}}
在主机/服务对象上,指定nscp_arguments
自定义变量作为一个数组。
var。nscp_arguments = ["exclude=sppsvc", "exclude=ShellHWDetection"]
这转换成以下命令行:
nscp.exe 'client' '-a' 'exclude=sppsvc' '-a' 'exclude=ShellHWDetection'
如果插件要求您传递列表而不重复键,则设置repeat_key = false
在参数定义中。
command = [NscpPath + "\\nscp.exe", "client"] arguments = {"-a" = {value = "$nscp_arguments$" description = "…" repeat_key = false}}
这转换成以下命令行:
nscp.exe 'client' '-a' 'exclude=sppsvc' 'exclude=ShellHWDetection'
命令参数:键¶
的参数
属性要求唯一的键。有时,您需要在生成的命令行中用相同的键名覆盖它。因此,您可以专门重写参数键。
参数={"——key1”= {value = "…"键=“-specialkey”}”——key2 = {value = "…"键= " -specialkey "}}
这将导致以下命令行:
' -specialkey ' '…”“-specialkey“……”
环境变量¶
的env
命令对象属性指定一列环境变量,这些变量的值是从自定义变量计算出来的,应该在执行命令之前作为环境变量导出。
例如,当向数据库检查传递凭据时,这对于在命令行输出中隐藏敏感信息非常有用:
object CheckCommand“mysql”{command = [PluginDir + "/check_mysql"]参数= {"-H" = "$mysql_address$" "-d" = "$mysql_database$"}变量。Mysql_address = "$address$"变量。Mysql_database = "icinga" vars。mysql_user= "icinga_check" vars.mysql_pass = "password" env.MYSQLUSER = "$mysql_user$" env.MYSQLPASS = "$mysql_pass$" }
所执行的命令行可见ps
或前
看起来像这样,并在用户环境中隐藏数据库凭据。
/usr/lib/nagios/plugins/check_mysql - h192.168.56.101 - d icinga
请注意
如果CheckCommand还支持在命令行中设置参数,请确保为自定义变量使用不同的名称。否则Icinga 2会增加命令行参数。
提供的特定CheckCommand对象Icinga模板库需要额外的环境变量,您可以将其导入一个新的自定义CheckCommand对象并添加额外的env
钥匙。的例子mysql_healthCheckCommand:
object检查命令“mysql_health_env”{import“mysql_health”// https://labs.consol.de/nagios/check_mysql_health/ env。NAGIOS__SERVICEMYSQL_USER = "$mysql_health_env_username$" env。NAGIOS__SERVICEMYSQL_PASS = "$mysql_health_env_password$"}
指定自定义变量mysql_health_env_username
而且mysql_health_env_password
然后在服务对象中。
请注意
你也可以在应用程序的sysconfig配置文件中设置全局环境变量,例如:首页
或Oracle的特定库路径。注意,这些环境变量可以被任何CheckCommand对象和执行的插件使用,并可能泄露敏感信息。
通知命令¶
NotificationCommand对象定义了通知如何发送到外部接口(电子邮件,XMPP, IRC, Twitter等)。NotificationCommand对象由通知对象的使用命令
属性。
请注意
确保通知特性启用,以便执行通知命令。
虽然可以在NotificationCommand对象中指定完整的通知命令,但通常建议在/etc/icinga2/scripts
目录,并让NotificationCommand对象引用它。
一个全新的Icinga 2安装附带了两个通过电子邮件通知主机和服务的示例脚本。基于Icinga 2运行时宏(例如service.output美元
对于当前的检查输出),可以向与通知本身相关的用户发送电子邮件(user.email美元
).请随意将这些脚本作为您自己的通知解决方案的起点—并记住,几乎所有事情在技术上都是可能的。
生成通知所需的信息作为参数传递给脚本。NotificationCommand对象mail-host-notification
而且mail-service-notification
对应于shell脚本mail-host-notification.sh
而且mail-service-notification.sh
在/etc/icinga2/scripts
并为参数定义默认值。这些默认值总是可以在本地覆盖。
请注意
此示例需要
邮件
二进制安装在Icinga 2主机上。根据分布的不同,您需要一个本地邮件传输代理(MTA),如Postfix、Exim或Sendmail来发送电子邮件。
这些工具实际上提供了
邮件
由下面的通知脚本执行的二进制文件。
mail-host-notification¶
的mail-host-notification
NotificationCommand对象使用位于中的示例通知脚本/etc/icinga2/scripts/mail-host-notification.sh
.
这里是一个可以使用的论点的快速概述。另请参阅主机运行宏为进一步的信息。
的名字 | 描述 |
---|---|
notification_date |
必需的。日期和时间。默认为icinga.long_date_time美元 . |
notification_hostname |
必需的。主人的FQDN .默认为host.name美元 . |
notification_hostdisplayname |
必需的。主机的显示名称。默认为host.display_name美元 . |
notification_hostoutput |
必需的。主机检查的输出。默认为host.output美元 . |
notification_useremail |
必需的。通知的收件人(s)。默认为user.email美元 . |
notification_hoststate |
必需的。主机当前状态。默认为host.state美元 . |
notification_type |
必需的。类型的通知。默认为notification.type美元 . |
notification_address |
可选的。主机的IPv4地址。默认为解决美元 . |
notification_address6 |
可选的。主机的IPv6地址。默认为address6美元 . |
notification_author |
可选的。作者发表评论。默认为notification.author美元 . |
notification_comment |
可选的。评论文本。默认为notification.comment美元 . |
notification_from |
可选的。定义一个有效的From:字符串(例如:"Icinga 2主机监控 ).需要GNU mailutils (Debian / Ubuntu)或mailx (RHEL / SUSE)。 |
notification_icingaweb2url |
可选的。定义您的Icinga Web 2的URL(例如:“https://www.example.com/icingaweb2” ) |
notification_logtosyslog |
可选的。集真正的 将通知事件记录到syslog;用于调试。默认为假 . |
mail-service-notification¶
的mail-service-notification
NotificationCommand对象使用位于中的示例通知脚本/etc/icinga2/scripts/mail-service-notification.sh
.
这里是一个可以使用的论点的快速概述。另请参阅服务运行时宏为进一步的信息。
的名字 | 描述 |
---|---|
notification_date |
必需的。日期和时间。默认为icinga.long_date_time美元 . |
notification_hostname |
必需的。主人的FQDN .默认为host.name美元 . |
notification_servicename |
必需的。服务名称。默认为service.name美元 . |
notification_hostdisplayname |
必需的。主机显示名称。默认为host.display_name美元 . |
notification_servicedisplayname |
必需的。服务显示名称。默认为service.display_name美元 . |
notification_serviceoutput |
必需的。服务检查的输出。默认为service.output美元 . |
notification_useremail |
必需的。通知的收件人(s)。默认为user.email美元 . |
notification_servicestate |
必需的。主机当前状态。默认为service.state美元 . |
notification_type |
必需的。类型的通知。默认为notification.type美元 . |
notification_address |
可选的。主机的IPv4地址。默认为解决美元 . |
notification_address6 |
可选的。主机的IPv6地址。默认为address6美元 . |
notification_author |
可选的。作者发表评论。默认为notification.author美元 . |
notification_comment |
可选的。评论文本。默认为notification.comment美元 . |
notification_from |
可选的。定义一个有效的From:字符串(例如:"Icinga 2主机监控 ).需要GNU mailutils (Debian / Ubuntu)或mailx (RHEL / SUSE)。 |
notification_icingaweb2url |
可选的。定义您的Icinga Web 2的URL(例如:“https://www.example.com/icingaweb2” ) |
notification_logtosyslog |
可选的。集真正的 将通知事件记录到syslog;用于调试。默认为假 . |
依赖关系¶
Icinga 2同时使用主机和服务依赖对象,以确定其网络可达性。
服务可以依赖于主机,反之亦然。一个服务对它的宿主有一个隐式的依赖(父)。宿主到宿主的依赖关系隐式地充当宿主父关系。当计算依赖关系时,不仅要考虑直系父结点,而且要继承所有的父结点。
的parent_host_name
而且parent_service_name
属性对于服务依赖是强制的,parent_host_name
是主机依赖项所必需的。应用规则会让你确定这些属性如果需要,可以用更动态的方式。
Parent_host_name = "core-router" parent_service_name = "uplink-port"
默认情况下,如果主机或服务变得不可达,通知将被抑制。控件可以控制该选项disable_notifications
属性。
disable_notifications = false
如果该依赖项应该在父对象的软状态下触发,则需要设置ignore_soft_states
来假
.
依赖状态筛选器必须基于父对象是主机(向上
,下来
)或服务(好吧
,警告
,至关重要的
,未知的
).
下面的例子将使依赖项失败,并在父对象是的情况下触发它不在这些州中的一个:
states = [OK, Critical, Unknown]
换句话说
如果父服务对象更改为
警告
状态,此依赖项将失败,并使所有子对象(主机或服务)不可访问。
控件可以确定子节点的可达性last_reachable
属性通过REST API.
请注意
可达性的计算依赖于新的和处理过的检查结果。如果依赖项禁用了子对象的检查,这将无法可靠地工作。
主机上服务的隐式依赖¶
Icinga 2会自动为其主机上的服务添加一个隐式依赖。这样,当主机在时,服务通知就会被抑制下来
或遥不可及的
.此依赖项不覆盖其他依赖项并隐式设置disable_notifications = true
而且states =[向上]
对于所有服务对象。
服务检查仍在执行。如果要防止它们发生,可以将以下依赖项应用于将其主机设置为的所有服务parent_host_name
禁用这些检查。分配,真正
匹配所有服务
对象。
将依赖关系"disable-host-service-checks"应用于服务{disable_checks = true}
网络可达性的依赖关系¶
一个常见的场景是路由器后面的Icinga 2服务器。通过ping谷歌DNS服务器来检查上网情况google-dns
是常用的方法,但万一失败呢dsl-router
主机。因此,下面的示例定义了一个宿主依赖关系,它也隐式地充当父关系。
此外,主机可能是可达的,但ping探测会被路由器的防火墙丢弃。在情况下,dsl-router
的ping4
服务检查失败,所有进一步的检查ping4
服务主机google-dns
服务应该被抑制。通过设置disable_checks
属性来真正的
.
object主机“dsl-router”{import "generic-host" address = "192.168.1.1"} object主机“google-dns”{import "generic-host" address = "8.8.8.8"} apply Service“ping4”{import "generic-service" check_command = "ping4" assign where Host。地址}应用依赖"internet" to Host { parent_host_name = "dsl-router" disable_checks = true disable_notifications = true assign where host.name != "dsl-router" } apply Dependency "internet" to Service { parent_host_name = "dsl-router" parent_service_name = "ping4" disable_checks = true assign where host.name != "dsl-router" }
基于自定义变量应用依赖项¶
您可以使用应用规则设置父或子属性,例如:parent_host_name
到其他对象的属性。
一个常见的例子是主机上的虚拟机。该主机的对象名从CMDB或VMWare库存中自动生成到主机的自定义变量(或用于云的通用模板)。
定义主主机对象:
/*你的主对象*/ object Host "master.example.com" {import "generic-host"}
添加一个通用模板,定义所有常见的主机属性:
/*虚拟机的通用模板*/ template Host "generic-vm" {import "generic- Host "}
在您的example.com云设置自定义变量上为所有主机添加一个模板vm_parent
来master.example.com
:
template主机“generic-vm-example.com”{import“generic-vm”vars。Vm_parent = "master.example.com"}
定义你的嘉宾:
object主机“www.example1.com”{import "generic-vm-master.example.com"} object主机“www.example2.com" {import "generic-vm-master.example.com"}
控件导入的所有子主机应用主机依赖项generic-vm
模板,并设置parent_host_name
到前面定义的自定义变量host.vars.vm_parent
.
将依赖关系“vm-host-to-parent-master”应用到主机{parent_host_name = Host .vars。Vm_parent将“generic-vm”分配到主机。模板}
您可以扩展此示例,并使您的服务依赖于master.example.com
主机。它们的局部作用域允许您使用host.vars.vm_parent
类似于上面的例子。
将依赖关系“vm-service-to-parent-master”应用到服务{parent_host_name = host.varsVm_parent将“generic-vm”分配到主机。模板}
这样,您就不需要等待主主机关闭时,您的客户主机变得不可访问。相反,服务将在执行检查时立即检测它们的可达性。
请注意
这种设置局部作用域变量的方法只适用于apply规则,而不适用于对象定义。
代理检查的依赖关系¶
另一个很好的例子是基于代理的检查。您可以为响应请求的代理守护进程定义一个健康检查,并使查询该守护进程的所有其他服务都依赖于该健康检查。
apply Service "agent-health" {check_command = "cluster-zone" display_name = "cluster-health-" + host.name /*遵循惯例,代理区域名称为与主机对象名称相同的FQDN。* / var。Cluster_zone = host.name分配host.vars。agent_endpoint}
现在,让所有其他基于代理的检查都依赖于的OK状态agent-health
服务。
应用依赖"agent-health-check"服务{parent_service_name = "agent-health"状态= [OK] //如果父服务状态切换到NOT-OK disable_notifications = true assign where host.vars。agent_endpoint //自动分配所有代理端点检查作为匹配主机上的子服务,忽略其中service.name == "agent-health" //避免从子到父的自我引用}
对此有详细的描述这一章.
事件的命令¶
与通知不同,主机/服务的事件命令在每次检查执行时,如果以下条件之一匹配,就会被调用:
EventCommand对象由宿主而且服务的对象event_command
属性。
因此,EventCommand
对象应该定义一个命令行,评估当前服务状态和通过运行时变量可用的其他服务运行时属性。运行时宏,例如service.state_type美元
而且service.state美元
将被Icinga 2处理,并帮助细粒度触发事件
如果主机/服务位于客户机上命令端点event命令将在客户端本身执行(类似于check命令)。
常见的用例场景是HTTP检查失败,需要通过事件命令立即重启。另一个例子是应用程序没有响应,因此需要重新启动。还可以使用事件处理程序转发关于状态更改和事件的更多详细信息,而不是典型的通知警报所提供的信息。
使用事件命令从主机发送信息¶
这个例子从主节点发送一个web请求到一个外部工具的每一个事件触发businessprocess
服务。
定义一个EventCommand对象send_to_businesstool
它将状态更改发送到外部工具。
object EventCommand " send_to_businesstool_message " {command = ["/usr/bin/curl", "-s", "-X PUT"] arguments = {"-H" = {value ="$businesstool_url$" skip_key = true} "-d" ="$ businesstool_message$"} vars。Businesstool_url = "http://localhost:8080/businesstool" var。Businesstool_message = "$host.name$ service.name$ $service. "$ $服务状态。state_type $ $服务。check_attempt $ "}
设置event_command
属性来send_to_businesstool
在服务上。
objectservice "businessprocess" {host_name = "businessprocess" check_command = "icingacli-businessprocess" vars。Icingacli_businessprocess_process = "icinga" vars。Icingacli_businessprocess_config = "training" event_command = "send_to_businesstool"}
为了测试这个场景,你可以运行:
nc - l8080
这允许捕捉web请求。您也可以启用调试日志并搜索事件命令执行日志消息。
tail - f /var/log/icinga2/debug.log|grep EventCommand
通过REST API动作传入检查结果process-check-result或者通过Icinga Web 2。
预期结果:
# nc -l 8080 PUT /businesstool HTTP/1.1 User-Agent: curl/7.29.0 Host: localhost:8080 Accept: */* Content-Length: 47 Content-Type: application/x-www-form-urlencoded businessprocess businessprocess CRITICAL SOFT
在Linux上使用事件命令通过命令端点重启服务守护进程¶
此示例触发重启httpd
在本地系统上的服务风怒
通过命令端点执行的服务检查失败。只有当服务状态为时才会触发至关重要的
并且尝试在发送通知之前重新启动服务。
要求:
- Icinga 2作为远程节点上的客户端
- 对HTTPD守护进程具有sudo权限的Icinga用户
示例(CentOS 7):
# visudo icinga ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart httpd
注意:发行版可能会使用不同的名称。在Debian/Ubuntu上,该服务被调用输入
.
定义一个EventCommand对象restart_service
允许触发本地服务重启。把它放进全局专区将其配置同步到所有客户端。
[root@icinga2-master1.localdomain /]# vim /etc/icinga2/zones.d/global-templates/eventcommands.conf object EventCommand "restart_service" {command = [PluginDir + "/restart_service"] arguments = {"-s" = "$service. "$" "-t" = "$service。State_type $" "-a" = "$service。check_attempt$" "-S" = "$restart_service$"} vars。Restart_service = "$procs_command$"}
该事件命令触发以下脚本,重新启动服务。只有服务状态为时,脚本才会执行至关重要的
.警告和未知状态将被忽略,因为它们表示不会立即出现故障。
[root@icinga2-agent1.localdomain /]# vim /usr/lib64/nagios/plugins/restart_service #!/bin/bash同时getopts "s:t:a: s: " opt;do case $opt in s) service estate=$OPTARG;t) servicestatetype = $ OPTARG;;) serviceattempt = $ OPTARG;;年代)服务= $ OPTARG;;Esac done if ([-z $servicestatetype] || [-z $servicestatetype] || [-z $serviceattempt] || [-z $service])然后echo "USAGE: $0 -s service estate -z servicestatetype -a serviceattempt -s service"退出3;如果([$serviceattempt == " critical "] && [$servicestatetype == "SOFT"] && [$serviceattempt -eq 3]);然后执行sudo /usr/bin/systemctl restart $service fi fi [root@icinga2-agent1.localdomain /]# chmod +x /usr/lib64/nagios/plugins/restart_service . sh命令
在主节点上添加一个服务,该服务通过客户机上的命令端点执行。设置event_command
属性来restart_service
,先前定义的EventCommand对象的名称。
[root@icinga2-master1.localdomain /]# vim /etc/icinga2/zones.d/master/icinga2-agent1.localdomain.conf object Service "Process httpd" {check_command = "procs" event_command = "restart_service" max_check_attempts = 4 host_name = "icinga2-agent1. "Localdomain“command_endpoint =”icinga2-agent1。localdomain”增值。风怒_command = "httpd" vars.procs_warning = "1:10" vars.procs_critical = "1:" }
要测试此配置,只需停止httpd
在远程主机上icinga2-agent1.localdomain
.
[root@icinga2-agent1.localdomain /]# systemctl stop HTTPD
您可以启用调试日志并搜索已执行的命令行。
[root@icinga2-agent1.localdomain /]# tail -f /var/log/icinga2/debug.log | grep restart_service .log说明
在Windows上使用事件命令通过命令端点重启服务守护进程¶
此示例触发重启httpd
时,远程系统上的服务服务窗口
通过命令端点执行的服务检查失败。只有当服务状态为时才会触发至关重要的
并且尝试在发送通知之前重新启动服务。
要求:
- Icinga 2作为远程节点上的客户端
- 具有执行Powershell脚本(这是默认)权限的Icinga 2服务
定义一个EventCommand对象restart_service-windows
允许触发本地服务重启。把它放进全局专区将其配置同步到所有客户端。
[root@icinga2-master1.localdomain /]# vim /etc/icinga2/zones.d/ globaltemplates /eventcommands.conf object EventCommand "restart_service- Windows " {command = ["C:\ Windows\ Windows\ SysWOW64\ WindowsPowerShell\ v1.0\ powershell.exe", PluginDir + "/restart_service. Windows " {command = ["C:\ Windows\ Windows\ SysWOW64\ WindowsPowerShell\ v1.0\ powershell.exe", PluginDir + "/restart_service. Windows "ps1"] arguments = {"-ServiceState" = "$service. "state$" "-ServiceStateType" = "$service。state_type$" "-ServiceAttempt" = "$service。check_attempt$" "-Service" = "$restart_service$" ";exit" = {order = 99 value = "$$LASTEXITCODE"}}变量Restart_service = "$service_win_service$"}
该事件命令触发以下脚本,重新启动服务。只有服务状态为时,脚本才会执行至关重要的
.警告和未知状态将被忽略,因为它们表示不会立即出现故障。
添加restart_service.ps1
Powershell脚本到C:\Program Files\Icinga2\sbin
:
param([string]$Service = ", [string]$ServiceStateType = ", [int]$ServiceAttempt = ") if (!$scriptName = GCI $MyInvocation ($scriptName = GCI $Service Service Service estate -Or !$ServiceStateType -Or !$ServiceAttempt)PSCommandPath |Write-Host "USAGE: $scriptName -ServiceState servicestate -ServiceStateType servicestatetype -ServiceAttempt serviceattempt -Service service" -ForegroundColor红色;退出3;如果($ServiceState -eq " critical " -And $ServiceStateType -eq "SOFT" -And $ServiceAttempt -eq 3) {restart -Service $Service;}退出0;
在主节点上添加一个服务,该服务通过客户机上的命令端点执行。设置event_command
属性来restart_service-windows
,先前定义的EventCommand对象的名称。
[root@icinga2-master1.localdomain /]# vim /etc/icinga2/zones.d/master/icinga2-agent2.localdomain.conf object Service "Service httpd" {check_command = "Service -windows" event_command = "restart_service-windows" max_check_attempts = 4 host_name = "icinga2-agent2. "Localdomain“command_endpoint =”icinga2-agent2。localdomain”增值。服务_win_service = "httpd" }
要测试此配置,只需停止httpd
在远程主机上icinga2-agent1.localdomain
.
C:> net stop httpd
您可以启用调试日志中搜索已执行的命令行C: \ ProgramData \ icinga2 \ var \ \ icinga2 \ debug.log日志
.
使用事件命令通过SSH重启服务守护进程¶
此示例触发重启httpd
守护进程的时候http
服务检查失败。
要求:
- 允许SSH连接(防火墙,包过滤器)
- 使用公钥认证的Icinga用户
- 具有sudo权限的Icinga用户重启HTTPD守护进程。
在Debian的例子:
# ls /home/icinga/.ssh/authorized_keys # visudo icinga ALL=(ALL) NOPASSWD: /etc/init.d/apache2 restart
定义一个通用的EventCommand对象event_by_ssh
可用于所有使用SSH触发的事件命令:
(root@icinga2-master1.localdomain /) # vim /etc/icinga2/zones.d/master/local_eventcommands.conf / *事件命令通过ssh * /对象EventCommand“event_by_ssh”{命令= [PluginDir + " / check_by_ssh "]参数={“- h”=“event_by_ssh_address美元”“p”=“event_by_ssh_port美元”“c”=“event_by_ssh_command美元”“- l”=“event_by_ssh_logname美元”“我”=“event_by_ssh_identity美元”“q”= {set_if =“event_by_ssh_quiet美元”}“- w”=“event_by_ssh_warn美元”“c”=“- t”=“event_by_ssh_crit美元”“event_by_ssh_timeout美元”}var。event_by_ssh_address = "$address$" vars.event_by_ssh_quiet = false }
实际的event命令只传递event_by_ssh_command
属性。的event_by_ssh_service
自定义变量负责传递正确的守护进程名称,而测试服务。state_id $ gt 0
确保只有当服务不在时才重新启动守护进程好吧
状态。
object EventCommand "event_by_ssh_restart_service" {import "event_by_ssh" //仅重启daemon if state > 0 (not-ok) // icinga用户vars需要sudo权限。Event_by_ssh_command = "test $service. "state_id $ gt 0& &sudo systemctl restart $event_by_ssh_service$" }
现在设置event_command
属性来event_by_ssh_restart_service
并告诉它应该使用event_by_ssh_service
属性。
apply Service“http”{import“generic-service”check_command =“http”event_command =“event_by_ssh_restart_service”vars。event_by_ssh_service = " host.vars美元。/ / var httpd_name美元”。event_by_ssh_logname = "icinga" //vars.event_by_ssh_identity = "/home/icinga/.ssh/id_rsa.pub" assign where host.vars.httpd_name }
指定httpd_name
主机上的自定义变量,以分配服务和设置事件处理程序服务。
object主机“remote-http-host”{导入“generic-host”地址=“192.168.1.100”变量。Httpd_name = "apache2"}
要测试此配置,只需停止httpd
在远程主机上icinga2-agent1.localdomain
.
[root@icinga2-agent1.localdomain /]# systemctl stop HTTPD
您可以启用调试日志并搜索已执行的命令行。
[root@icinga2-agent1.localdomain /]# tail -f /var/log/icinga2/debug.log | grep by_ssh .log日志信息