『请教』 关于分布式 zabbix 搭建 自动化执行预设指令的操作

2020-01-17 16:32:49 +08:00
 Aumujun

大家好

最近要对 zabbix 监控做一些调整,监控的主机大半都是网络设备。目前想要的是让报警的主机执行对应的指令,或脚本。 因为每次下层的交换机出现了问题都要挂上 vpn,然后手动解决问题,设备少还行,设备一多就是一大堆的重复性工作。

最开始是想用 ansible 实现,但想来了想去又要给 ansible 套壳,也不是个好的办法。。

当然,同一个网络中很好实现,在服务器 zabbix 脚本目录放置相关脚本,再做一些关联即可。但如果是不同的网络(使用 zabbix-proxy)中某个交换机出现了问题导致 zabbix 报警,要自动执行预设指令要怎么实现呢。

zabbix 是否能向 proxy 下的主机发送指令呢,如果没有,是否有相关骚操作达到这个功能呢。

求运维老鸟指教指教,(抱拳

4039 次点击
所在节点    Linux
13 条回复
d0m2o08
2020-01-17 16:37:36 +08:00
Aumujun
2020-01-17 16:46:07 +08:00
@d0m2o08 这个并不适用于下发执行脚本呀,而且我的所有 proxy 都是主动模式。
Aumujun
2020-01-17 16:49:02 +08:00
使用 proxy 的目的是为了让不同网络的设备数据同步到 server... 下层能通 server,而 server 并不知道下层的 proxy ip。。。
tianshiyeben
2020-01-17 18:01:35 +08:00
wd
2020-01-18 06:48:58 +08:00
你如果只能是被动模式,然后还不能从那个主机访问到被监控机器,那好像没什么办法?
wd
2020-01-18 06:49:31 +08:00
要不然就是让被监控的机器自己修复自己。
ps1aniuge
2020-01-18 22:53:34 +08:00
本人编写的批量运维,开源,免费项目 《卡死你 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 断线 }
#krun.ps1 -powershell 代码块 { 拨号 vpn; new-pssession xxx ; invoke-command -scriptblock { #2 级子命令 ; new-pssession xxx ; invoke-command -scriptblock { #3 级子命令 } } ;vpn 断线 }

可以看到,一旦用了 ssh,就相当于打断了继续递归子命令。而一旦被控子机安装了 powershell,就可以继续无穷递归。
ps1aniuge
2020-01-18 23:01:38 +08:00
严格来讲《卡死你 3000 》,ansible,都是一层主从架构,都不适合楼主这种需求。
都可以在被控机上安装,卡死你 3000 主控端,或 ansible 主控端,来实现 2 层架构。

但 ansible 本质是折腾 yaml,这种 2 层发送 yaml,再返回,ansible 要累死你。

卡死你 3000 本质是 powershell 脚本,2 层套脚本,就很容易,我还告诉你,你可以从主控机,远程传递强类型变量,如日期对象,到 1 层,再到 2 层。计算。再传回 1 层,再传回主控机,还是对象。卡死你 3000 能强死你!
d0m2o08
2020-01-19 08:16:06 +08:00
@Aumujun
proxy 主动模式的话,要不你试试在 proxy 装 jenkins agent ?

使用 jnlp 通信,这样 master 下发指令给 proxy 上的 agent,agent 可以直接操作 proxy 下面的所有机器了

你只需要让 zabbix server 通知 jenkins master 触发哪个任务就可以了
ps1aniuge
2020-01-19 16:12:47 +08:00
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 其谁谁谁谁谁?
Aumujun
2020-01-19 20:46:30 +08:00
@ps1aniuge 若我有 2 万台的网络设备,岂不是要装 2 万次?你这个和我的需求相差甚远
Aumujun
2020-01-19 20:49:03 +08:00
@d0m2o08 感谢回复,按这描述理论上可行,开年回来试一试。
ps1aniuge
2020-01-23 16:05:14 +08:00
@Aumujun ???

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/638793

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX