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


                                                                              内网环境整体架构如下


02-日常管理脚本-ansible 程序断电修复;_管理脚本


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