升级使用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