最近在学习python,借助fabric模块写了个批量操作服务器的脚本,在此分享给大家,如有不足之处,欢迎大家指正
准备工作:
安装python 2.6.5:
yum -y install readline*
tar xf Python-2.6.5.tar.bz2
cd Python-2.6.5
将目录下Modules/Setup.dist文件中"readline readline.c -lreadline -ltermcap"行前的注释去掉
编译安装:
./configure --enable-shared
make -j8 && make install
安装setuptools
tar xf setuptools-0.6c11.tar.gz
cd setuptools-0.6c11
python setup.py install
安装fabric
执行安装时,软件会自动从网上查找依赖的安装包并进行安装
tar xf fabric-0.9rc2.tar.gz
cd goosemo-fabric-1eacbf2
python setup.py install
############################################################################
pyssh脚本:
#!/usr/bin/env python # -*- coding: utf-8 -*- ##################################################### # Author: mayulin – mayulin@cy2009.com # Last modified: 2011-04-28 12:27 # Filename: pssh.py ##################################################### from fabric.api import env,run,put,get from os import path from re import findall from sys import argv from fabric.context_managers import hide from time import sleep USER='root' HOST,IP_LIST=[],[] PORT='22' PRI_KEY,PASSWORD,CMD,uSRC,uDST,dSRC,dDST='','','','','','','' timeout=1 for i in range(1,len(argv)+1): if argv[i-1] == '-h' or len(argv)==1: print """ USAGE: -u [user] Use this argument to specify the user,default is 'root' -H [host] The host that you want to connect -f [file] The file content multiple ip address you want to connect -P [port] The ssh port,default is 22 -p [pwd|file] You can specify password or a priviate key file to connect the host -c [command] The command you want the host(s) to run -U [src,dst] The local file that you want to upload to the remote host(s) -D [src,dst] The remote file that you want to download to the local host -t [timeout] The program running timeout,default is 1(s) -h Print this help screen """ if argv[i-1] == '-u': USER=argv[i] env.user='%s'%(USER) else: env.user='%s'%(USER) if argv[i-1] == '-H': arg=findall('(\d+\.\d+\.\d+\.\d+|\s+\.{3,4})',argv[i]) for j in arg: if type(j).__name__ !='NoneType': HOST.append(j) else: print 'The HostIP input error' if argv[i-1] == '-P': PORT=argv[i] if argv[i-1] == '-f': if path.isfile('%s'%(argv[i])) == True: IP_LIST=open('%s'%(argv[i]),'r').readlines() if argv[i-1] == '-p': if path.isfile(argv[i]) == True: PRI_KEY=argv[i] env.key_filename='%s'%(PRI_KEY) else: PASSWORD=argv[i] env.password='%s'%(PASSWORD) if argv[i-1] == '-c': CMD=argv[i] if argv[i-1]=='-t': timeout=argv[i] SLP='sleep %s'%(timeout) if argv[i-1] == '-U': x=src=argv[i].split(',') uSRC=x[0] uDST=x[1] if argv[i-1] == '-D': y=src=argv[i].split(',') dSRC=y[0] dDST=y[1] else: IP_PORT=[] if len(IP_LIST)!=0: for k in IP_LIST: IP_PORT.append(k.strip()+':'+PORT) if len(HOST)!=0: for k in HOST: IP_PORT.append(k.strip()+':'+PORT) if CMD != '': def command(): with hide('running'): run("%s;%s" %(CMD,SLP)) for ip in IP_PORT: env.host_string=ip print "Execute command : \"%s\" at Host : %s" %(CMD,ip.split(':')[0]) print "-------------------------------------------------" command() print "-------------------------------------------------" if uSRC and uDST !='': def upload(): with hide('running'): put("%s" %(uSRC),"%s" %(uDST)) for ip in IP_PORT: env.host_string=ip print "Upload local file : \"%s\" to Host : %s \"%s\"" %(uSRC,ip.split(':')[0],uDST) print "-------------------------------------------------" upload() print "-------------------------------------------------" if dSRC and dDST !='': def download(): with hide('running'): get("%s" %(dSRC),"%s" %(dDST)) for ip in IP_PORT: env.host_string=ip print "Download remote file : \"%s\" from Host : %s to local \"%s\"" %(dSRC,ip.split(':')[0],dDST) print "-------------------------------------------------" download() print "-------------------------------------------------" |
###########################################################################################
脚本执行效果:
显示帮助:
在多个远程主机上执行shell命令:
将远程主机上的文件下载到本地目录:
将本地文件上传到多个远程主机上
本文出自 “梦~从这里起航” 博客,请务必保留此出处http://mayulin.blog.51cto.com/1628315/555459