ansible 界面一键安装服务器

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('>>>>>>>>>>>>>>>>>断开连接')
 
posted @ 2023-06-29 17:39  王亚锋  阅读(34)  评论(0编辑  收藏  举报