故障自动处理开发实战
一、实验概述
蓝鲸平台提供了完善的运维解决方案,并且通过前后台开发框架、公共组件等模块,帮助业务的产品和技术人员快速构建低成本、免运维的支撑工具和运营系统。故障自愈通过自动化处理节省人力投入,通过预定的恢复流程让恢复过程更可靠,通过并行分析达到更快的故障定位和恢复。虽然故障自愈已集成了业界主流的监控系统,但是,你可能发现自己企业内使用的告警系统并没有对接故障自愈,从而导致你无法使用故障自愈。
腾讯云 TechWork《运维开发公开课》专场第4场,将邀请蓝鲸高级开发工程师,为你介绍故障自愈系统,学习第三方告警源接入,把企业内系统接入故障自愈中,在蓝鲸平台内整合各个系统能力,实现自动化实现故障定位和恢复。
二、准备工作
- 蓝鲸社区版环境及账号(培训方提供,不需要自己搭建)
- 蓝鲸应用开发环境(安装指南见蓝鲸开发者中心)
- 后台操作系统需要centos6.5以上版本
- 后台环境需要安装 redis, beanstalkd
- 自己用起来顺手的 IDE,推荐 PyCharm
三、任务准备:搭建本地环境
任务目标:在本地配置故障自愈的运行环境,能够将故障自愈的前端APP和后台在本地运行起来。
1.1 源码下载
将code目录下的源码上传至云主机然后解压 code/fta_open.tar.gz 至任意目录
1.2 配置本地 hosts
windows: 在 C:\Windows\System32\drivers\etc\host 文件中添加 127.0.0.1 dev.paasce-poc.o.qcloud.com
。
mac: 执行 sudo vim /etc/hosts
,添加 127.0.0.1 dev.paasce-poc.o.qcloud.com
。
Web安装部署:
1.3前端环境部署准备
1.3.1 前端开发依赖软件
- MySQL >= 5.5.24
请参看官方资料 MySQL
推荐版本下载: MySQL 5.5+
1.4 前端部署
源码包含Web层和后台服务层两个部分,其中web_app是Web层根目录,在源码下载目录执行 cd web_app
1.4.1 数据库初始化
- 在 mysql 中创建名为 bk_fta_solutions 的数据库
CREATE DATABASE `bk_fta_solutions` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
- 执行初始化sql 其中
your_user_name
需要替换为连接mysql的用户名
mysql -uyour_user_name -p < sql/init_fta.sql
1.4.2 安装python依赖库
依赖库安装
yum install \
--skip-broken \
--assumeyes \
--quiet \
"python-tools" \
"python-devel"\
"bzip2-devel" \
"expat-devel" \
"gettext-devel" \
"libzip-devel" \
"libcurl-devel" \
"libxml2-devel" \
"libffi-devel" \
"mysql-devel" \
"openssl" \
"openssl-devel" \
"readline-devel" \
"sqlite-devel" \
"zlib-devel"
安装 pip
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py
安装其他依赖库
pip install -r requirements.txt
1.4.3 修改本地配置
进入到工程目录下
- 修改 ./project/conf/settings_env.py
请注意:以下列举变量必须要结合本地社区版的实际情况进行配置,否则故障自愈的大部分功能将无法使用
# ==============================================================================
# 应用基本信息配置 (请按照说明修改)
# ==============================================================================
# APP_ID不用修改
APP_ID = 'bk_fta_solutions'
# APP_TOKEN需要到官方网站的admin中获取 默认访问http://{BK_PAAS_HOST}/admin/app/app/ 找到名为"故障自愈"的记录,查看详情获取Token字段值
APP_TOKEN = ''
# 蓝鲸智云开发者中心的域名,形如:http://paas.bking.com:80
BK_PAAS_HOST = ""
# 蓝鲸智云作业平台的域名,形如:http://job.bking.com:80
BK_JOB_HOST = ""
# 蓝鲸智云配置平台的域名,形如:http://cmdb.bking.com:80
BK_CC_HOST = ""
# 缓存时间
CACHE_TIME = 5
- 修改 ./conf/settings_development.py,设置本地开发用的数据库信息和本地后台API连接变量信息
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 默认用mysql
'NAME': APP_ID, # 数据库名 (默认与APP_ID相同)
'USER': 'root', # 你的数据库user
'PASSWORD': '', # 你的数据库password
'HOST': 'localhost', # 数据库HOST
'PORT': '3306', # 默认3306
},
}
LOCAL_BACKEND_HOST = 'http://127.0.0.1:13031'
FTA_API_PREFIX = '%s/event/' % LOCAL_BACKEND_HOST
FTA_CALL_BACK_URL = '%s/callback/' % LOCAL_BACKEND_HOST
FTA_STATUS_URL = '%s/status/process/' % LOCAL_BACKEND_HOST
- 修改 ./web_app/settings.py, 注释掉以下内容
请注意 此步骤仅针对本地开发 部署至服务器时清取消此修改
ENVIRONMENT = os.environ.get("BK_ENV", "development")
# Inherit from environment specifics
conf_module = "conf.settings_%s" % ENVIRONMENT
try:
module = __import__(conf_module, globals(), locals(), ['*'])
except ImportError, e:
raise ImportError("Could not import conf '%s' (Is it on sys.path?): %s" % (conf_module, e))
for setting in dir(module):
if setting == setting.upper():
locals()[setting] = getattr(module, setting)
# 本地开发需要注释掉这部分内容
# check saas app settings
# try:
# saas_conf_module = "conf.settings_saas"
# saas_module = __import__(saas_conf_module, globals(), locals(), ['*'])
# for saas_setting in dir(saas_module):
# if saas_setting == saas_setting.upper():
# locals()[saas_setting] = getattr(saas_module, saas_setting)
# except:
# pass
1.4.4 应用数据初始化
- 在 ./web_app 目录下执行以下命令初始化数据库
python manage.py migrate
python manage.py createcachetable django_cache
1.4.5 运行程序
python manage.py runserver 0.0.0.0:443
1.4.6 访问页面
通过浏览器访问 http://local.paasce-poc.o.qcloud.com:443/ 验证APP是否正常启动。
1.5 后台环境准备
1.5.1 后台开发依赖软件
后台运行操作系统: centos6.5以上版本
- redis >= 3.2.8
yum install redis
启动指令: redis-server &
详细使用请参看官方资料 redis
推荐版本下载: redis 3.2.8
- beanstalkd >= 1.10
yum install beanstalkd
启动指令 beanstalkd -l 127.0.0.1 -p 14711 &
详细使用请参看官方资料 beanstalkd
推荐版本下载: beanstalkd 1.10
1.6 后台部署
1.6.1 进入后台服务层根目录
server是后台服务根目录,在源码下载目录执行cd server
1.6.2 项目依赖库安装
运行 pip install -r requirements.txt
1.6.3 修改本地配置
- 修改 fta/templates/conf/settings_local.py
vim fta/templates/conf/settings_local.py
请注意:以下变量为必填变量,必须结合本地蓝鲸智云社区版的实际情况进行配置,否则故障自愈的大部分功能将无法使用
# 本地社区版蓝鲸智云页面访问地址 eg: http://paas.bk.com
PAAS_ADDR = ''
# 本地社区版蓝鲸智云内网地址 如果不确认 可以和PAAS_ADDR保持一致 eg: http://paas.bk.com
PAAS_INNER_ADDR = ''
# 本地社区版JOB页面访问地址 eg: http://job.bk.com
JOB_ADDR = ''
# APP_TOKEN需要到官方网站的admin中获取 默认访问http://{PAAS_ADDR}/admin/app/app/ 找到名为"故障自愈"的记录,查看详情获取Token字段值
APP_SECRET_KEY = ''
# 通知人列表 用于接收后台发送的通知信息 填空则默认后台不发送信息 仅记录日志
VERIFIER = [""]
# 本地python运行环境 eg: /usr/local/python2.7/bin/
PYTHON_HOME = ""
# FTA WEB SERVER PORT
WEBSERVER_PORT = 13021
APISERVER_PORT = 13031
JOBSERVER_PORT = 13041
WEBSERVER_URL = "http://127.0.0.1:%s" % WEBSERVER_PORT
# BEANSTALKD
BEANSTALKD_HOST = [''] # beanstalkd ip地址
BEANSTALKD_PORT = 14711 # beanstalkd 端口
# MYSQL
MYSQL_NAME = 'bk_fta_solutions'
MYSQL_USER = '' # 数据库访问用户
MYSQL_PASSWORD = '' # 访问密码
MYSQL_HOST = '' # 数据库地址
MYSQL_PORT = 3306 # 数据库端口
# REDIS
REDIS_HOST = [''] # redis ip地址
REDIS_PASSWD = '' # redis 访问密码
REDIS_PORT = 6379 # redis 访问端口
1.6.4 本地开发环境后台初始化
bin/init_local.sh
1.6.5 启动后台
bash bin/fta.sh start
可通过查看日志是否正常
tail -n 150 logs/fta.log
1.6.6 所有可用控制命令
start -- 启动
stop -- 停止进程, supervisor进程依然保留
restart -- 重启
reload -- 重载配置文件
status -- 查看进程状态
shutdown -- 关闭supervisor
可通过执行下述命令来获取可用命令列表
bash bin/fta.sh
四、推送类告警接入代码开发
1. WEB端开发流程
1.1 给新接入的告警源命名
以下接入将以 TEST-MONITOR 作为告警源。
1.2 添加告警源配置项
配置文件路径:web_app/fta_solutions_app/fta_std.py
配置内容:以 **SOURCE_**开头的所有配置项
SOURCE_TYPE_CHOICES: 告警源类型说明,用于DB记录和页面展示 SOURCE_TYPE_PAGES_CHOICES: 用于新增告警源页面 SOURCE_TYPE_TIPS: 告警源说明提示,用于告警源配置页面 SOURCE_TYPE_MSG1: 告警源管理页面未启用监控的说明文字 SOURCE_TYPE_MSG2: 接入告警源配置页面的说明
修改代码如下图:
1.3 页面配置告警类型
1.3.1 添加修改告警源页面的模版
在路径${project_path}/templates/fta_solutions/alarm_source
下添加对的模版文件,可以开发自己需要的配置内容,可以参考所给资料代码 code/alarm\_source\_test.part
1.3.2 自定义告警类型,让告警处理更加明确
在管理告警源中添加自定义类型, 规则匹配的内容为告警中的alarm_type字段
接入自愈的页面中可以选择自己配置的告警类型
1.3.3 代码初始化告警类型(可选,本次开发不做要求)
如果告警类型较多,也可以通过migrations或其他方式进行告警类型的初始化
2. FTA后台开发流程
2.1 推送类告警
2.1.1 开发接收告警API接口
在目录/fta/manager/www/apiservice/
下,添加对应的api文件,如下(可参考代码 code/test_api.py):
在这个页面中,注意根据告警源的配置的字段信息进行必要的配置,可参考 is_required
2.1.2 开发清洗数据代码
在目录/fta/manager/poll_alarm/
添加文件,主要功能为清洗数据(可参考代码 code/test_clean.py
)
2.1.3 重启后台进程
bash bin/fta.sh restart
2.1.4 验证
首先,在接入自愈页面,根据步骤 1.3.2
配置的告警接入一个通知套餐
然后,模拟发出告警(根据自己的机器信息和告警类型修改对应的内容),如下图, 等待处理:
curl -d '{"inner_ip": "10.0.1.29","source_id": "1545040185","source_time": "2018-12-17 17:49:45+08:00","alarm_type": "test", "alarm_content": "FAILURE for production HTTP on machine 10.0.1.29", "alarm_context": {"key1":"value1","key2":"value2"}}' 'http://127.0.0.1:13031/event/test/2c4ee3f6-b769-4051-aef5-a5ba94ec290a/' -H 'X-Secret:5c5un03WqhlMI5ZLfoSVRQz3cK3sn1y9' -v
最后, 在自愈详情页面查看告警结果
学员评价