问题描述
我在带有 Tomcat 服务器的 icinga2 中为自己制作了一个测试环境。我想结合 rundeck 和 icinga 两个软件。我的想法是在 icinga 检测到问题时开始一份 rundeck 工作。在我的例子中,我有一个 tomcat 服务器,我在那里填满了交换内存,它应该启动 rundeck 作业来清除交换。 我正在使用 Icinga2 Director 进行管理。我创建了一个事件插件命令,它应该将 rundeck api 命令作为脚本执行,称为“rundeckapi”。它看起来像这样:
#/usr/lib64/nagios/plugins/rundeckapi
#!/bin/bash
curl --location --request POST 'rundeck-server:4440/api/38/job/9f04657a-eaab-4e79-a5f3-00d3053f6cb0/run' \
--header 'X-Rundeck-Auth-Token: GuaoD6PtH5BhobhE3bAPo4mGyfByjNya' \
--header 'Content-Type: application/json' \
--header 'Cookie: JSESSIONID=node01tz8yvp4gjkly8kpj18h8u5x42.node0' \
--data-raw '{
"options": {
"IP":"192.168.4.13"
}
}'
(我也尝试将命令粘贴到导演的命令字段中,但这也不起作用。)
我把它放在/usr/lib64/nagios/plugins/目录下,并在 icinga 中对命令进行如下配置:
#zones.d/director-global/command.conf
object EventCommand "SWAP clear" {
import "plugin-event-command"
command = [ PluginDir + "/rundeckapi" ]
}
服务模板如下所示:
#zones.d/master/service_templates.conf
template Service "SWAP" {
check_command = "swap"
max_check_attempts= "5"
check_interval = 1m
retry_interval = 15s
check_timeout = 10s
enable_notifications = true
enable_active_checks = true
enable_passive_checks = true
enable_event_handler = true
enable_flapping = true
enable_perfdata = true
event_command = "SWAP clear"
command_endpoint = host_name
}
然后我将服务添加到主机。
我启用了调试模式并开始填充 SWAP 并在 debug.log 中查看,使用 tail -f /var/log/icinga2/debug.log | grep 'event handler'
并发现:
notice/Checkable: Executing event handler 'SWAP clear' for checkable 'centos_tomcat_3!SWAP'
centos_tomcat_3 是测试的主机。事件处理程序似乎正在执行脚本,但是当我查看 rundeck 服务器时,我找不到正在运行的作业。当我手动启动 rundeckapi 脚本时,它可以工作,我可以在 rundeck 上看到作业。
我已经阅读了 icinga 的文档,但我没有帮助。
如果有人能帮助我,我将非常感激。 提前致谢。
解决方法
将插件定义为事件处理程序并将其分配给主机。
我使用 this docker 环境通过 Rundeck official image + 一个 NGINX 主机进行了测试:
version: '2'
services:
icinga2:
#image: jordan/icinga2
build:
context: ./
dockerfile: Dockerfile
restart: on-failure:5
# Set your hostname to the FQDN under which your
# sattelites will reach this container
hostname: icinga2
env_file:
- secrets_sql.env
environment:
- ICINGA2_FEATURE_GRAPHITE=1
# Important:
# keep the hostname graphite the same as
# the name of the graphite docker-container
- ICINGA2_FEATURE_GRAPHITE_HOST=graphite
- ICINGA2_FEATURE_GRAPHITE_PORT=2003
- ICINGA2_FEATURE_GRAPHITE_URL=http://graphite
# - ICINGA2_FEATURE_GRAPHITE_SEND_THRESHOLDS=true
# - ICINGA2_FEATURE_GRAPHITE_SEND_METADATA=false
- ICINGAWEB2_ADMIN_USER=admin
- ICINGAWEB2_ADMIN_PASS=admin
#- ICINGA2_USER_FULLNAME=Icinga2 Docker Monitoring Instance
- DEFAULT_MYSQL_HOST=mysql
volumes:
- ./data/icinga/cache:/var/cache/icinga2
- ./data/icinga/certs:/etc/apache2/ssl
- ./data/icinga/etc/icinga2:/etc/icinga2
- ./data/icinga/etc/icingaweb2:/etc/icingaweb2
- ./data/icinga/lib/icinga:/var/lib/icinga2
- ./data/icinga/lib/php/sessions:/var/lib/php/sessions
- ./data/icinga/log/apache2:/var/log/apache2
- ./data/icinga/log/icinga2:/var/log/icinga2
- ./data/icinga/log/icingaweb2:/var/log/icingaweb2
- ./data/icinga/log/mysql:/var/log/mysql
- ./data/icinga/spool:/var/spool/icinga2
# Sending e-mail
# See: https://github.com/jjethwa/icinga2#sending-notification-mails
# If you want to enable outbound e-mail,edit the file mstmp/msmtprc
# and configure to your corresponding mail setup. The default is a
# Gmail example but msmtp can be used for any MTA configuration.
# Change the aliases in msmtp/aliases to your recipients.
# Then uncomment the rows below
# - ./msmtp/msmtprc:/etc/msmtprc:ro
# - ./msmtp/aliases:/etc/aliases:ro
ports:
- "80:80"
- "443:443"
- "5665:5665"
graphite:
image: graphiteapp/graphite-statsd:latest
container_name: graphite
restart: on-failure:5
hostname: graphite
volumes:
- ./data/graphite/conf:/opt/graphite/conf
- ./data/graphite/storage:/opt/graphite/storage
- ./data/graphite/log/graphite:/var/log/graphite
- ./data/graphite/log/carbon:/var/log/carbon
mysql:
image: mariadb
container_name: mysql
env_file:
- secrets_sql.env
volumes:
- ./data/mysql/data:/var/lib/mysql
# If you have previously used the container's internal DB use:
#- ./data/icinga/lib/mysql:/var/lib/mysql
rundeck:
image: rundeck/rundeck:3.3.12
hostname: rundeck
ports:
- '4440:4440'
nginx:
image: nginx:alpine
hostname: nginx
ports:
- '81:80'
Rundeck 侧:
-
要访问 Rundeck,请使用
http://localhost:4440
网址在浏览器中打开一个新标签。您可以使用用户:admin
和密码:admin
访问。
- defaultTab: nodes
description: ''
executionEnabled: true
id: c3e0860c-8f69-42f9-94b9-197d0706a915
loglevel: INFO
name: RestoreNGINX
nodeFilterEditable: false
options:
- name: opt1
plugins:
ExecutionLifecycle: null
scheduleEnabled: true
sequence:
commands:
- exec: echo "hello ${option.opt1}"
keepgoing: false
strategy: node-first
uuid: c3e0860c-8f69-42f9-94b9-197d0706a915
-
现在转到用户图标(向右)> 个人资料,现在单击
+
图标(“用户 API 令牌”部分)并保存 API 密钥字符串,这对创建 API 很有用从 Icinga2 容器调用脚本。 -
转到“活动”页面(左侧菜单)并单击“自动刷新”复选框。
Incinga2 方面:
-
您可以通过使用
http://localhost
URL 在浏览器中打开一个新标签来进入 Icinga 2,我在 docker-compose 中定义了用户名:admin
和密码:admin
文件。 -
在
/usr/lib/nagios/plugins
路径添加以下脚本作为命令,内容如下(它是像你的场景一样的 curl api 调用,API 密钥与“Rundeck side”第三步生成的 API 密钥相同本分步部分):
#!/bin/bash
curl --location --request POST 'rundeck:4440/api/38/job/c3e0860c-8f69-42f9-94b9-197d0706a915/run' --header 'X-Rundeck-Auth-Token: Zf41wIybwzYhbKD6PrXn01ZMsV2aT8BR' --header 'Content-Type: application/json' --data-raw '{ "options": { "opt1": "world" } }'
同时使脚本可执行:chmod +x /usr/lib/nagios/plugin/restorenginx
- 在 Icinga2 浏览器选项卡中,转到 Icinga Director(左菜单)> 命令。在“命令类型”列表中选择“事件插件命令”,在“命令名称”文本框中输入“restorenginx”,在“命令”文本框中输入脚本的完整路径(
/usr/lib/nagios/plugins/restorenginx
)。然后点击“Store”按钮(底部),现在点击 Deploy(向上)。
检查 how 外观。
这是配置预览(位于 zones.d/director-global/commands.conf
):
object EventCommand "restorenginx" {
import "plugin-event-command"
command = [ "/usr/lib/nagios/plugins/restorenginx" ]
}
- 现在,创建主机模板(在我的示例中,我使用 Nginx 容器进行监控),转到 Icinga Director(左菜单)> 主机,然后选择“主机模板”。然后单击
+ Add
链接(向上)。在 Name 输入主机模板名称,我使用了“nginxSERVICE”,在“check command”文本框中输入命令来检查主机是否存活(我使用了“ping”)。现在在事件命令文本框中选择在上一步中创建的命令。
检查 how 外观。
- 现在是创建主机的时候了(基于前面的步骤模板)。转到 Icinga Direrecctor(左菜单)> 主机并选择“主机”。然后单击
+ Add
链接(向上)。在主机名上键入服务器主机名(nginx
,在 docker-compose 文件中定义),在“导入”中选择在上一步中创建的模板(“nginxSERVICE”),在“显示名称”上键入任何内容文本框,并在“主机地址”中添加 Nginx 容器 IP。点击“商店”按钮,然后点击顶部的“部署”链接。
检查 how 外观。
- 要在主机上启用事件处理程序,请转至“概览”(左菜单)> 主机,选择“NGINX”,向下滚动右侧部分并在“功能命令”部分启用“事件处理程序”。
检查 how 外观。
Nginx 方面(是时候测试脚本了):
- 停止容器并转到 Rundeck Activity 页面浏览器选项卡,您将看到 Icinga2 监控工具启动的作业。