自动化运维---python

作者:小明

```

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @author chentongming
# @date 2021/11/11
import os
import subprocess
import sys

all_class='xmclass'
file_code_type_name='.py'
file_code_type='py'
file_code_type_yml='.yml'
file_code_type_two_layer='star'
file_code_type_split01="."
file_code_type_split02="/"
file_code_type_split03=" "
file_code_type_split04="_"
ansible_file_site_name='./xmansible/site.yml'
ansible_file_hosts_name='./xmansible/hosts'
deployment_config_path_name='./conf/config.cfg'
deployment_base_path_name='./conf/base.cfg'
ansible_file_group_path='./xmansible/group_vars/all/'
ansible_file_group_all_path='./xmansible/group_vars/all/all.yml'
site_type_name='site'
all_key='etc/ssh/id_rsa'
ansible_cmd="sudo ansible-playbook  "+ansible_file_site_name+" -i "+ansible_file_hosts_name +" --key-file "+all_key

xm_path=os.path.split(os.path.realpath(__file__))[0]
os.chdir(xm_path)

for import_all_class in os.listdir(all_class):
    for import_all_class_two_layer in os.listdir(all_class+file_code_type_split02+import_all_class):
        if import_all_class_two_layer.split(file_code_type_split01)[-1:][0] == file_code_type:
            import_all_class_two_layer=import_all_class_two_layer.split(file_code_type_split01)[0]
            if import_all_class_two_layer.rstrip(file_code_type_name).split(file_code_type_split04)[-1:][0] == file_code_type_two_layer:
                exec('from'+file_code_type_split03+all_class+file_code_type_split01+import_all_class+file_code_type_split01+import_all_class_two_layer+file_code_type_split03+'import *')
            else:
                exec('from'+file_code_type_split03+all_class+file_code_type_split01+import_all_class+file_code_type_split03+'import'+file_code_type_split03+import_all_class_two_layer)

class main(object):
    def __init__(self) -> None:
        all_dict=fileinout.fileinout().cfg_to_json(deployment_config_path_name)
        self.all_dict=all_dict
        base_dict=fileinout.fileinout().cfg_to_json(deployment_base_path_name)
        self.base_dict=base_dict
        all_list=JsonToSite.JsonToSite().JsonToSite(self.all_dict)
        self.all_list=all_list
    def main(self):
        importantinfo('-'*50+'welcome to qiqiao auto deployment'+'-'*50)
        importantinfo('author:xiaoming')
        importantinfo('环境检测中。。。。')
        if self.all_dict['all']['debug_mode']=='prod':
            check.check().check_conf(self.all_dict)
        fileinout.fileinout().json_to_yaml(
            self.all_list,
            ansible_file_site_name
            )
        hosts.hosts(ansible_file_hosts_name).hosts_in_hosts(self.all_dict)
        GroupVars.GroupVars().GroupVarsAll()
        role_all_list=JsonToSite.JsonToSite().JsonToSite(
            self.all_dict,
            roles_all_host=True
            )
        Roles.Roles(self.all_dict).Roles(role_all_list)
        init.init()._init()

        SP = subprocess.Popen(
            ansible_cmd,
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT,
            shell=True,
            universal_newlines=True
            )
        for line in iter(SP.stdout.readline, ''):
            ansibleinfo(line)
            sys.stdout.flush()
        SP.wait()

        warning("以上unreachable以及failed为0表示安装成功!!\n","请手动调整时间同步NTP,确保时间的误差小于30s\n","finished!!!\n")
        importantinfo('-'*50+'deployment is finished!!!!'+'-'*50)
    def __del__(self) -> None:
        SQLEinit.SQLEinit()._del()


if __name__ == "__main__":
    main().main()

```

SQLEinit.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @author chentongming
# @date 2021/11/11
import main
import sqlite3

class SQLEinit():
    def __init__(self,*cf,**kwcf) -> None:
        self.sqlconnent = sqlite3.connect('./database/qiqiao/qiqiao.db')

    def SQLEinit(self) -> None:
        con = self.sqlconnent.cursor()
        con.execute(
            '''CREATE TABLE if not exists tags
            (ID INT PRIMARY KEY     NOT NULL,
            name           TEXT    NOT NULL,
            tags_type            INT     NOT NULL
            );'''
            )
        try:
            con.execute(
                '''INSERT INTO tags (ID,name,tags_type) VALUES (1,'qiqiao',1);'''
                )
        except Exception as e:...
        try:
            con.execute(
                '''INSERT INTO tags (ID,name,tags_type) VALUES (2,'hosts',0);'''
                )
        except Exception as e:...
        cursor=con.execute('''SELECT * FROM tags;''')
        self.sqlconnent.commit()

    def SQLESelect(self,sql_cmd:str) -> sqlite3.Cursor:
        con = self.sqlconnent.cursor()
        try:
            cursor=con.execute(sql_cmd)
            self.sqlconnent.commit()
            return cursor
        except Exception as e:
            main.error('sql语法错误')
        
    def _del(self) -> None:
        self.sqlconnent.close()

GroupVars.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @author chentongming
# @date 2021/11/22
import main
import copy
import os
class GroupVars(object):
    def __init__(self,*cf,**kwcf) -> None:
        self.data_json=copy.deepcopy(main.main().all_dict)
        global dist_global_transform
        dist_global_transform={}
        self.list_split='-->xmlist<--'
    def __del__(self) -> None:...
    def GroupVarsAll(self,*cf,**kwcf)->None:
        main.fileinout.fileinout().key_to_cfg(main.deployment_base_path_name,'AYML','xm_path',main.xm_path)
        main.fileinout.fileinout().json_to_yaml(main.main().base_dict['AYML'],main.ansible_file_group_all_path)
    def GroupVars(self,data_list_True,*cf,**kwcf) -> None:
        for i in data_list_True:
            dist_global_transform=copy.deepcopy(main.main().all_dict[i])
            temp_dict={}
            all_to_name=main.main().all_dict[i]['hostname']
            if all_to_name == 'all':
                all_to_name=main.main().all_dict['all']['hostname']
            for j,k in dist_global_transform.items():
                if k.isdigit():
                    temp_dict[j]=int(k)
                elif self.list_split in k:
                    temp_dict[j]=[z for z in k.split(self.list_split)]
                else:
                    temp_dict[j]=k
                    temp_dict[i+'_node_list']=",".join([
                        main.comma_split(main.main().all_dict['all']['ip'])[main.comma_split(main.main().all_dict['all']['hostname']).index(i1)]
                        for i1 in main.comma_split(all_to_name)
                        ])
                    temp_dict[i+'_node_list_comma']=[
                        main.comma_split(main.main().all_dict['all']['ip'])[main.comma_split(main.main().all_dict['all']['hostname']).index(i1)]
                        for i1 in main.comma_split(all_to_name)
                        ]
                    if main.main().all_dict[i]['hostname']!='all':
                        temp_dict[i+'_node_host_name_comma']=[   
                            i2 for i2 in main.comma_split(main.main().all_dict[i]['hostname'])
                            ]
                    else:
                        temp_dict[i+'_node_host_name_comma']=[   
                            i2 for i2 in main.comma_split(main.main().all_dict['all']['hostname'])
                            ]
                    
            main.fileinout.fileinout().json_to_yaml(temp_dict,main.ansible_file_group_path+i+main.file_code_type_yml)
        main.fileinout.fileinout().json_to_yaml(main.main().all_dict['all'],main.ansible_file_group_path+'init_all'+main.file_code_type_yml)

hosts.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @author chentongming
# @date 2021/11/11
import main
import copy
host_funcation=['all']
class hosts(object):
    def __init__(self,file_path,*cf,**kwcf) -> None:
        self.f=open(file_path,'w')
    def __del__(self) -> None:
        self.f.close()
    def hosts_in_hosts(self,data_json,*cf,**kwcf)->None:
        data_json_temp = copy.deepcopy(data_json)
        del data_json_temp['all']
        count=0
        for i in data_json_temp:
            if data_json_temp[i]['hostname'] in host_funcation or data_json_temp[i]['hostname'] in data_json['all']['hostname']:
                if data_json_temp[i]['hostname'] =='all':
                    hostname_var=data_json['all']['hostname']
                else:
                    hostname_var=data_json_temp[i]['hostname']
            else:
                hostname_var=data_json_temp[i]['hostname']

            ip_list=[
                main.comma_split(data_json['all']['ip'])[main.comma_split(data_json['all']['hostname']).index(var_ip)]
                for var_ip in hostname_var.split(',')
                ]
            if count!=0:
                self.f.write('\n')
            else:
                count+=1
            self.f.write('['+i+']\n')
            for ip_to_one in ip_list:
                self.f.write(ip_to_one+'\n')
            
            
Roles.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @author chentongming
# @date 2021/11/11
import os
import main
import copy
import shutil

class Roles(object):
    def __init__(self,data_json,*cf,**kwcf) -> None:
        self.data_json=copy.deepcopy(data_json)
    def __del__(self) -> None:...
    def Roles(self,data_list,*cf,**kwcf)->None:
        data_list_True=[i for i in data_list if self.data_json[i]['isinstall']=='True']
        for mkdir_var in data_list_True:
            file_name=['tasks','templates','files']
            for file_name_var in file_name:
                if not os.path.exists('./xmansible/roles/'+mkdir_var+'/'+file_name_var):
                    os.makedirs('./xmansible/roles/'+mkdir_var+'/'+file_name_var)
            srcfile='code/file_yaml/qiqiao_xmansible/'+mkdir_var+'.yml'
            dstfile='./xmansible/roles/'+mkdir_var+'/tasks/main.yml'
            shutil.copyfile(srcfile,dstfile)
            for i in os.listdir('code/file_templates/qiqiao_xmansible/'+mkdir_var):
                if '.j2' in i:
                    srcfile_templates='code/file_templates/qiqiao_xmansible/'+mkdir_var+'/'+i
                    dstfile_templates='./xmansible/roles/'+mkdir_var+'/templates/'+i
                    shutil.copyfile(srcfile_templates,dstfile_templates)

            # json_data=main.fileinout.fileinout().yaml_to_json('code/file_yaml/qiqiao_xmansible/init.yml')
            # main.fileinout.fileinout().json_to_yaml(json_data,'./xmansible/roles/'+mkdir_var+'/tasks/main.yml')
        main.GroupVars.GroupVars().GroupVars(data_list_True)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @author chentongming
# @date 2021/11/11
import main
import copy
class JsonToSite(object):
    def __init__(self,*cf,**kwcf) -> None: ...
    def __del__(self) -> None:...
    def JsonToSite(self,json_all,roles_all_host=False,*cf,**kwcf) -> list:
        site_name_list=[]
        for site_all in json_all:
            for site_two in json_all[site_all]:
                if main.site_type_name in site_two:
                    site_name_list.append(site_all)
        site_name_list=list(set(site_name_list))
        site_name_list.remove('all')
        if roles_all_host:
            return site_name_list
        priority_id_list=[]
        for i in site_name_list:
            priority_id_list.append(int(json_all[i]['priority_id']))
        priority_id_list=main.bubbleSort(priority_id_list)

        site_list_temp=[
            {
                json_all['all']['priority_id']:json_all[site_var]['priority_id'],
                json_all['all']['isinstall']:json_all[site_var]['isinstall'],
                json_all['all']['site_name']:json_all[site_var]['site_name'],
                json_all['all']['site_hosts']:json_all[site_var]['site_hosts'],
                json_all['all']['site_roles']:[{json_all['all']['site_role']:json_all[site_var]['site_role']}]
            }
            for site_var in site_name_list
            ]
        site_list=list()
        for i in priority_id_list:
            for j in site_list_temp:
                if j['isinstall']=='True':
                    if i == int(j['priority_id']):
                        site_list.append(j)
        try:
            for i in site_list:
                del i['priority_id']
                del i['isinstall']
        except:
            main.error('priority_id重复了')
            exit()
        return site_list
            
           

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值