AutoInstallServicer.py 主程序
ConnectLinux.py 链接服务器执行命令 打包使用 auto-py-to-exe
# -*- coding: utf-8 -*-
# @Time : 2023/6/28 9:37
# @Author : wangyafeng
# @FileName: AutoInstallServicer.py
# @Email : yafengwang@dingtalk.com
# @Software: PyCharm
import time
import PySimpleGUI as sg
import multiprocessing
import ConnectLinux
hosts_path = '/opt/autoDeploy/ansible/hosts'
work_dir = '/opt/autoDeploy/ansible/playbook'
work_path = '/opt/autoDeploy/ansible/'
# /usr/bin/ansible-playbook -i /opt/autoDeploy/ansible/hosts /opt/autoDeploy/ansible/playbook/nginx_deploy.yml
nginx = f'cd {work_path} && /usr/bin/ansible-playbook -i {hosts_path} {work_dir}/nginx_deploy.yml'
kafka = f'cd {work_path} && /usr/bin/ansible-playbook -i {hosts_path} {work_dir}/single_kafka_deploy.yml'
# ['Nginx', 'Redis', 'Mongo', 'Mysql', 'Kafka', 'MinIO']
# nginx = f'pwd'
# kafka = f'date'
redis = f'cd {work_path} && /usr/bin/ansible-playbook -i {hosts_path} {work_dir}/single_redis_deploy.yml'
mongo = f'cd {work_path} && /usr/bin/ansible-playbook -i {hosts_path} {work_dir}/single_mongodb_deploy.yml'
mysql = f'cd {work_path} && /usr/bin/ansible-playbook -i {hosts_path} {work_dir}/single_mysql_deploy.yml'
minIO = f'cd {work_path} && /usr/bin/ansible-playbook -i {hosts_path} {work_dir}/single_minio_deploy.yml'
mysqlcluster = f'cd {work_path} && /usr/bin/ansible-playbook -i {hosts_path} {work_dir}/cluster_mysql_deploy.yml'
layout = [
[sg.Text('选择要执行的任务:')],
[sg.Frame('选择服务', [
[sg.Checkbox('Nginx', key='Nginx'),
sg.Checkbox('Redis', key='Redis'),
sg.Checkbox('Mongo', key='Mongo'),
sg.Checkbox('Mysql', key='Mysql'),
sg.Checkbox('Kafka', key='Kafka'),
sg.Checkbox('MinIO', key='MinIO'),
sg.Checkbox('Mysql集群', key='MysqlCluster'), sg.Button('执行', key='-EXECUTE-', size=(7, 1)),
sg.Button('读取', key='-SAVE-', size=(7, 1))]
])],
[sg.Frame('目标列表', [[sg.Multiline(size=(92, 18), key='-targetlist-')]])],
[sg.Button('清空', key='-CLEAR-', size=(10, 1)), sg.Text('', size=(46, 1)), sg.Text(' '),
sg.Button('退出', key='-EXIT-', size=(10, 1))],
]
def contentandcomment(task):
# client = ConnectLinux.CentOsServer('192.168.0.67', 'root', 'uQakdCV0@79zS##D', '22')
client = ConnectLinux.CentOsServer('1.192.171.31', 'root', 'uQakdCV0@79zS##D', '6222')
client.connect()
try:
result = client.execute_command(task)
with open('myresult.txt', 'a+', encoding='utf-8') as f:
f.write(result)
# return result
pass
except Exception as e:
with open('myresult.txt', 'a+') as f:
f.write(f"{task}任务出现问题: {e}")
# client.close()
tasks = ['date']
# 添加以下代码
if __name__ == '__main__':
multiprocessing.freeze_support() #特殊处理
window = sg.Window("飞入闲窗&Real 版本V1.0", layout, finalize=True)
# 创建进程池
pool = multiprocessing.Pool()
# 使用进程池的map方法,将任务依次分配给进程池中的进程执行
while True:
event, values = window.read(timeout=1000)
print('event==============', event)
print('value==============', values)
if event == sg.WINDOW_CLOSED or event == '-EXIT-':
break
elif event == '-EXECUTE-':
sg.PopupNoBorder('3秒提示:正在执行,请等待', button_type=sg.POPUP_BUTTONS_NO_BUTTONS, auto_close=True, auto_close_duration=3)
time.sleep(5)
selected_tasks = [key for key, value in values.items() if value is True]
print('selected_tasks==================', selected_tasks)
# ['Nginx', 'Redis', 'Mongo', 'Mysql', 'Kafka', 'MinIO']
for x in selected_tasks:
if x == 'Nginx':
tasks.append(nginx)
elif x == 'Kafka':
tasks.append(kafka)
elif x == 'Redis':
tasks.append(redis)
elif x == 'Mongo':
tasks.append(mongo)
elif x == 'Mysql':
tasks.append(mysql)
elif x == 'MinIO':
tasks.append(minIO)
elif x == 'MysqlCluster':
tasks.append(mysqlcluster)
print("newtask============", tasks)
pool.map(contentandcomment, tasks)
print('tasks====================================', tasks)
# 关闭进程池
pool.close()
pool.join()
print("=====================所有任务执行完成=====================")
window['-EXECUTE-'].update('执行')
sg.PopupNoBorder('所有任务执行完毕...', button_type=sg.POPUP_BUTTONS_NO_BUTTONS, auto_close=True,
auto_close_duration=10)
elif event == '-SAVE-':
text = window['-SAVE-'].get_text()
print(text)
client = ConnectLinux.CentOsServer('192.168.0.67', 'root', 'uQakdCV0@79zS##D', '22')
client.connect()
if text == '读取':
result = client.execute_command(f'cat {hosts_path}')
window['-targetlist-'].update(result)
# window['-targetlist-'].update(contentandcomment(f'cat {hosts_path}'))
window['-SAVE-'].update('保存')
sg.Popup('读取成功')
client.close()
if text == '保存':
target_list_text = values['-targetlist-']
text_list = target_list_text.split('\n')
client.execute_command(f'cd {work_path} && echo ''>hosts')
for line in text_list:
client.execute_command(f'cd {work_path} && echo {line} >>hosts')
sg.Popup('保存成功')
window['-SAVE-'].update('读取')
client.close()
elif event == '-CLEAR-' and window['-SAVE-'].get_text() == '读取':
window['-targetlist-'].update('')
elif event == '-CLEAR-' and window['-SAVE-'].get_text() == '保存':
sg.Popup('请先保存')
# -*- coding: utf-8 -*-
# @Time : 2023/6/14 11:41
# @Author : wangyafeng
# @FileName: ConnectLinux.py
# @Email : yafengwang@dingtalk.com
# @Software: PyCharm
import paramiko
class CentOsServer:
def __init__(self, hostname, username, password, port):
"""
初始化 SSH 连接到 CentOS 服务器
:param hostname: 服务器 IP 地址
:param username: 服务器用户名
:param password: 服务器密码
"""
self.hostname = hostname
self.port = port
self.username = username
self.password = password
self.client = None
def connect(self):
"""
连接 CentOS 服务器
"""
self.client = paramiko.SSHClient()
self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.client.connect(self.hostname, self.port, self.username, self.password)
print('>>>>>>>>>>>>>>>>>连接服务器成功')
def execute_command(self, command, prompt=None):
"""
在服务器上执行命令并返回输出结果
:param command: 待执行命令
:param prompt: 需要等待用户输入的提示信息(如果有)
:return: 命令输出结果
"""
stdin, stdout, stderr = self.client.exec_command(command)
if prompt is not None:
output = ''
while True:
line = stdout.readline().strip()
if line == '':
break
output += line.decode() + '\n'
if prompt in line.decode():
self.client.invoke_shell().send('\n')
else:
output = stdout.read().decode()
print(output, stderr.read().decode())
return output
def close(self):
"""
关闭 SSH 连接
"""
self.client.close()
print('>>>>>>>>>>>>>>>>>断开连接')