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')