paramiko+threading实现主机批量管理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了paramiko+threading实现主机批量管理相关的知识,希望对你有一定的参考价值。
#!/usr/bin/env py #coding:utf-8 import os import os.path import re import sys import paramiko import threading import time from IPy import IP as ipy def syntax_check(): #配置文件检查 return_value = os.system(‘python /etc/addresspool.conf‘) if return_value != 0: exit() def ACL_check(value): #获取用户定义的ip和网段 if value == ‘ip‘: value = re.compile(‘^allow_ip.*‘) #获取ip elif value == ‘network‘: value = re.compile(‘^allow_network.*‘) #获取网段 else: print ‘\033[31mparameter error\033[0m‘ exit() num = 0 conf_file = open(‘/etc/addresspool.conf‘) for i in conf_file: #读取配置文件内容 ip_or_net = re.findall(value,i) if ip_or_net != []: num += 1 ACL_add = ip_or_net[0] ACL_add = ACL_add.split(‘=‘)[1] ACL_add = ACL_add.split(‘,‘) #获取ip地址池 else: if num == 0: #如果用户没有定义地址 return ‘None‘ conf_file.close() return ACL_add #返回地址池名称 def GET_ip(ip_pool): #处理地址池名称,生成ip地址(IP对象) path = sys.path[2] copy_mod = ‘cp /etc/addresspool.conf %s/addresspool.py‘ %path os.system(copy_mod) import addresspool as add ip_list = [] for i in ip_pool: i = i.strip() ACL_ip = getattr(add,i) for ip in ACL_ip: ip_list.append(ip) return ip_list #返回ip地址池 def GET_net(net_pool): #处理地址池名称(NET对象) import addresspool as network net_list = [] for i in net_pool: i = i.strip() ACL_net = getattr(network,i) for net in ACL_net: net_list.append(net) return net_list #返回网段 def IPY(net_list): #将网段解析成ip地址 net_pool = [] net_add = [] for i in net_list: ip_pool = [] ip_list = ipy(i) for ip in ip_list: ip = str(ip) ip_pool.append(ip) else: ip_pool.pop(0) ip_pool.pop() net_pool.append(ip_pool) return net_pool #返回ip地址池 ‘-----------------------------------config_file--------------------------------------------‘ def telnet(ip,port,user,passwd,comd): #shell命名处理 try: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(ip,port,user,passwd) stdin,stdout,stderr = ssh.exec_command(comd) stderr = stderr.read() if stderr.strip() != ‘‘: print ‘\033[34m%s %s\033[0m‘ %(ip,stderr) except: print ‘\033[31mconnect %s\033[0m‘ %ip def get_or_put(file2, file4, ip, port, user, passwd): #文件上传处理 try: get_put = paramiko.Transport((ip,port)) #服务器ip和端口(使用SFTP时使用) get_put.connect(username=user, password=passwd) #连接服务器,用户名和密码 sftp = paramiko.SFTPClient.from_transport(get_put) #使用SFTP协议 sftp.put(file2,file4) except: print ‘\033[31merror %s\033[0m‘ %ip ‘------------------------------------handle------------------------‘ def conf(): #生成配置文件内容 content = ‘‘‘ #default deny all #allow appoint ip address or appoint network address ACL_ip_name1 = [ "192.168.0.2", "192.168.0.10", "192.168.0.40", "192.168.0.60", ] #ACL_network_name1 = [ # "192.168.1.0/24", #] allow_ip = ACL_ip_name1 #allow_network = ACL_network_name1 ‘‘‘ if os.path.isfile(‘/etc/addresspool.conf‘) == False: os.system(‘touch /etc/addresspool.conf‘) mod_content = "echo ‘%s‘ > /etc/addresspool.conf" %content.strip() os.system(mod_content) ‘----------------------------------confing_file_content------------‘ if __name__ == ‘__main__‘: conf() #首次执行生成配置文件 def Syntax(): #定义命令语法 print ‘‘‘ syntax error: -h display help info -t test config file syntax -s execute shell "command option argv" -p upload file upload_file_path upload_preservation_path ‘‘‘ try: put = ‘‘ comd = ‘‘ argv = sys.argv opt = argv[1] if opt == ‘-s‘: comd = argv[2] elif opt == ‘-h‘: Syntax() elif opt == ‘-t‘: test = os.system(‘python /etc/addresspool.conf‘) if test == 0: print ‘"/etc/addresspool.conf" Syntax ok\n\n‘ elif opt == ‘-p‘: put = ‘put‘ file2 = argv[2] filename = file2.split(‘/‘).pop() file = argv[3] file4 = file +‘/‘+ filename else: Syntax() except: Syntax() syntax_check() ip = ACL_check(‘ip‘) net = ACL_check(‘network‘) if ip != ‘None‘: ip_list = GET_ip(ip) if net != ‘None‘: net_list = GET_net(net) net_pool = IPY(net_list) for netadd in net_pool: for ipadd in netadd: ip_list.append(ipadd) user = ‘root‘ passwd = ‘123.com‘ port = 22 if comd != ‘‘: #多线程执行命令 for ip in ip_list: try: sshd = threading.Thread(target=telnet,args=(ip ,port ,user ,passwd ,comd,)) sshd.start() time.sleep(0.1) #延迟打印 except: pass if put != ‘‘: #多线程上传文件 for ip in ip_list: try: exce = threading.Thread(target=get_or_put, args=(file2,file4,ip,port,user,passwd,)) exce.start() time.sleep(0.1) #延迟打印 except: pass path = sys.path[2] rm_mod = ‘rm -f %s/addresspool.py‘ %path os.system(rm_mod)
本文出自 “自动化运维” 博客,请务必保留此出处http://hongchen99.blog.51cto.com/12534281/1919969
以上是关于paramiko+threading实现主机批量管理的主要内容,如果未能解决你的问题,请参考以下文章
python 远程批量多线程paramiko 和 threading案例