Zabbix集成任务平台自动管理老旧设备

升级使用Zabbix6.4后,发现原先使用的zabbix中一处涉及ssh的脚本无法执行,检查后发现提示错误信息:Cannot establish SSH session: kex error : no match for method kex algos: server 。查阅Zabbix document发现Zabbix更新了libssh库,不再支持一些老旧设备的ssh,会出现上述问题。

翻阅网上资料,尝试一些方法后,依旧无法处理,zabbix中脚本无法登录设备,只好另辟蹊径,采用曲线办法,调用其他工具实现对设备的运维管理。经过对比发现一款开源工具dagu。

Dagu

Dagu1是一款具备web界面的计划任务平台,可以实现yaml格式文本定义一组命令并展示为DAG(有向无环图),内置功能包括支持docker容器、http请求、通过ssh执行命令。详见官方说明及文档2

Dagu is a powerful Cron alternative that comes with a Web UI. It allows you to define dependencies between commands as a Directed Acyclic Graph (DAG) in a declarative YAML format. Additionally, Dagu natively supports running Docker containers, making HTTP requests, and executing commands over SSH.

ssh方式执行命令

查询官方文档2,其中ssh示例如下:

steps:
  - name: step1
    executor:
      type: ssh
      config:
        user: dagu
        ip: XXX.XXX.XXX.XXX
        port: 22
        key: /Users/dagu/.ssh/private.pem
    command: /usr/sbin/ifconfig

发现支持使用证书方式登录,查看远嘛,发现目前不支持使用仅使用密码方式,只好更换思路

docker方式运行命令

之前在使用gogs+drone方式构建流水线时,使用docker镜像执行过ssh命令,于是结合dagu的文档中docker示例,进行尝试,配置如下:

steps:
  - name: drone-ssh
    executor:
      type: docker
      config:
        image: "appleboy/drone-ssh"
        container:
          env:
            - PLUGIN_HOST=192.168.XX.XXX
            - PLUGIN_USERNAME=root
            - PLUGIN_PASSWORD=123456
            - PLUGIN_SCRIPT=YourCommands
        host:
          autoRemove: true

建议将系统中启动dagu服务的用户加入docker用户组,可直接启动docker容器,否则提示权限不足无法启动容器导致任务失败。

与Zabbix集成

dagu提供API,可以通过请求API方式启动任务,可用curl命令测试:

curl -XPOST -d “action=start” http://<Dagu_Server_IP>:8080/dags/<Job_Name> 测试成功后可用在zabbix中集成,在 Script 下选择‘webhook’方式,使用js脚本发起http请求,参考之前的发送邮件脚本,参考代码如下:

var params = JSON.parse(value),
    req = new HttpRequest(),
    response;

    req.addHeader('Content-Type: application/x-www-form-urlencoded');
    Zabbix.log(4, 'start dagu task');
    response = req.post(params.url, 'action=' + params.action  );
    Zabbix.log(4, 'Responded with code: ' + req.getStatus() + '. Response: ' + response);
    if (req.getStatus() !== 200 ) {
        return 'Failed'
    }
    return 'OK';

需要设置两个参数:

  • url dagu任务的地址,如http://<Dagu_Server_IP>:8080/dags/<Job_Name>
  • action 默认填写为start

下一步关联动作(zabbix Actiion)不再赘述,可参考之前设置告警通知的文章

Next

经过测试,能够实现原先老旧设备出现异常时自动重启的功能,减少人工干预。后续期待dagu完善内置的ssh模块支持密码认证方式,替代docker方式,降低依赖,实现更多的自动操作。


最后修改于 2023-05-19