V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Aumujun
V2EX  ›  Linux

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

  •  
  •   Aumujun ·
    None · 2020-01-17 16:32:49 +08:00 · 4115 次点击
    这是一个创建于 1772 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家好

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

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

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

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

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

    第 1 条附言  ·  2020-01-19 21:28:02 +08:00

    匆忙之下写的描述可能不是太清楚,这里简单附个草图:

    2020-01-19_21-21.png

    13 条回复    2020-01-23 16:05:14 +08:00
    Aumujun
        2
    Aumujun  
    OP
       2020-01-17 16:46:07 +08:00
    @d0m2o08 这个并不适用于下发执行脚本呀,而且我的所有 proxy 都是主动模式。
    Aumujun
        3
    Aumujun  
    OP
       2020-01-17 16:49:02 +08:00
    使用 proxy 的目的是为了让不同网络的设备数据同步到 server... 下层能通 server,而 server 并不知道下层的 proxy ip。。。
    tianshiyeben
        4
    tianshiyeben  
       2020-01-17 18:01:35 +08:00
    wd
        5
    wd  
       2020-01-18 06:48:58 +08:00 via iPhone
    你如果只能是被动模式,然后还不能从那个主机访问到被监控机器,那好像没什么办法?
    wd
        6
    wd  
       2020-01-18 06:49:31 +08:00 via iPhone
    要不然就是让被监控的机器自己修复自己。
    ps1aniuge
        7
    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
        8
    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
        9
    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
        10
    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
        11
    Aumujun  
    OP
       2020-01-19 20:46:30 +08:00
    @ps1aniuge 若我有 2 万台的网络设备,岂不是要装 2 万次?你这个和我的需求相差甚远
    Aumujun
        12
    Aumujun  
    OP
       2020-01-19 20:49:03 +08:00
    @d0m2o08 感谢回复,按这描述理论上可行,开年回来试一试。
    ps1aniuge
        13
    ps1aniuge  
       2020-01-23 16:05:14 +08:00
    @Aumujun ???
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1020 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 19:37 · PVG 03:37 · LAX 11:37 · JFK 14:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.