告警自愈依赖的脚本下发执行模块

概述

所谓的告警自愈,典型手段是在告警触发时自动回调某个webhook地址,在这个webhook里写告警自愈的逻辑,夜莺默认支持这种方式。另外,夜莺还可以更进一步,配合ibex这个模块,在告警触发的时候,自动去告警的机器执行某个脚本,这种机制可以大幅简化构建运维自愈链路的工作量,毕竟,不是所有的运维人员都擅长写http server,但所有的运维人员,都擅长写脚本。这种方式是典型的物理机时代的产物,希望各位朋友用不到这个工具(说明贵司的IT技术已经走得非常靠前了)。

架构

ibex模块,类似之前夜莺v3版本中的job模块,可以批量执行脚本,其架构非常简单,包括server和agentd两个模块,agentd周期性调用server的rpc接口,询问有哪些任务要执行,如果有分配给自己的任务,就从server拿到任务脚本信息,在本地fork一个进程运行,然后将结果上报给服务端。为了简化部署,server和agentd融合成了一个二进制,就是ibex,通过传入不同的参数来启动不同的角色。ibex架构图如下:

ibex架构图

项目地址

安装启动

下载安装包之后,解压缩,在etc下可以找到服务端和客户端的配置文件,在sql目录下可以找到初始化sql脚本。

初始化sql

  1. mysql < sql/ibex.sql

启动server

server的配置文件是etc/server.conf,注意修改里边的mysql连接地址,配置正确的mysql用户名和密码。然后就可以直接启动了:

  1. nohup ./ibex server &> server.log &

ibex没有web页面,只提供api接口,鉴权方式是http basic auth,basic auth的用户名和密码默认都是ibex,在etc/server.conf中可以找到,如果ibex部署在互联网,一定要修改默认用户名和密码,当然,因为n9e要调用ibex,所以n9e的server.conf和webapi.conf中也配置了ibex的basic auth账号信息,要改就要一起改啦。

启动agentd

客户端的配置非常非常简单,agentd.conf内容如下:

  1. # debug, release
  2. RunMode = "release"
  3. # task meta storage dir
  4. MetaDir = "./meta"
  5. [HTTP]
  6. Enable = true
  7. # http listening address
  8. Host = "0.0.0.0"
  9. # http listening port
  10. Port = 2090
  11. # https cert file path
  12. CertFile = ""
  13. # https key file path
  14. KeyFile = ""
  15. # whether print access log
  16. PrintAccessLog = true
  17. # whether enable pprof
  18. PProf = false
  19. # http graceful shutdown timeout, unit: s
  20. ShutdownTimeout = 30
  21. # max content length: 64M
  22. MaxContentLength = 67108864
  23. # http server read timeout, unit: s
  24. ReadTimeout = 20
  25. # http server write timeout, unit: s
  26. WriteTimeout = 40
  27. # http server idle timeout, unit: s
  28. IdleTimeout = 120
  29. [Heartbeat]
  30. # unit: ms
  31. Interval = 1000
  32. # rpc servers
  33. Servers = ["10.2.3.4:20090"]
  34. # $ip or $hostname or specified string
  35. Host = "telegraf01"

客户端的HTTP接口用处不大,可以把Enable设置为false,关闭监听,重点关注Heartbeat这个部分,Interval是心跳频率,默认是1000毫秒,如果机器量比较小,比如小于1000台,维持1000没问题,如果机器量比较大,可以适当调大这个频率,比如2000或者3000,可以减轻服务端的压力。Servers是个数组,配置的是ibex-server的地址,ibex-server可以启动多个,多个地址都配置到这里即可,Host这个字段,是本机的唯一标识,有三种配置方式,如果配置为$ip,系统会自动探测本机的IP,如果是$hostname,系统会自动探测本机的hostname,如果是其他字符串,那就直接把该字符串作为本机的唯一标识。每个机器上都要部署ibex-agentd,不同的机器要保证Host字段获取的内容不能重复。

另外,Telegraf的配置文件中,有下面这么一段:

  1. [agent]
  2. interval = "10s"
  3. round_interval = true
  4. metric_batch_size = 1000
  5. metric_buffer_limit = 10000
  6. collection_jitter = "0s"
  7. flush_interval = "10s"
  8. flush_jitter = "0s"
  9. precision = ""
  10. hostname = ""
  11. omit_hostname = false

其中hostname默认留空,表示自动探测本机的hostname,如果写了具体的某个字符串,那就把写的那个字符串作为监控数据的host字段的内容,这个hostname字段要和ibex的agentd.conf中的Host字段保持一致,典型的做法有:

  • Telegraf中把hostname配置为空,Telegraf自动获取本机hostname,ibex的Host配置为$hostname,ibex也会自动获取本机hostname,这样Telegraf和ibex可以获取到相同的标识内容
  • Telegraf中手工把hostname配置为本机的ip,ibex则把Host配置为$ip,这样二者也可以获取到相同的标识内容
  • Telegraf和ibex都使用某个特定写死的字符串来作为标识信息,这样也OK,但是要保证不同的机器,这个字符串不能重复

下面是启动ibex-agentd的命令:

  1. nohup ./ibex agentd &> agentd.log &

另外,细心的读者应该会发现ibex的压缩包里的etc目录下有个service目录,里边准备好了两个service样例文件,便于大家使用systemd来管理ibex进程,生产环境,建议使用systemd来管理。