Zabbix接入蓝鲸故障自愈实现告警触发自愈动作

0x01 蓝鲸和故障自愈等简介

  • 腾讯蓝鲸的介绍可以前往官方文档中心,或者这篇文章
  • 故障自愈是一款实现服务器故障自动处理的解决方案,提升企业服务可用性和降低故障处理的人力投入。通过自动化处理来节省人力投入,通过预定的恢复流程让恢复过程更可靠,通过并行分析达到更快的故障定位和恢复,最终减少业务损失的风险。更详细的说明请前往故障自愈文档中心
  • Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案,更详细的说明请前往Zabbix文档中心

0x02 实现思路

  • 1.Zabbix通过模板设置触发器,监控目标主机的各项指标
  • 2.目标主机的触发告警时,Zabbix通过调用Action发送告警信息到故障自愈
  • 3.故障自愈匹配告警内容,符合设置的自愈套餐时,开始执行自愈套餐
  • 4.故障自愈依据事先设定的自愈套餐,调用作业平台在目标主机上执行作业完成自愈

0x03 环境准备

  • Zabbix4.0,使用Docker部署,也可采用其他版本。
  • 蓝鲸社区版或者企业版,故障自愈SaaS。
  • 一台linux主机A,需要安装Zabbix-Agent和蓝鲸的Agent。

0x04 Docker部署Zabbix-server和Zabbix-agent

  • 默认已经安装好Docker了,不再累述怎么安装Docker了,官方文档有主流Linux发行版本的安装文档
  • 第一步部署一个MySQL5.7的容器,参考命令如下:
docker run –name zabbix-mysql -t \
     -e MYSQL_DATABASE="zabbix" \
     -e MYSQL_USER="zabbix" \
     -e MYSQL_PASSWORD="zabbix@123" \
     -e MYSQL_ROOT_PASSWORD="root@123" \
     -v /etc/localtime:/etc/localtime   \
     -v /data/zabbix/mysql:/var/lib/mysql \
     -d mysql:5.7
# 上面的参数熟悉的docker的很好理解,不再解释
  • 第二步部署一个Zabbix-server的容器,参考命令如下:
docker run --name zabbix-server -t \
      -e DB_SERVER_HOST="zabbix-mysql" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix@123" \
      -e MYSQL_ROOT_PASSWORD="root@123" \
      -v /etc/localtime:/etc/localtime  \
      --link zabbix-mysql:mysql \
      -p 10051:10051 \
      -d zabbix/zabbix-server-mysql:centos-4.0-latest
# DB_SERVER_HOST为MySQL容器名,在zabbix-server容器的hosts文件会记录对应关系。
# --link zabbix-mysql:mysql 这个会链接两个容器,使其可以相互通信。
  • 第三步部署一个Zabbix-web的容器,可以选择Nginx或者Apache类型的都可以,参考命令如下:
docker run --name zabbix-web -t \
      -e DB_SERVER_HOST="zabbix-web" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix@123" \
      -e MYSQL_ROOT_PASSWORD="root@123" \
      -v /etc/localtime:/etc/localtime   \
      --link zabbix-mysql:mysql \
      --link zabbix-server:zabbix-server\
      -p 4080:80 \
      -d zabbix/zabbix-web-nginx-mysql:centos-4.0-latest
#  在这里因为80端口被占用了,所以使用了4080这个端口,可根据自己的实际情况修改。
# 上述皆采用了centos类型版本4.0的Zabbix,也可采用其他OS类型和版本的Zabbix,但需注意要保持版本一致。
  • 不出意外的话,此时访问IP:4080端口便可以进入到Zabbix的登录界面,默认的账户密码是Admin,zabbix。
  • 如果并不能进行访问,请检查三个容器是否运行正常,参考命令如下:
[root@monitor01 ~]# docker ps -a
CONTAINER ID        IMAGE                                             COMMAND                  CREATED           STATUS            
738b3b27d24e        zabbix/zabbix-web-nginx-mysql:centos-4.0-latest   "docker-entrypoint.sh"   4 weeks ago       Up 6 hours   0.0.0.0:4080->80     
zabbix-web-nginx-mysql
18fec4385535        zabbix/zabbix-server-mysql:centos-4.0-latest      "/sbin/tini -- /us..."   4 weeks ago       Up 6 hours 0.0.0.0:10051->10051/tcp 
zabbix-server
72b462627893        mysql:5.7                                          "docker-entrypoint..."   4 weeks ago       Up 6 hours   0.0.0.0:3306->3306/tcp
zabbix-mysql
# 上述输出受格式限制有删减
# 如果有容器处于 Exited 状态,请查看容器日志输出,排除错误后继续。查看日志参考命令:
docker logs -f name/id
eg: docker logs -f zabbix-mysql
  • Zabbix服务端和主机A都安装zabbix-agent,并启动
  • 前往Zabbix的官网下载与容器版本相对应的Zabbix的Agent,下载地址
  • 以CentOS7.2讲一下如何安装Zabbix-agent,默认已经下载好了Agent的rpm安装包,参考命令如下:
rpm -ivh ./zabbix-agent-4.2.3-2.el7.x86_64.rpm
# 修改Agent的配置文件
vim /etc/zabbix/zabbix_agentd.conf
# 修改Server ServerActive字段为Zabbix-server的IP
# 修改Hostname字段为该主机的自身IP
# 修改完毕后启动Zabbix-agent
systemctl start zabbix-agent
systemctl enable zabbix-agent
  • 接着前往Zabbix的网页端,添加Agent。
  • 浏览器中打开Zabbix-server主机IP:4080,进入仪表盘,选择配置,选择主机,点击创建主机。如下图所示:

  • 配置好Agent端后,稍等便可便可以在Agent的列表中可用性变成绿色,代表正常。如果为红色,则需要排查出错原因。

  • 至此,Zabbix-server和agent便都安装完毕,运行正常,接下来便需要把Zabbix接入蓝鲸的故障自愈之中。

0x05 Zabbix接入蓝鲸故障自愈

  • 首先打开故障自愈,接着选择接入自愈,选择接入告警源。可以看到已启用的告警源和未启用的告警源。
  • 目前蓝鲸故障自愈支持主流的运维产品,对于不常用和企业自研的运维产品则可以REST APi推送,拉取的方式对接故障自愈。如下图所示:

  • 接着看一看到Zabbix接入故障自愈的大致操作流程,按照此步骤操作即可,首先下载推送脚本,该脚本实际上是自动创建发送消息到故障自愈的Zabbix的Action

  • 然后把该脚本copy到Zabbix-server所在的docker容器中的/usr/lib/zabbix/alertscripts/目录下,按照操作提示继续执行zabbix_fta_alarm.py脚本。如下图所示:

  • 但此时会报错,原因在于zabbix_fta_alarm.py中的定义的Zabbix的API的路径不正确,也可能是Zabbix版本为4.0跟以前版本3.0之类的不一样导致的,自己未做验证。

129 class ZabbixApi(object):
130 
131     def __init__(self, parse_url, user, password):
132         self.parse_url = parse_url
133         self.user = user
134         self.password = password
135         self.path = '/zabbix/api_jsonrpc.php'
136         self.url = '%s://%s%s' % (parse_url.scheme, parse_url.netloc, parse_url.path or self.path)
137 
138         self.auth_token = None
139         self.userid = None
140         self.mediatypeid = None
141         self.usrgrpid = 7  # Zabbix administrators
142 
143         self.script_name = 'zabbix_fta_alarm.py'
144         self.media_name = 'FTA_Event_Handler'
145         self.user_name = 'FTA_Mgr'
146         self.action_name = 'FTA_Act'
  • 可以看到self.path = ‘/zabbix/api_jsonrpc.php’,而实际上,我们访问的zabbix页面的URL中没有/zabbix/这部分
  • 比如我们访问Zabbix-server主机IP:PORT/zabbix/api_jsonrpc.php会报404,而IP:PORT/api_jsonrpc.php则不会。

  • 因此修改ZabbixApi类的self.path变量为 ‘/api_jsonrpc.php’,或者前往Zabbix-web容器中,在zabbix目录中做个软连接。参考命令如下:

[root@738b3b27d24e zabbix]# pwd
/usr/share/zabbix
[root@738b3b27d24e zabbix]# ln -sv /usr/share/zabbix/ /usr/share/zabbix/zabbix
[root@738b3b27d24e zabbix]# ls -l
total 1024
                   ''' 省略大部分文件'''
lrwxrwxrwx  1 root  root     18 Jun 14 14:04 zabbix -> /usr/share/zabbix/
-rw-r--r--  9 nginx nginx   841 Jun 10 15:39 zabbix.php

  • 这两种方式都可以解决这个问题,顺利的话,执行脚本zabbix_fta_alarm.py后,在Zabbix的web界面中管理,报警媒介类型中可以看到故障自愈的FTA_Event_Handler的媒介。
  • 至此Zabbix就成功接入到了故障自愈当中,Zabbix中的报警就会通过该脚本发送到故障自愈当中,进而被故障自愈继续处理。

0x06 配置故障自愈的自愈套餐

  • 在作业平台上新建一个作业,当触发自愈时,会在告警的主机也就是主机A上执行该作业,该作业非常简单,就是判断zabbix-agent进程在不在,不在的时候会启动zabbix-agent。
  • 具体操作如下图所示:

  • 图片中的代码参考如下:
#!/bin/bash
ps -ef | grep zabbix_agent | grep -v grep   >/dev/null 2>&1

if  [[ $? -eq 0 ]]; then
    echo -e  `date +"%Y-%m-%d %H:%M:%S"`  zabbix_agent is running.
else
    systemctl   restart   zabbix-agent || echo -e  `date +"%Y-%m-%d %H:%M:%S"`  zabbix_agent restart faild!
    echo -e  `date +"%Y-%m-%d %H:%M:%S"` zabbix_agent restart success!
fi

  • 然后在故障自愈中的管理套餐新建一个自愈套餐,参考如下图所示:

  • 套餐类型选择作业平台,因为我们在作业平台创建了一个作业,也可以选择其他平台,比如标准运维,配置平台等。
  • 作业名称就选择我们刚刚创建的,并勾选告警IP代替作业执行IP。

  • 创建完自己套餐后,接着把该套餐接入自愈之中。参考如下图所示:

  • 告警类型有多个选项,这边模拟zabbix-agent失联的情况,故选择了Agent状态类型,其他指标项也可以选择。
  • 告警集群和模块分别对应主机A在蓝鲸CMDB中的业务拓扑位置,为空则代表默认全选。
  • 套餐则就选择我们刚刚创建的自愈套餐。

  • 至此我们就完成了故障自愈中的自愈套餐的创建和接入过程,接下来当Zabbix有告警产生时,就会出发自愈,执行作业,自愈完成。

0x07 测试自愈套餐

  • 首先我们前往主机A中,手动停掉zabbix-agent进程,大约五分钟左右,zabbix页面上便会出现主机A不可达的告警,参考命令如下:
[root@monitor01 ~]# systemctl stop  zabbix-agent

  • 同时我们可以在Zabbix的报表,动作日志中看到刚刚发送的消息。

  • 然后我们前往故障自愈首页的自愈详情中便可以看到该次的自愈过程。如下图所示:

  • 点击执行Job作业成功后面的任务ID可以跳转到作业平台的任务执行详情中,可以看到我们执行任务的情况,如下图所示:

  • 检查主机A的zabbix-agent服务,也已经被成功恢复:

[root@oracle02 ~]# systemctl status  zabbix-agent
● zabbix-agent.service - Zabbix Agent
   Loaded: loaded (/usr/lib/systemd/system/zabbix-agent.service; enabled; vendor preset: disabled)
   Active: active (running) since 三 2019-06-27 08:38:35 CST; 4min ago
  Process: 1171 ExecStart=/usr/sbin/zabbix_agentd -c $CONFFILE (code=exited, status=0/SUCCESS)
 Main PID: 1191 (zabbix_agentd)
   Memory: 3.6M
   CGroup: /system.slice/zabbix-agent.service
           ├─1191 /usr/sbin/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
           ├─1192 /usr/sbin/zabbix_agentd: collector [idle 1 sec]
           ├─1193 /usr/sbin/zabbix_agentd: listener #1 [waiting for connection]
           ├─1194 /usr/sbin/zabbix_agentd: listener #2 [waiting for connection]
           ├─1195 /usr/sbin/zabbix_agentd: listener #3 [waiting for connection]
           └─1196 /usr/sbin/zabbix_agentd: active checks #1 [idle 1 sec]

7月 03 14:25:21 oracle02 systemd[1]: Starting Zabbix Agent...
7月 03 14:25:35 oracle02 systemd[1]: Started Zabbix Agent.
[root@oracle02 ~]# 

  • 至此就完成了模拟故障,告警,自愈的全流程。

0x08 结语

  • 上面的例子是非常简单的,但通过蓝鲸平台的故障自愈我们能做很多类似的故障自愈的事情,减轻给我们的工作量。

 上一篇
Win10家庭版安装使用Docker Win10家庭版安装使用Docker
0x00 前言 为什么要在Windows平台下使用Docker呢,主要是在配置一些基础运行环境时比较费劲。 比如想使用Redis,MySQL,MongoDB等的开发环境时,自己要本机手动安装这些服务组件。 安装配置也比较费时,所以便想要使用
2019-07-23
下一篇 
简述腾讯蓝鲸自动化运维平台 简述腾讯蓝鲸自动化运维平台
0x01 腾讯蓝鲸简介?<官方解释> 蓝鲸智云,简称蓝鲸,是腾讯游戏运营部“腾讯智营”下的一个子品牌。它是一套基于PaaS的技术解决方案, 提供了完善的前后台开发框架、调度引擎、公共组件等模块,帮助业务的产品和技术人员快速构建低
2019-07-16