Icinga2 事件插件命令通过 api 启动 rundeck 作业

如何解决Icinga2 事件插件命令通过 api 启动 rundeck 作业

我在带有 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 侧

  1. 要访问 Rundeck,请使用 http://localhost:4440 网址在浏览器中打开一个新标签。您可以使用用户:admin 和密码:admin 访问。

  2. 创建一个新的project并创建一个新的job,我创建了以下一个,您可以import it到您的实例:

- 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
  1. 现在转到用户图标(向右)> 个人资料,现在单击 + 图标(“用户 API 令牌”部分)并保存 API 密钥字符串,这对创建 API 很有用从 Icinga2 容器调用脚本。

  2. 转到“活动”页面(左侧菜单)并单击“自动刷新”复选框。

Incinga2 方面

  1. 您可以通过使用 http://localhost URL 在浏览器中打开一个新标签来进入 Icinga 2,我在 docker-compose 中定义了用户名:admin 和密码:admin文件。

  2. /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

  1. 在 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" ]
}
  1. 现在,创建主机模板(在我的示例中,我使用 Nginx 容器进行监控),转到 Icinga Director(左菜单)> 主机,然后选择“主机模板”。然后单击 + Add 链接(向上)。在 Name 输入主机模板名称,我使用了“nginxSERVICE”,在“check command”文本框中输入命令来检查主机是否存活(我使用了“ping”)。现在在事件命令文本框中选择在上一步中创建的命令。

检查 how 外观。

  1. 现在是创建主机的时候了(基于前面的步骤模板)。转到 Icinga Direrecctor(左菜单)> 主机并选择“主机”。然后单击 + Add 链接(向上)。在主机名上键入服务器主机名(nginx,在 docker-compose 文件中定义),在“导入”中选择在上一步中创建的模板(“nginxSERVICE”),在“显示名称”上键入任何内容文本框,并在“主机地址”中添加 Nginx 容器 IP。点击“商店”按钮,然后点击顶部的“部署”链接。

检查 how 外观。

  1. 要在主机上启用事件处理程序,请转至“概览”(左菜单)> 主机,选择“NGINX”,向下滚动右侧部分并在“功能命令”部分启用“事件处理程序”。

检查 how 外观。

Nginx 方面(是时候测试脚本了):

  1. 停止容器并转到 Rundeck Activity 页面浏览器选项卡,您将看到 Icinga2 监控工具启动的作业。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?