• 批量主机管理工具_python


    一、主要功能

    本服务器管理工具主要实现以下两种功能:
    (1)批量执行服务器操作命令
    (2)批量上传下载文件

    二、程序目录

     三、代码

    start.py:

     1 #/usr/bin/env python
     2 #_*_ coding:utf-8 _*_
     3 #Author:chenxiaozan
     4 import re,os,sys
     5 import paramiko
     6 BASE_DIR=os.path.dirname(os.path.dirname(__file__))
     7 split=os.path.sep
     8 sys.path.append(BASE_DIR)
     9 
    10 from core import servermanage
    11 
    12 
    13 if __name__ == '__main__':
    14     obj=servermanage.Servermanage()
    15     obj.interaction()
    start.py

    hosts:

     1 #_*_coding:utf-8 _*_
     2 #[gruop_name]
     3 #host_ip password
     4 
     5 [test]
     6 192.168.1.1  123456
     7 192.168.102.1  123456
     8 
     9 [test3]
    10 192.168.102.1  123456
    hosts

    settings:

     1 #/usr/bin/env python
     2 #_*_ coding:utf-8 _*_
     3 #Author:chenxiaozan
     4 import re,os,sys
     5 
     6 BASE_DIR=os.path.dirname(os.path.dirname(__file__))
     7 split=os.path.sep
     8 sys.path.append(BASE_DIR+split)
     9 
    10 
    11 
    12 #主机配置文件
    13 host_file=BASE_DIR+split+'conf'+split+'hosts'
    settings

    msg.py:

     1 #/usr/bin/env python
     2 #_*_ coding:utf-8 _*_
     3 #Author:chenxiaozan
     4 import re,os,sys
     5 BASE_DIR=os.path.dirname(os.path.dirname(__file__))
     6 split=os.path.sep
     7 sys.path.append(BASE_DIR+split)
     8 from conf import settings
     9 
    10 def read_msg():
    11     '''
    12     读取主机配置文件
    13     :return:
    14     '''
    15     count = 1
    16     f=open(settings.host_file,'r')
    17     host_data_dict={}
    18     for line in f:
    19         line=line.strip()
    20         if line!='': #去除空行
    21             begin_wiht=re.match('#',line)  #去除注释行
    22             if not begin_wiht:
    23                 group=re.findall('[(.+)]', line) #判断是否是组名
    24                 if group:
    25                     group_name=group[0]
    26                     host_data_dict[group_name] = {}
    27                 else:
    28                     line_list=re.split(' +',line)
    29                     if len(line_list)==2:
    30                         if line_list[0]  not in host_data_dict[group_name]:
    31                             #print('本行可添加到主机信息')
    32                             host_data_dict[group_name][line_list[0]]=line_list[1]
    33                     elif len(line_list)==0:
    34                         pass
    35                     else :
    36                         print('hosts文件第%s行服务器信息为空行或填写格式错误,本行相关服务器不执行本次操作'%count)
    37         count+=1
    38     return host_data_dict
    39 
    40 
    41 
    42 
    43 if __name__ == '__main__':
    44 
    45     host_data_dict=read_msg()
    46     print(host_data_dict)
    msg.py

    servermanage.py:

     1 #/usr/bin/env python
     2 #_*_ coding:utf-8 _*_
     3 #Author:chenxiaozan
     4 import re,os,sys
     5 import paramiko
     6 BASE_DIR=os.path.dirname(os.path.dirname(__file__))
     7 split=os.path.sep
     8 sys.path.append(BASE_DIR+split)
     9 import threading
    10 import paramiko
    11 
    12 from conf import settings
    13 from core import msg
    14 
    15 
    16 class Servermanage(object):
    17     def __init__(self):
    18         self.host_data_dict=msg.read_msg()
    19         self.lock=threading.Lock()
    20     def interaction(self):
    21         print('根据您填写的hosts文件,有以下分组:')
    22         for i in self.host_data_dict:
    23             print(i)
    24         while True:
    25             self.group_choice=input('请选择你需要操作的组名>>').strip()
    26             if self.group_choice in self.host_data_dict:
    27                     print('您所选择的主机组拥有以下主机:')
    28                     for host_ip in self.host_data_dict[self.group_choice]:
    29                         print(host_ip)
    30                     print('''用法:
    31                     1、直接输入linux命令:例如 df              (注:不能执行动态命令,如top)
    32                     2、上传下载文件: put 上传文件 目标文件名   (注:本地上传先存放数据在db文件夹)
    33                                     get 下载文件 目标文件名    (注:远程下载存放数据在db文件夹,并命名追加ip)
    34                                       ''')
    35                     while True:
    36                         self.cmd_input=input('请输入命令(r返回,q退出)>>').strip()
    37                         if self.cmd_input=='':
    38                             continue
    39                         elif self.cmd_input=='r':
    40                             break
    41                         elif self.cmd_input=='q':
    42                             exit()
    43                         else:
    44                             self.cmd_input_list=self.cmd_input.split(' ')
    45                             if self.cmd_input_list[0]=='put' or self.cmd_input_list[0]=='get' and len(self.cmd_input_list)==3:
    46                                 self.mul_thread(self.scp)
    47                             elif self.cmd_input_list[0]=='put' or self.cmd_input_list[0]=='get' and len(self.cmd_input_list)!=3:
    48                                 print('您输入的scp命令不符合格式')
    49 
    50                             else:
    51                                 self.mul_thread(self.cmd)
    52 
    53             elif self.group_choice=='':
    54                 continue
    55             else:
    56                 print('您输入的组名不存在')
    57 
    58 
    59     def mul_thread(self,run):
    60         thread_list=[]
    61         for ip in self.host_data_dict[self.group_choice]:
    62             t=threading.Thread(target=run,args=(ip,self.host_data_dict[self.group_choice][ip]))
    63             t.start()
    64             thread_list.append(t)
    65         for i in thread_list:
    66             i.join()
    67 
    68     def cmd(self,ip,passwd):
    69         ssh=paramiko.SSHClient()
    70         ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
    71         ssh.connect(hostname=ip,port=22,username='root',password=passwd)
    72         stdin, stdout, stderr = ssh.exec_command(command=self.cmd_input)
    73         res = stdout if stdout else stderr
    74         self.lock.acquire()
    75         print('===========%s==========='%ip)
    76         print(res.read().decode()) #在这里进行decode()的时候不同服务器可能出现不同code
    77         self.lock.release()
    78         ssh.close()
    79 
    80     def scp(self,ip,passwd):
    81         db_path=BASE_DIR+split+'db'
    82         transport=paramiko.Transport((ip,22))
    83         transport.connect(username='root',password=passwd)
    84         sftp=paramiko.SFTPClient.from_transport(transport)
    85         try:
    86             if self.cmd_input_list[0]=='get':
    87                 sftp.get(self.cmd_input_list[1],'%s%s%s_%s'%(db_path,split,self.cmd_input_list[2],ip))
    88             else:
    89                 sftp.put('%s%s%s'%(db_path,split,self.cmd_input_list[1]), self.cmd_input_list[2])
    90         except Exception as e:
    91             print('请检查要上传或下载的文件存不存在')
    92 
    93 if __name__ == '__main__':
    94     obj=Servermanage()
    95     obj.interaction()
    servermanage.py

    readme:

     1 #/usr/bin/env python
     2 #_*_ coding:utf-8 _*_
     3 #Author:chenxiaozan
     4 
     5 功能说明:
     6 本服务器管理工具主要实现以下两种功能:
     7 (1)批量执行服务器操作命令
     8 (2)批量上传下载文件
     9 
    10 使用说明:
    11 (1)批量执行命令时,只需要直接敲如命令即可。不能执行动态命令,如top
    12 (2)使用批量上传下载文件时,上传之前需要将你要上传的文件放在db文件夹内。下载文件会统一下载在db文件夹内,并将文件名后面追加主机ip进行区分
    readme
  • 相关阅读:
    oracle查询第几行到第几行的数据
    php/js将 CST时间转成格式化时间
    js获取当前时间:yyyy-MM-dd HH:MM:SS
    mysql 查询时间戳格式化 和thinkphp查询时间戳转换
    Java语言基础:运算符
    APP的三种开发模式
    架构图-模型
    Java语言基础:常量和变量
    APP开发之Dcloud简介
    APP开发
  • 原文地址:https://www.cnblogs.com/chenxiaozan/p/12425583.html
Copyright © 2020-2023  润新知