概述

在一个有代理的监控解决方案中,最多的工作量就在于部署以及更新代理,如何快速地完成代理程序的部署和更新,是监控解决方案中需要解决的一个难点,zabbix也是如此,官方的zabbix代理支持多种方式进行部署,如rpm、源码编译等,在这个解决方案中,采用的是源码编译后进行打包部署。

原理

实现zabbix代理的远程部署的原理是使用ssh协议,登录到目标服务器,在具备root的权限的前提下,创建zabbix监控用户和代理安装目录,以及必要的sudo的配置。将打包后的代理介质进行解压,使用zabbix监控用户进行运行,最后再通过命令检查,看看代理部署情况。

实操

工具编写

由于openssh的客户端在没有证书的情况下,无法实现免密登录,虽然也有expect语言,实现交互式的密码输入,但总体来说还是有点不太方便,所以这里使用golang自己编写了一个客户端

项目地址:https://gitee.com/xiaojinran/zabbixTools

主要实现了以下两点功能:

  • 执行命令
    执行命令分为两种,一种是等待结果返回,另一种是不等待结果,直接放置后台执行
  • 上传文件
    上传的文件均会放在目标服务器的/tmp目录下,文件名称保持一致

有了以上的两个功能之后,我们就可以通过脚本的方式,将代理介质上传后执行部署命令,再运行检查命令,即可完成代理的部署

脚本编写

根据项目的需要,可以灵活的去编写脚本,如果客户现场能够允许有root权限进行ssh登录,那么客户可以啥都不管。不然的话,客户需要帮忙预先配置好用户以及软件部署目录。

这里我假设客户已经配置好了监控用户demo,密码也为demo,以及对应的软件部署目录,即家目录。

部署脚本编写如下:

#!/bin/sh

# Transfer AgentFile

remoteControl=/zabbix/tools/remoteControl
agentFile=/zabbix/agents/zabbixAgt.tar.gz
configFile=/home/demo/zabbix/etc/zabbix_agent2.conf
host=$1
monitorUser=$2
monitorPass=$3
function uploadAgt(){
  $remoteControl -f ${agentFile} -u ${monitorPass} -w ${monitorUser} -h $host
}
function installAgt(){
  $remoteControl -u ${monitorPass} -w ${monitorUser} -h $host -c "tar -xf /tmp/zabbixAgt.tar.gz -C /home/$monitorUser"
}
function startAgt(){
  $remoteControl -b -u ${monitorPass} -w ${monitorUser} -h $host -c "/home/demo/zabbix/sbin/zabbix_agent2 -c $configFile"
}
function stopAgt(){
  $remoteControl -b -u ${monitorPass} -w ${monitorUser} -h $host -c "ps -u demo|grep zabbix|awk '{print $1}'|xargs kill -9"
}
function checkStatus(){
  sleep 3
  $remoteControl -u ${monitorPass} -w ${monitorUser} -h $host -c "ps -u $monitorUser"
}
uploadAgt
installAgt
startAgt
checkStatus

从脚本的内容也可以看到,脚本实现的逻辑也十分简单,这里不再赘述,需要强调的是,在启动代理的时候,需要将该远程命令放置后台进行执行,否则zabbix将运行超时,虽然不影响最终效果,但是用户体验会变差

zabbix配置

打开 zabbix 控制台,从导航栏 管理 -》脚本,进入到脚本的管理配置页面,点击创建脚本,如下图配置

zabbix 执行 zabbix执行远程命令机制_运维

上图的配置解释说明如下:

  • Scope:说明该脚本的触发范围。
    Action operation 动作操作,主要用于自动化的,无人值守的
    Manual host action 手动的主机操作,这个会在主机的操作菜单上进行出现
    Manual event action 手动的事件操作,这个会在事件的操作菜单上进行出现
  • 类型:说明该脚本的类型,目前支持的有Webhook、脚本、SSH、Telnet、IPMI,常用的就是脚本,比较灵活
  • 执行在:说明该脚本在哪个主机执行
  • 命令:由于类型选择了脚本,所以这里需要填写执行的命令以及参数
  • 描述:描述该脚本的用途或者其他信息
  • 主机群组:说明该脚本的可作用的范围
  • 启用确认:说明在运行该脚本动作时,需不需要二次确认

效果

  • 创建一个主机节点

zabbix 执行 zabbix执行远程命令机制_自动化_02

  • 点击 监测 -》主机 可以看到主机的状态为红色状态
  • 点击该主机,在弹出的菜单中,选择 部署代理

zabbix 执行 zabbix执行远程命令机制_自动化_03

zabbix 执行 zabbix执行远程命令机制_golang_04

点击执行,即可进行部署操作

zabbix 执行 zabbix执行远程命令机制_zabbix_05

可以看到,zabbix_agent2已经启动了,等会看下zabbix是否已经采回来数据了

zabbix 执行 zabbix执行远程命令机制_运维_06

zabbix 执行 zabbix执行远程命令机制_运维_07

这个节点的zabbix就完成了部署

总结

zabbix的脚本功能十分强大,基本围绕着运维的 代理端 、事件、服务器 这3个角色来进行运维脚本的开发,可以实现大部分运维简单的故障的自动化响应和处理,从而实现某些运维场景的故障自愈,运维自动化。