1.起因:
(1).公司内网机房很(操蛋) 时不时机房意外断电,所有内网研发环境和devops 平台运行 VMware vCenter 平台上;;
(2).公司研发环境复杂: Nginx Tomcat Zookeeper mysql Eureka Rocketmq Codis 以及各个模块的应用
(3).每一次断电人肉运维启动程序流程: 1.Vcenter--->虚拟机——>基础服务Mysql/codis/Zk/Eureka/Rocketmq/监控---->Docker/k8s-->各个模块应用
内网环境整体架构如下

2.优化方案思路如下;
1.程序和对应的基础运维服务程序以及完全记录在CMDB中,切对应有应用名称和使用IP地址对应关系;
2.cmdb 提供对应的应用IP Restfu接口;
3.通过脚本读取程序接口读取应用名称和对应ip地址,使用ansible 模块执行对应的ip地址上 部署的应用;
4.本实例中cmdb 接口开发大神使用了sql 语句接口调用即可返回对应的数据;
3.脚本内容如下;
# !/usr/bin/env python
# coding=utf8
import json
import subprocess
import sys
import requests
class CHJ_manager(object):
def CHJ_ansible_operation(self, app_name, app_ip):
self.app_name = app_name
self.app_ap = app_ip
cmd = """ansible -i {}, all -m shell -a 'su - root -c "/chj/app/{}/bin/console status"' -b -f 10""".format(
app_ip.strip(), app_name.strip())
# print app_ip, app_name
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
universal_newlines=True)
result = p.communicate()
print result[0]
#sys.exit('cmd:', cmd)
def CHJ_env_manager(self, env_type):
if env_type is None:
print "参数不能为空,只能是|dev|test|ontest|cloudtest|prod"
sys.exit(1)
else:
url = 'http://192.168.1.100/sql'
data = {
'sql': ' SELECT app.ip,app.run_type,instance.app_name FROM app , instance WHERE app.instance_id = instance.id AND app.`run_type` ="%s"' % env_type
}
Put_data = requests.post(url, json=data)
Data_text = Put_data.text
#print Data_text
weatherJSON = json.loads(Data_text)
#ip_list = []
for i in weatherJSON["data"]:
app_ip = i['ip'] + "\n"
app_name = i['app_name'] + "\n"
self.CHJ_ansible_operation(app_name,app_ip)
chj_instance = CHJ_manager()
chj_instance.CHJ_env_manager('dev')
















