跳到内容

监测基础知识

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" {address = "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检查命令。

地址属性被检查命令用来确定哪个网络地址与主机对象相关联。

可以找到有关排除检查问题的详细信息在这里

主机状态

主机可能处于以下任一状态:

的名字 描述
向上 主机可用。
下来 主机不可用。

服务状态

服务可以处于以下状态之一:

的名字 描述
好吧 服务运行正常。
警告 该服务正在经历一些问题,但仍被认为处于工作状态。
至关重要的 日志含义检查成功确定服务处于紧急状态。
未知的 检查无法确定服务的状态。

检查结果状态映射

检查插件返回一个转换为状态号的退出码。服务直接映射状态,而主机将进行处理01作为向上为例。

价值 主机状态 服务状态
0 向上 好吧
1 向上 警告
2 下来 至关重要的
3. 下来 未知的

软硬状态

当检测到主机/服务的问题时,Icinga会多次重新检查对象(基于max_check_attempts而且retry_interval设置),然后发送通知。这确保不会为瞬时故障发送不必要的通知。在此期间,对象处于状态。

当所有的重新检查都执行完后,对象仍然处于非ok状态,主机/服务切换到发送状态和通知。

的名字 描述
主机/服务的状态最近没有改变。check_interval在这里也同样适用。
主机/服务最近改变了状态,正在重新检查retry_interval

主机和业务检查

主机和服务通过定期运行检查来确定其状态。

object主机"router" {check_command = "hostalive" address = "10.0.0.1"}

hostaliveCommand是几个内置检查命令之一。它向指定的IP地址发送ICMP应答请求地址属性确定主机是否在线。

提示

hostalive但默认阈值不同。都使用的命令,执行顺序检查。

如果需要更快的ICMP检查,请查看icmpCheckCommand。

还有一些其他的内置检查命令也可用。除了这些命令,接下来的几章将详细解释如何设置自己的检查命令。

主机检查方案

如果无法通过ICMP、HTTP等访问主机,也可以使用check命令设置默认状态。

object主机"dummy- Host " {check_command = "dummy" vars. object//Up vars. dummy_state = 0假_text = "Everything OK." }

当您发送邮件时也使用此方法外部检查结果

一种更高级的技术是基于所有服务计算总体状态。这是描述在这里

模板

模板可以用于将一组相同的属性应用到多个对象:

template服务"generic-service" {max_check_attempts = 3 check_interval = 5m retry_interval = 1m enable_perfdata = true} apply服务"ping4" {import "generic-service" check_command = "ping4" assign where host. template " general - Service " {max_check_attempts = 3 check_interval = 5m retry_interval = 1m enable_perfdata = true}{import " general - Service " check_command = "ping6" assign where host. address}应用服务"ping6" {import " general - Service " check_command = "ping6"address6}

在本例中ping4而且ping6服务从模板继承属性通用服务

对象和模板本身都可以导入任意数量的其他模板。如果需要,可以在对象中覆盖从模板继承的属性。

还可以导入现有的非模板对象。

请注意

模板和对象共享相同的命名空间,也就是说,你不能像定义对象一样定义具有相同名称的模板。

多个模板

下面的示例使用自定义变量它们在每个模板中提供。的的网络服务器Template被用作任何提供web服务的主机的基本模板。此外,它还指定了自定义变量webserver_type,如。apache.因为该模板也是基本模板,所以我们导入generic-host这里的模板。这提供了check_command属性,我们不需要在以后的任何地方设置它。

模板主机"web-server" {import "generic-host" vars = {webserver_type = "apache"}}

wp-server主机模板指定一个Wordpress实例,并设置application_type自定义变量。请注意,+ =操作符这增加了字典项,但不覆盖以前的任何var属性。

模板主机"wordpress -server" {vars += {application_type = "wordpress"}}

最终的宿主对象导入两个模板。这里的顺序很重要:首先是基本模板的网络服务器将附加属性添加到对象中,然后从wp-server对象。

object主机"wp.example.com" {import "web-server" import "wp-server" address = "192.168.56.200"}

如果希望覆盖从模板继承的特定属性,可以在主机对象上指定它们。

{import "web-server" import "wp-server" vars. object主机"wp1.example.com" {import "web-server" import "wp-server"webserver_type= "nginx" //overrides attribute from base template address = "192.168.56.201" }

自定义变量

除内置对象属性外,您还可以在var属性。

提示

这就是所谓的自定义变量贯穿整个文档,后端和web界面。

较早的文档版本将此称为自定义属性

下面的示例指定密钥ssh_port作为自定义变量,并分配一个整数值。

object主机"localhost" {check_command = "ssh" vars. exeSsh_port = 2222}

var是一个字典你可以在这里为值设置特定的键。上面的例子使用了较短的索引器语法。

另一种表示法可以写成这样:

Vars = {ssh_port = 2222}

var(“ssh_port”)= 2222

自定义变量值

自定义变量的有效值包括:

还可以定义嵌套值,例如dictionary中的dictionary。

这个例子定义了自定义变量磁盘作为字典。第一个键设置为磁盘/本身被设置为具有一个键值对的字典。

var。磁盘["disk /"] = { disk_partitions = "/" }

这可以写成这样的解析结构:

Vars = {disks = {"disk /" = {disk_partitions = "/"}}}

当尝试访问应用规则或函数中的特定子键时,请记住这一点。

另一个例子显示在示例配置中:

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. object CheckCommand "random-value" {command = [PluginDir + "/check_dummy", "0", "$text$"]text = {{Math.random() * 100}}}

此示例使用缩写λ语法

这些函数可以访问一些变量:

变量 描述
用户 User对象(用于通知)。
服务 Service对象(用于服务检查/通知/事件处理程序)。
宿主 宿主对象。
命令 命令对象(例如用于检查的CheckCommand对象)。

这里有一个例子:

var。文本={{主机。check_interval}}

除了这些变量函数可用于检索任意宏表达式的值:

var。text = {{if(宏("$address$") == "127.0.0.1") {log("正在对localhost进行检查!")}返回"Some text"}}

resolve_arguments函数可用于解析命令及其参数,与Icinga为命令而且参数属性的命令。的by_sshcommand使用这个功能让用户指定一个命令和参数,通过SSH执行:

arguments = {"-C" = {{var command =宏("$by_ssh_command$") var arguments =宏("$by_ssh_arguments$") if (typeof(command) == String && !arguments) {return command} var escaped_args = [] for (resolve_arguments(command, arguments)中的arg) {escaped_args.add(escape_shell_arg(arg))} return escaped_args. if (typeof(command) == String && !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自动尝试为您指定的属性找到最接近的匹配。具体的规则将在下一节中解释。

请注意

当使用作为单个字符签名,必须用一个额外的美元字符转义($ $).

评估顺序

当执行命令时,Icinga 2按此顺序检查以下对象以查找宏和它们各自的值:

  1. 用户对象(仅用于通知)
  2. 服务对象
  3. 宿主对象
  4. 命令对象
  5. 中的全局自定义变量var常数

此执行顺序允许您在命令对象中为自定义变量定义默认值。

下面介绍如何重写自定义变量ping_packets从前面的例子中可以看出:

object服务"ping" {host_name = "localhost" check_command = "my-ping" vars. Service "ping" {host_name = "localhost" check_command = "my-ping"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属性并引用现有的主机属性。

object Service "ping4" {check_command = "ping4" host_name = "icinga2-agent1. {check_command = "ping4"localdomain "}

当管理大量配置对象时,这是不舒服的匹配有一个共同的模式。

相反,你想使用应用规则

如果希望对所有主机进行基本监视,请添加一个ping4服务应用规则的所有主机地址属性指定的。对于1000个主机而不是1000个服务对象,只有一条规则。Apply规则会自动为您生成规则。

应用服务"ping4" {check_command = "ping4"分配给主机。地址}

更多关于赋值的解释,表达式可以在哪里找到在这里

应用规则:先决条件

在开始应用规则之前,请记住以下几点:

  • 定义最佳匹配。
  • 所有表达式都必须返回一个布尔值(一个空字符串等于例如。)

更具体的对象类型要求在以下章节中描述:

应用规则:使用示例

您可以在apply规则中使用该作用域中各自可用的对象(主机和/或服务对象)设置/覆盖对象属性。

var。application_type = host.vars.application_type

自定义变量还可以存储嵌套字典和数组。这样,您不仅可以使用它们在apply表达式中匹配它们的存在或值,还可以将它们的值分配(“继承”)到从apply规则生成的对象中。

记住上面的例子自定义变量值

var。不ification["mail"] = { groups = [ "icingaadmins" ] }

你可以在这里做两件事:

  • 检查是否存在通知自定义变量及其嵌套的字典键邮件.如果这是布尔值true,将生成通知对象。
  • 的值关键user_groups属性。
应用通知“mail- icingadmin”到主机{[…]user_groups = host.vars.notification.mail.groups

一个更高级的例子是使用在数组或字典上应用for循环规则所提供的自定义atttributes或组。

记住上面的例子自定义变量值

var。磁盘["disk /"] = { disk_partitions = "/" }

中定义的所有字典键都可以迭代磁盘.您可以选择使用该值来指定其他对象属性。

application for (disk => config in host.vars.disks){[…]var。磁盘_partitions = config.disk_partitions }

请阅读申请章更具体的见解。

提示

以这种动态方式构建配置需要生成对象的详细信息。使用对象列表CLI命令成功之后配置验证

应用规则表达式

您可以使用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)

匹配主机名正则表达式.请注意,逃了出来反斜杠字符:

赋值where regex("^webserver-[\\d+]", host.name)

匹配所有* mysql *主机名和(& &)自定义变量prod_mysql_db匹配db - *模式。所有具有自定义变量的主机test_server设置为真正的应该被忽略,或者以?结尾的主机名*内部模式。

object主机组"MySQL - Server" {display_name = "MySQL Server" assign where match("* MySQL *", host.name) && match("db-*", host.vars.prod_mysql_db) ignore where host.vars. Server" {display_name = "MySQL Server"Test_server == true忽略where match("*internal", host.name)}

类似的高级通知应用规则过滤器的示例笔记匹配黄金是否有24x7的支撑字符串两个条件中的一个通过,或者客户主机自定义变量设置为customer-xy主机自定义变量always_notify被设置为真正的

对于主机名以“”结尾的服务,该通知将被忽略*内部优先级自定义变量不到2

template Notification " cuast -xy- Notification " {users = ["noc-xy", "mgmt-xy"] command = "mail-service-notification"}将Notification "notify- cuast -xy-mysql"应用到Service {import " cuast -xy- Notification " assign where match("*has gold support 24x7*", Service .notes) && (host.vars. txt)客户端== " 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属性将服务对象应用到所有主机地址属性和自定义变量操作系统设置为字符串Linuxvar

apply Service "ssh" {import " general - Service " check_command = "ssh" assign where host. "address && host.vars.os == "Linux"}

例如,在他们各自的章节中使用了其他详细的例子使用自定义命令参数应用服务

向主机和服务应用通知

通知应用于特定目标(宿主服务),并以类似的方式工作:

{import "mail-service-notification" user_groups = ["noc"] assign where host.vars.notification.mail}

在本例中mail-noc属性的所有服务的通知将作为对象创建notification.mail自定义变量的定义。notification命令设置为mail-service-notification和用户组的所有成员noc将得到通知。

还可以一般应用通知模板,并通过检查自定义变量动态覆盖模板中的值。这可以通过使用条件语句

apply Notification " Host -mail-noc" to Host {import "mail-host-notification" //将继承自"mail-host-notification"模板的间隔替换为新的通知间隔,该间隔由主机自定义变量设置if (Host .vars.notification_interval) {interval = Host .vars。if (host.vars.notification_period) {period = host.vars. Notification_interval} //与通知周期相同。通知_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包含所有相关通知设置。apply规则应用于所有主机对象host.address定义。

如果主机对象有一个特定的自定义变量集,它的值将被继承到本地通知对象范围中,例如。host.vars.notification_intervalhost.vars.notification_period而且host.vars.notification_type.对象中已经指定的属性将被覆盖mail-host-notification模板。

对应的宿主对象看起来像这样:

{import " Host -linux-prod" display_name = "host1" address = "192.168.1.50" vars. object主机"host1" {import " Host -linux-prod" display_name = "host1" address = "192.168.1.50"Notification_interval = 1h vars。通知_period = "24x7" vars.notification_type = "sms" }

将依赖关系应用到主机和服务

详细的例子可以在依赖关系一章。

为主机和服务应用重复停机时间

示例配置中包含一个示例downtimes.conf

详细的例子可以在反复出现宕机一章。

使用Apply For规则

旁边的标准使用方法应用规则需要基于集合(数组或字典)应用对象申请表达式。

中已经包含了示例配置的详细示例hosts.conf而且services.conf对于这个用例。

举个例子:主机为不同的服务检查类型提供snmp oid。这可能看起来像下面的例子:

object主机"router-v6" {check_command = "hostalive" address6 = "2001:db8:1234::42"Oids ["if01"] = "1.1.1.1.1" vars. oid ["if01"] = "1.1.1.1.1"Oids ["temp"] = "1.1.1.1.2" vars. oid ["temp"] = "1.1.1.1.2"oid ["bgp"] = "1.1.1.1.5"}

其思想是创建服务对象if01而且临时但不是边界网关协议.oid值也应该被用作服务自定义变量snmp_oid.命令所需的命令参数snmp检查命令。服务的display_name应该设置为字典内的标识符,例如。if01

application Service for (identifier => oid in host.vars.oids) {check_command = "snmp" display_name = identifier vars.oid。Snmp_oid = oid ignore where identifier == "bgp" //不为bgp检查生成服务}

Icinga 2计算申请规则适用于具有自定义变量的所有对象oid集。对象中的所有字典项进行迭代循环并求值分配/忽略表达式。你可以在这些表达式中访问循环变量,例如忽略特定的值。

在本例中边界网关协议标识符被忽略。这避免了产生不必要的服务。另一种方法是匹配oid值与正则表达式/通配符匹配模式为例。

忽略在正则表达式(“^ \ d。\ d。\ \ d d。5美元”,oid)

请注意

你不需要指定的地方方法是否存在oid自定义变量。

此方法可避免创建多个apply规则。它还将属性规范逻辑从服务移动到主机。

申请和自定义变量覆盖

想象一个不同的更高级的示例:您正在使用许多接口(服务)监视网络设备(主机)。适用于下列要求/问题:

  • 每个接口服务都应该用一个前缀和在您的主机对象(可以从您的CMDB等生成)中定义的名称命名。
  • 每个接口都有自己的VLAN标签
  • 部分接口启用了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"} vars.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 >为每个迭代。

/*循环遍历host. vres .interfaces字典* for (key => value in dict)表示' interface_name '作为键*,' interface_config '作为值。使用indexer(' . ')字符访问配置属性*。*/ apply Service "if-" for (interface_name => interface_config in host.vars.interfaces) {

导入通用服务模板,分配iftrafficcheck_command.使用字典键interface_name设置一个适当的display_name用于外部接口的字符串。

import " general -service" check_command = "iftraffic" display_name = "IF-" + interface_name .

interface_name键的值与用作命令参数的字符串相同iftraffic

/*使用键作为命令参数(不重复host.vars.interfaces中的值)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命令*定义所要求的命令参数_exact_相同,则可以以更短的方式实现上述功能。*/ vars += interface_config

如果用户没有为所需的服务自定义变量指定默认值,请在这里添加它们。这也有助于避免不必要的配置验证错误或运行时失败。请阅读更多关于条件语句的内容在这里

/*设置单元和带宽的默认值*/ if (interface_config. config)Iftraffic_units == "") {vars. 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

*/ if (len(interface_config.iftraffic_community) == 0 || len(vars.iftraffic_community) == 0) {vars.iftraffic_community == 0欧宝app官网网址iftraffic_欧宝app官网网址community = IftrafficSnmpCommunity}

使用提供的值来计算可以在外部接口中看到更多的对象属性。

/*在填充' vars '字典后计算一些额外的对象属性*/ notes = "接口检查" + interface_name + "(单元:'" + interface_config。iftraffic_units + "') in VLAN '" + vars。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}

提示

以这种动态方式构建配置需要生成对象的详细信息。使用对象列表CLI命令成功之后配置验证

验证apply-for-rule使用继承的自定义变量成功创建了服务对象:

# icinga2 daemon -C # icinga2对象列表——type Service——name *catalyst* object 'cisco-catalyst-6509-34!if-GigabitEthernet0/2',类型为'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 * 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' of type '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" Object 'cisco-catalyst-6509-34!if-MgmtInterface1' of type 'Service':…* 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 % = modified in '/etc/icinga2/conf.d/iftraffic.conf',第63:5-63:30 * interface_address = "127.99.0.100" * qos = "not set" % = " modified in '/etc/icinga2/conf.d/iftraffic.conf',第72:5-72:24 * vlan = "mgmt"

在应用规则中使用对象属性

因为apply规则是在通用对象之后计算的,所以您可以引用现有的主机和/或服务对象属性作为apply规则中指定的任何对象属性的值。

object主机" open星云- Host " {import "generic-host" address = "10.1.1.2" vars. net举办["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值类型的自定义变量。的迭代是必须的键= >值下面的符号适用于规则。

apply Service for (customer => config in host.vars. hosts) {import " general - Service " check_command = "ping4" vars. vars. conf {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 }

每个循环迭代都有不同的值客户和配置'在本地作用域。

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 Vars。http_uri =…+ vars.http_uri

组是相似对象的集合。组主要用于web界面的可视化辅助。

组成员关系是在各自的对象本身定义的。如果有主机组名称窗户例如,如果想将特定的主机分配给这个组,以便稍后在警报仪表板上查看该组,首先创建一个HostGroup对象:

object主机组"windows" {display_name = "windows Servers"}

然后将您的主机添加到此组:

模板主机"windows-server" {groups += ["windows"]} object主机"mssql-srv1" {import "windows-server" vars. template "windows-server" {groups += ["windows"]} objectmssql_port = 1433} object主机" mssql_srv2 "{导入"windows-server" vars. mssql_port = 1433}Mssql_port = 1433}

对于服务和用户组,可以采用相同的方法:

object用户组"Windows - MSSQL - Admins" {display_name = "Windows MSSQL Admins"}模板用户"generic-windows-mssql-users" {groups += ["Windows - MSSQL - Admins"} object用户"win-mssql-noc" {import "generic-windows-mssql-users" email = "noc@example.com"} object用户"win-mssql-ops" {import "generic-windows-mssql-users" email = "ops@example.com"}

组成员分配

不用手动将每个对象分配给一个组,你也可以根据对象的属性将对象分配给一个组:

object主机组" prodd - MSSQL " {display_name = "生产MSSQL服务器"分配到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用户"icingaadmin" {display_name = "Icinga 2 Admin" enable_notifications = true states = [OK, Warning, Critical] types = [Problem, Recovery] email = "icinga@localhost"}

如果你不设置而且类型的配置属性用户对象,则将发送所有状态和类型的通知。

可以找到有关故障排除通知问题的详细信息在这里

请注意

确保通知启用该特性是为了执行通知命令。

您应该选择您(和通知的用户)对紧急情况感兴趣的信息,以及哪些信息对您和您的环境没有任何价值。

本文解释了一个通知命令示例在这里

可将所有共享属性添加到通知模板,它继承到已定义的通知。这样您就可以在每个文件中保存重复的属性通知对象。属性可以在本地覆盖。

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的示例配置。

使用应用关键字创建通知服务的对象:

{import "generic-notification" users = ["noc-xy", "mgmt-xy"] assign where match("*has gold support 24x7*", Service .notes) && (host.vars. mysql)客户端== " 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 + "'没有为通知'" + name + "'指定所需的用户/user_groups配置属性}users = Host .vars.notification.mail.users user_groups = Host .vars.notification.mail && typeof(Host .vars.notification.mail) == Dictionary}将通知"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 + "'没有为notification '" + name + "'.")指定所需的用户/user_groups配置属性}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) {user_groups = host.vars.notification.mail} assign where (host.vars.notification.mail && typeof(host.vars.notification.mail) == Dictionary) || (service.vars.notification.mail && typeof(service.vars.notification.mail) == Dictionary)}

通知升级

如果发送了问题通知,而在重新通知时问题仍然存在,则可能需要将问题升级到下一个支持级别。另一种方法是通过电子邮件配置默认通知,如果尚未解决,则通过短信升级问题。

可以将通知开始和结束时间定义为附加配置属性,从而使通知对象一个所谓的通知升级.使用模板,您可以共享基本的通知属性,如用户或时间间隔(然后覆盖它们以进行升级)。

使用上面的示例,您可以定义在开始和结束时间之间升级短信通知的其他用户。

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的短信通知。

请注意

该示例并不完整,因为有许多不同的短信提供程序。请注意,发送短信通知将需要短信提供商或本地硬件与活动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- first -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 = [" icingadmin "] 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 = [" icingadmin "] interval = 0 // disable re-notification assign where Service .name == "ping4"}

按状态和类型筛选通知

控件定义的通知状态和类型筛选器属性通知用户对象,Icinga 2假设所有的状态和类型都被通知。

可用的通知状态和类型过滤器有:

template Notification "generic-notification" {states = [OK, Warning, Critical, Unknown] types = [Problem, Acknowledgement, Recovery, Custom, FlappingStart, FlappingEnd, DowntimeStart, DowntimeEnd, DowntimeRemoved]}

命令

Icinga 2使用三种不同的命令对象类型来指定应该如何执行检查、应该如何发送通知以及应该如何处理事件。

检查命令

CheckCommand对象定义如何调用检查的命令行。

CheckCommand对象通过宿主而且服务对象的使用check_command属性。

请注意

确保检查程序启用特性是为了执行检查。

将插件与CheckCommand定义集成

除非你已经这样做了,下载你的check插件,并把它放在PluginDir目录中。下面的示例使用check_mysql插件包含在监控插件包中。

插件路径和所有命令参数都是一个双引号字符串参数列表,用于正确的shell转义。

调用check_disk插件的——帮助参数以查看所有可用选项。我们的例子定义了warning (- w)和关键(- c)磁盘使用率阈值。没有定义任何分区(- p)它将检查所有的本地分区。

icinga@icinga2 $ /usr/lib64/nagios/plugins/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 cipher] [-f optfile] [-g group]

下一步是了解如何做到这一点命令参数正在从主机或服务对象传递,并添加CheckCommand根据这些必需的参数和/或默认值定义。

请继续阅读插件部分有关其他集成示例。

从主机或服务传递检查命令参数

Check命令参数被定义为自定义变量,可以被执行的Check命令作为运行时宏访问。

ITL提供的插件检查命令定义的检查命令参数有文档记录在这里例如,磁盘

为了练习传递命令参数,您应该集成自己的插件

下面的示例将使用check_mysql提供的监控插件

例如,定义默认的check命令自定义变量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加密"}}vars。Mysql_check_slave = false vars。Mysql_ssl = false vars。mysql_host= "$address$" }

check命令定义也设置mysql_host解决美元默认值。例如,如果MySQL主机不在同一服务器的ip地址上运行,则可以覆盖该命令参数。

确保传递所有必需的命令参数,例如mysql_usermysql_password而且mysql_databaseMysqlUsername而且MysqlPassword被指定为全局常量在这个例子中。

# vim /etc/icinga2/conf.d/services.conf apply Service "mysql-icinga-db-health" {import "generic-service" check_command = "my-mysql" vars. confmysql_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 " general - Service " check_command = "ssh" vars. import " general - Service " check_command = "ssh"Ssh_port = 2022 //自定义命令参数赋值where(主机。&& host.vars.os == "Linux"}

如果您希望在主机而不是服务上配置此配置,请改为修改主机配置对象。描述了运行时宏解析顺序在这里

icinga2-agent1对象主机”。localdomain{…var。ssh_port = 2022 }

使用Apply For传递检查命令参数

主机本地主机的生成的服务basic-partitions字典(见申请有关详细信息)使用修改的自定义变量(警告阈值为10%的临界阈值5%空闲磁盘空间)。

自定义变量disk_partition可以保存单个字符串或字符串值数组,以便将多个分区传递给check_disk检查插件。

object主机"my-server" {import "generic-host" address = "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%" vars。Disk_cfree = "5%"}

关于在自定义变量中使用数组的更多详细信息,请参见这一章

命令参数

在短的旁边命令数组中指定的插件/脚本参数,建议在参数字典属性。

的值——参数Key本身是一个带有附加键的字典。它们允许创建通用的命令对象,也用于文档的目的,例如使用描述字段复制插件的帮助文本在那里。Icinga Director在选择参数时使用该字段来显示参数的目的。

参数={"——参数”= =“…”价值={描述“……”}}

默认情况下,每个参数都是可选的,如果未设置值则省略。

了解关于将插件与CheckCommand对象集成的更多信息这一章

还可以使用不同的参数和参数只创建一次命令,如下所示。

命令参数:值

为了找到命令参数,调用插件的帮助或咨询README。

/ check_systemd.py——帮助…-u UNIT,——UNIT UNIT被测试的systemd单元名称。

只要有长形参名可用,就应选择长形参名而不是短形参名。

参数={"——unit" = {}}

定义一个独特的前缀获取命令的特定参数。最佳实践是遵循以下模式:

<命令名称> _ <参数名称>

因此使用systemd_作为前缀,并使用长插件参数名单位运行宏语法。

参数={"——unit" = {value = "$systemd_unit$"}}

为了指定一个默认值,请指定一个自定义变量CheckCommand对象内部。

var。systemd_unit = " icinga2 "

该值可以作为命令参数从主机/服务对象中覆盖。

命令参数:描述

最佳实践,也在里面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 ={{宏("$postgres_unixsocket$") == false}} description = "hostname(s) to connect to;默认为none (Unix套接字)"}

对该主机和服务的已执行检查…

object主机“postgresql-cluster”{//…var。Postgres_host =“192.168.56.200”vars。Postgres_unixsocket = false}

使用以下命令行:

“/ usr / lib64 / nagios /插件/ check_postgres.pl”“- h”“192.168.56.200”

设置的主机/服务对象postgres_unixsocket不添加- h参数及其值设置为命令行。

引用:缩写λ语法

命令参数:订单

插件可能需要特殊顺序的参数。一个接一个,或者例如,一个参数总是在第一个位置。

参数={”——第一个“= {value = "…"描述=“…”= 5}”,第二次“= {value = "…"描述=“…”秩序= 4}”——去年”= {value = "…"描述=“…”秩序= 99}}

记住,位置论证需要经过彻底的检验。

命令参数:Repeat Key

参数可以使用数组值类型。每当Icinga遇到数组时,默认情况下它会重复参数键和每个值元素。

command = [NscpPath + "\\ NscpPath .exe", "client"] arguments = {"-a" = {value = "$ NscpPath arguments$" description = "…" repeat_key = true}}

在主机/服务对象上,指定nscp_arguments自定义变量作为一个数组。

var。nscp_arguments = ["exclude=sppsvc", "exclude=ShellHWDetection"]

这转换成以下命令行:

ncsp .exe 'client' '-a' 'exclude=sppsvc' '-a' 'exclude=ShellHWDetection'

如果插件要求你传递列表而不重复键,设置repeat_key = false在参数定义中。

command = [NscpPath + "\\ NscpPath .exe", "client"] arguments = {"-a" = {value = "$ NscpPath arguments$" description = "…" repeat_key = false}}

这转换成以下命令行:

nssp .exe 'client' '-a' 'exclude=sppsvc' 'exclude=ShellHWDetection' '
命令参数:键

参数属性要求惟一的键。有时,您需要在结果命令行中使用相同的键名来覆盖它。因此,您可以专门覆盖arguments键。

参数={"——key1”= {value = "…"键=“-specialkey”}”——key2 = {value = "…"键= " -specialkey "}}

这会产生以下命令行:

' -specialkey ' '…”“-specialkey“……”

环境变量

env命令对象属性指定一个环境变量列表,其中包含从自定义变量计算出来的值,这些值应该在执行命令之前作为环境变量导出。

例如,当向数据库检查传递凭据时,这对于隐藏命令行输出中的敏感信息非常有用:

object CheckCommand "mysql" {command = [PluginDir + "/check_mysql"] arguments = {"-H" = "$mysql_address$" "-d" = "$mysql_database$"} vars. {command = [PluginDir + "/check_mysql"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 CheckCommand "mysql_health_env" {import "mysql_health" // https://labs.consol.de/nagios/check_mysql_health/NAGIOS__SERVICEMYSQL_USER = "$mysql_health_env_username$"NAGIOS__SERVICEMYSQL_PASS = "$mysql_health_env_password$"}

指定自定义变量mysql_health_env_username而且mysql_health_env_password然后在服务对象中。

请注意

请记住,值仍然是可见的调试控制台和检查模式在Icinga导演

你也可以在应用程序的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-notificationNotificationCommand对象使用位于/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 可选的。定义URL到你的Icinga Web 2(例如。“https://www.example.com/icingaweb2”
notification_logtosyslog 可选的。真正的将通知事件记录到syslog日志中;用于调试。默认为

mail-service-notification

mail-service-notificationNotificationCommand对象使用位于/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 可选的。定义URL到你的Icinga Web 2(例如。“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 assign where true}

网络可达性的依赖关系

一个常见的场景是Icinga 2服务器位于路由器后面。ping谷歌DNS服务器,检查是否可以上网google-dns是一个常见的方法,但会失败的情况下dsl-router主机。因此,下面的示例定义了一个主机依赖关系,它也隐式地充当父关系。

此外,主机可能是可达的,但ping探测被路由器的防火墙丢弃。在情况下,dsl-routerping4服务检查失败,所有进一步检查ping4服务主机google-dns服务应该被抑制。可以通过设置disable_checks属性来真正的

object主机" dns -router" {import "generic-host" address = "192.168.1.1"} object主机"google-dns" {import "generic-host" address = "8.8.8.8"} apply服务"ping4" {import "generic-service" check_command = "ping4" assign where Host . {import "generic-service" check_command = "ping4"地址}应用依赖"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库存中自动生成到主机的自定义变量(或您的云的通用模板)中。

定义主主机对象:

/*你的主机*/对象主机"master.example.com"{导入"generic-host"}

添加定义所有通用主机属性的通用模板:

/*为你的虚拟机创建通用模板

在example.com云设置自定义变量上为所有主机添加模板vm_parentmaster.example.com

模板主机“generic-vm-example.com”{导入“generic-vm”vars。Vm_parent = "master.example.com"}

定义你的嘉宾主持人:

object主机“www.example1.com”{导入“generic-vm-master.example.com”}object主机“www.example2.com”{导入“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.vars。Vm_parent指定主机中“generic-vm”的位置。模板}

这样,当主主机停机时,您就不需要等待客座主机变得无法连接。相反,服务将在执行检查时立即检测它们的可达性。

请注意

这种设置局部作用域变量的方法只适用于apply规则,而不适用于对象定义。

代理检查的依赖关系

另一个很好的例子是基于代理的检查。您将为响应您的请求的代理守护进程定义一个健康检查,并使查询该守护进程的所有其他服务依赖于该健康检查。

apply Service "agent-health" {check_command = "cluster-zone" display_name = "cluster-health-" + host.name /*遵循代理区域名称为与主机对象名称相同的FQDN的约定。* / var。Cluster_zone = host.nameagent_endpoint}

现在,让所有其他基于代理的检查依赖于agent-health服务。

apply Dependency "agent-health-check" to Service {parent_service_name = "agent-health" states = [OK] //如果父服务状态切换为NOT-OK则失败disable_notifications = true assign where host.vars. propertiesagent_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" {command = ["/usr/bin/curl", "-s", "-X PUT"] arguments = {"-H" = {value ="$businesstool_url$" skip_key = true} "-d" ="$ businesstool_message$"}Businesstool_url = "http://localhost:8080/businesstool" vars. "Businesstool_message = "$host.name$ $service.name$ $service.name$ $service. "$ $服务状态。state_type $ $服务。check_attempt $ "}

设置event_command属性来send_to_businesstool在服务上。

object服务"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权限的用户

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. conf。State $" "-t" = "$service。State_type $" "-a" = "$service "。check_attempt$" "-S" = "$restart_service$"}变量。Restart_service = "$procs_command$"}

此事件命令触发以下脚本,该脚本将重新启动服务。只有当服务状态为时,脚本才会执行至关重要的.警告和未知状态被忽略,因为它们并不表示立即发生故障。

[root@icinga2-agent1.localdomain /]# vim /usr/lib64/nagios/plugins/restart_service #!/bin/bash while getopts "s:t:a: s: " opt;service estate=$OPTARG;;t) servicestatetype = $ OPTARG;;) serviceattempt = $ OPTARG;;年代)服务= $ OPTARG;;Esac done if ([-z $servicestatetype] || [-z $servicestatetype] || [-z $serviceattempt] || [-z $service]);然后返回"USAGE: $0 -s servicestatetype -z servicestatetype -a serviceattempt -s service" exit 3;else #只在关键事件第三次尝试时重新启动if ([$ serviceestate == " 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 . txt

在主节点上添加一个服务,该服务通过客户机上的命令端点执行。设置event_command属性来restart_service,前面定义的EventCommand对象的名称。

[root@icinga2-master1.localdomain /]# vim /etc/icinga2/zone .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. properties "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作为远程节点上的客户机
  • Icinga 2服务具有执行Powershell脚本的权限(这是默认的)

定义一个EventCommand对象restart_service-windows它允许触发本地服务重启。把它放进全局专区将其配置同步到所有客户端。

[root@icinga2-master1.localdomain /]# vim /etc/ icinga1 /zone .d/global-templates/eventcommands.conf对象EventCommand "restart_service- Windows " {command = ["C:\\Windows\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell.exe", PluginDir + "/restart_service. Windows " {ps1"]参数= {"-ServiceState" = "$service. ps1"]state$" "-ServiceStateType" = "$service. "state_type$" "-ServiceAttempt" = "$service. "check_attempt$" "-Service" = "$restart_service$";exit" = {order = 99 value = "$$LASTEXITCODE"}}变量。Restart_service = "$service_win_service "}

此事件命令触发以下脚本,该脚本将重新启动服务。只有当服务状态为时,脚本才会执行至关重要的.警告和未知状态被忽略,因为它们并不表示立即发生故障。

添加restart_service.ps1Powershell脚本到C:\Program Files\Icinga2\sbin

param([string]$Service = ", [string]$ServiceStateType = ", [string]$ ServiceAttempt = ") if (!$Service -Or !$ServiceState -Or !$ServiceStateType -Or !$ServiceAttempt) {$scriptName = GCI $MyInvocation。Select -Expand Name;写主机"USAGE: $scriptName -ServiceState servicestatetype -ServiceStateType -ServiceAttempt serviceattempt -Service service"退出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/zone .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. properties "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重新启动服务守护进程

的重新启动httpdhttp服务检查失败。

要求:

  • 允许SSH连接(防火墙、包过滤器)
  • Icinga使用公钥身份验证的用户
  • Icinga具有sudo权限的用户重新启动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_by_ssh_command属性。的event_by_ssh_serviceCustom变量负责传递正确的守护进程名称,而测试服务。state_id $ gt 0确保只在服务不在好吧状态。

object EventCommand "event_by_ssh_restart_service" {import "event_by_ssh" //只在状态> 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 " general - Service " check_command = "http" event_command = "event_by_ssh_restart_service" vars. apply Service "http" {import " general - Service " check_command = "http" event_command = "event_by_ssh_restart_service"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" {import "generic-host" address = "192.168.1.100" vars. confHttpd_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