大家好
最近要对 zabbix 监控做一些调整,监控的主机大半都是网络设备。目前想要的是让报警的主机执行对应的指令,或脚本。
因为每次下层的交换机出现了问题都要挂上 vpn,然后手动解决问题,设备少还行,设备一多就是一大堆的重复性工作。
最开始是想用 ansible 实现,但想来了想去又要给 ansible 套壳,也不是个好的办法。。
当然,同一个网络中很好实现,在服务器 zabbix 脚本目录放置相关脚本,再做一些关联即可。但如果是不同的网络(使用 zabbix-proxy)中某个交换机出现了问题导致 zabbix 报警,要自动执行预设指令要怎么实现呢。
zabbix 是否能向 proxy 下的主机发送指令呢,如果没有,是否有相关骚操作达到这个功能呢。
求运维老鸟指教指教,(抱拳
see
https://www.zabbix.com/documentation/4.0/zh/manual/config/notifications/action/operation/remote_command
这个并不适用于下发执行脚本呀,而且我的所有 proxy 都是主动模式。
使用 proxy 的目的是为了让不同网络的设备数据同步到 server... 下层能通 server,而 server 并不知道下层的 proxy ip。。。
https://github.com/tianshiyeben/wgcloud
![1](
)
你如果只能是被动模式,然后还不能从那个主机访问到被监控机器,那好像没什么办法?
要不然就是让被监控的机器自己修复自己。
本人编写的批量运维,开源,免费项目 《卡死你 3000 》就是类似的东西。
https://gitee.com/chuanjiao10/kasini3000/
1 这是世界上最强的脚本引擎,没有之一。ansible,zabbix 也不行。
2 楼主的需求说的不清不楚,建议楼主画图。
3.1 目前我理解是:
1 从主控机,到被控机( proxy,或叫网关,或叫堡垒机)。运行 vpn 拨号程序。
2 通过网关,下发命令。
主控机----》被控机----》 vpn 内网子机。
3.2 严格来讲《卡死你 3000 》,ansible,zabbix,都是一层主从架构,都不适合楼主这种需求。
3.3 《卡死你 3000 》本身是 powershell 脚本,只有它才能胜任你的需求。这基于 powershell 的超牛 x 特性。
简单来说,powershell 下发命令,基于大花括号{},而不是单双引号。由于大花括号内,可以无限套大花,这让 powershell,可以穿透 n 层系统,发送命令。
3.4 伪代码如下:
cdip.ps1 192.168.1.1
krun.ps1 -powershell 代码块 { 拨号 vpn; ssh ip "子命令" ;vpn 断线 }
-powershell 代码块 { 拨号 vpn; new-pssession xxx ; invoke-command -scriptblock { 级子命令 ; new-pssession xxx ; invoke-command -scriptblock { 级子命令 } } ;vpn 断线 }
可以看到,一旦用了 ssh,就相当于打断了继续递归子命令。而一旦被控子机安装了 powershell,就可以继续无穷递归。
严格来讲《卡死你 3000 》,ansible,都是一层主从架构,都不适合楼主这种需求。
都可以在被控机上安装,卡死你 3000 主控端,或 ansible 主控端,来实现 2 层架构。
但 ansible 本质是折腾 yaml,这种 2 层发送 yaml,再返回,ansible 要累死你。
卡死你 3000 本质是 powershell 脚本,2 层套脚本,就很容易,我还告诉你,你可以从主控机,远程传递强类型变量,如日期对象,到 1 层,再到 2 层。计算。再传回 1 层,再传回主控机,还是对象。卡死你 3000 能强死你!
proxy 主动模式的话,要不你试试在 proxy 装 jenkins agent ?
使用 jnlp 通信,这样 master 下发指令给 proxy 上的 agent,agent 可以直接操作 proxy 下面的所有机器了
你只需要让 zabbix server 通知 jenkins master 触发哪个任务就可以了
1 主控机(可以位于 win,linux ),调用本地 ssh 客户端,连接被控机 ip 上的 sshd。
2linux 上的 sshd (或 win ),fork 出一个进程,这个 sshd 进程调用(被控机 linux 本地上的) powershell。实现 proxy 的功能,或网关的功能。
3 linux 网关上的这个 powershell,调用本地 ssh 客户端,连接子网 ip 上的 sshd。如此递归。
上述功能,除了 powershell,能靠一套 java-agent,或 py-agent 实现么?
java 脚本行么?
ansible 的 yaml 剧本套剧本行么?
能打通同一种脚本运行么?还是需要用脚本 a 从主控机传递到被控机,再用另一种语言的脚本 b,往下传递?
能传递变量么?能传递强类型变量么?
舍 powershell 其谁谁谁谁谁?
若我有 2 万台的网络设备,岂不是要装 2 万次?你这个和我的需求相差甚远
感谢回复,按这描述理论上可行,开年回来试一试。
???