作者:小明
```
#!/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