python服务器部署(其实就是拷贝文件到远程服务器)

来源:互联网 发布:华为软件开发人员 编辑:程序博客网 时间:2024/06/06 20:06

Deploy.py:

#!/usr/bin/python#-*- coding:utf-8 -*-import os import sys import commandsimport configimport subprocessimport timeimport getpassDEBUG = Falsedef debug_print(msg):if DEBUG:print msg############################ 通用函数部分 ############################# 输入的密码里有一些特殊字符的时候,会乱码def trans_string(strinput):strret = strinput.replace('\\','\\\\')strret = strret.replace('!','\!')return strret# 调用本地shell命令def DoShellCmd(cmd, show_result = True):debug_print("DoShellCmd cmd: " + cmd)(exitcode, outtext) = commands.getstatusoutput(cmd)if exitcode != 0:print outtext#exit(exitcode)elif show_result:print outtextreturn outtext# 利用sshpass调用远程shell命令def DoRemoteCmd(ip, passwd, user, rcmd):cmd = "sshpass -p "+passwd+" ssh -p22 -o StrictHostKeyChecking=no "cmd += "-l"+user+" "+ip+" \""+rcmd+"\" < /dev/null"debug_print("DoRemoteCmd cmd: " + cmd)return DoShellCmd(cmd)# 利用sshpass工具拷贝文件到远程路径def ScpFileToRemote(ip, passwd, user, src_file, dest_dir, compress = False):scp_cmd = "sshpass -p " + passwdif compress:scp_cmd += " scp -P22 -C -o StrictHostKeyChecking=no "else:scp_cmd += " scp -P22 -o StrictHostKeyChecking=no "scp_cmd += src_file + " " + user + "@" + ip + ":" + dest_dir + " < /dev/null"debug_print("ScpFileToRemote cmd: " + scp_cmd)DoShellCmd(scp_cmd, False)# 判定本地和远程两文件是否一样def RemoteLocalFileMd5Equal(svr_ip, svr_passwd, svr_user, remote_fullname, local_fullname):remote_md5sum = DoRemoteCmd(svr_ip, svr_passwd, svr_user, "md5sum -b " + remote_fullname)remote_md5sum = remote_md5sum.split()[0]local_md5sum = DoShellCmd("md5sum -b " + local_fullname)local_md5sum = local_md5sum.split()[0]if local_md5sum == remote_md5sum:return Truereturn Falsedef DoCopyFiles(cfg):for (fname,tname) in cfg.copy_direct.items():#print "k:[" + k + "]v:[" + vif fname[0] == '/':from_name = fnameelse:from_name = os.path.join(cfg.from_prefix, fname)if tname[0] == '/':to_name = tnameelse:to_name = os.path.join(cfg.to_prefix, tname)# 如果md5相等,则不用拷贝md5equal = RemoteLocalFileMd5Equal(cfg.server_ip, cfg.server_pass, cfg.server_user, to_name, from_name)if md5equal:continueDoRemoteCmd(cfg.server_ip, cfg.server_pass, cfg.server_user, "mkdir -p " + os.path.dirname(to_name))ScpFileToRemote(cfg.server_ip, cfg.server_pass, cfg.server_user, from_name, os.path.dirname(to_name))for (fname,tname) in cfg.copy_compress.items():#print "k:[" + k + "]v:[" + vif fname[0] == '/':from_name = fnameelse:from_name = os.path.join(cfg.from_prefix, fname)if tname[0] == '/':to_name = tnameelse:to_name = os.path.join(cfg.to_prefix, tname)# 如果md5相等,则不用拷贝md5equal = RemoteLocalFileMd5Equal(cfg.server_ip, cfg.server_pass, cfg.server_user, to_name, from_name)if md5equal:continueDoRemoteCmd(cfg.server_ip, cfg.server_pass, cfg.server_user, "mkdir -p " + os.path.dirname(to_name))ScpFileToRemote(cfg.server_ip, cfg.server_pass, cfg.server_user, from_name, os.path.dirname(to_name), True)def Deploy():#'检查参数'if len(sys.argv) < 3:print "Usage: python deploy.py configfilename [DEBUG]"print "Options: "print "[configfilename] : config.conf"print "[DEBUG] : debug|DEBUG|Debug"sys.exit(1)configfilename = sys.argv[1]if len(sys.argv) >= 3:input_debug = sys.argv[2]if input_debug.lower() == "debug":global DEBUGDEBUG = Truecfg = config.Config(configfilename)# 如果密码没有设置,输入密码if cfg.server_pass == "notset":cfg.server_pass = trans_string(getpass.getpass("input password:"))#不要做逻辑,只负责拷贝文件DoCopyFiles(cfg)DoRemoteCmd(cfg.server_ip, cfg.server_pass, cfg.server_user, "cd " + cfg.to_prefix + " && sh c.sh ")############################################Deploy()
config.py:

#!/usr/bin/python#-*- coding:utf-8 -*-class Config:def __init__(self, cfg_filename):self.__read_config(cfg_filename)def __read_config(self, file_name):self.copy_direct = {}self.copy_compress = {}print file_namef = open(file_name, 'r')lines = f.readlines()for line in lines:# 注释 注意不要在行尾注释if line.find('#') != -1:continueline = line.replace(' ','')line = line.replace("\t","")line = line.replace("\n","")# => 直接拷贝if line.find("=>") > 0:line_split = line.split("=>")if len(line_split) == 2:self.copy_direct[line_split[0]] = line_split[1]continue# =*> 压缩拷贝if line.find("=*>") > 0:line_split = line.split("=*>")if len(line_split) == 2:self.copy_compress[line_split[0]] = line_split[1]continueif line.find("=") > 0:line_split = line.split("=")if len(line_split) == 2:if line_split[0] == "server_ip":self.server_ip = line_split[1]if line_split[0] == "server_user":self.server_user = line_split[1]if line_split[0] == "server_pass":self.server_pass = line_split[1]if line_split[0] == "from_prefix":self.from_prefix = line_split[1]if line_split[0] == "to_prefix":self.to_prefix = line_split[1]if line_split[0] == "remote_deploy_tmp_folder":self.remote_deploy_tmp_folder = line_split[1]f.close()
配置:

server_ip = 192.168.123.234server_user = your_user_nameserver_pass = notsetfrom_prefix = ../to_prefix = ~/server/# =*>表示压缩传输# =>表示直接传输# 以/开头的表示绝对路径/home/AsynServ_Dev =*> /home/AsynServ_Dev/home/ServerBench =*> /home/ServerBenchc.sh => c.shprojectname.txt => projectname.txtr.sh => r.shs.sh => s.shx.sh => x.shconfigs/data/AllConfigs.bytes => configs/data/AllConfigs.bytes#lsloginsvr/libloginsvr.so =*> loginsvr/libloginsvr.sologinsvr/r.sh => loginsvr/r.shloginsvr/s.sh => loginsvr/s.shloginsvr/x.sh => loginsvr/x.shloginsvr/bench.conf.template => loginsvr/bench.conf.templateloginsvr/bind.conf.template => loginsvr/bind.conf.templateloginsvr/log/keepme.txt => loginsvr/log/keepme.txt#gsgamesvr/libgamesvr.so =*> gamesvr/libgamesvr.sogamesvr/r.sh => gamesvr/r.shgamesvr/s.sh => gamesvr/s.shgamesvr/x.sh => gamesvr/x.shgamesvr/bench.conf.template => gamesvr/bench.conf.templategamesvr/bind.conf.template => gamesvr/bind.conf.templategamesvr/log/keepme.txt => gamesvr/log/keepme.txt#ctcenter/libcenter.so =*> center/libcenter.socenter/r.sh => center/r.shcenter/s.sh => center/s.shcenter/x.sh => center/x.shcenter/bench.conf.template => center/bench.conf.templatecenter/bind.conf.template => center/bind.conf.templatecenter/log/keepme.txt => center/log/keepme.txt