返回顶部
首页 > 资讯 > 精选 >如何用paramiko模块写发版机
  • 489
分享到

如何用paramiko模块写发版机

2023-06-04 10:06:20 489人浏览 泡泡鱼
摘要

本文小编为大家详细介绍“如何用paramiko模块写发版机”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何用paramiko模块写发版机”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。说明:为了安全,本文敏感信

本文小编为大家详细介绍“如何用paramiko模块写发版机”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何用paramiko模块写发版机”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

说明:为了安全,本文敏感信息如ip、用户名密码等做了转换处理。

一、场景:每次发版时,都需要发版人一个一个文件的往生产机上拷贝,这样不仅费时,而且容易出错,降低工程师的工作积极性。

二、解决方法:需用python脚本写一个发版机,自动发版。

三、脚本实现的功能:自动合并develop_svn(开发svn)代码到online_svn(生产svn)下,自动备份远程服务器代码,手工通过ecplice编译online_svn代码,然后自动把编译后的class文件根据filelist里面的路径拷贝到生产机,并自动重启服务器上的Tomcat服务。

四、具体步骤:

1、开发提供类似如下svn文件列表:

filelist.txt里面的内容:

/trunk/src/ha/lalala/controller/BoardController.java

/trunk/src/ha/lalala/pda/PdaWaybillController.java

/trunk/WEBRoot/jsp/productReview/list.jsp

2、建立develop_svn和online_svn目录;

如何用paramiko模块写发版机

3、编写faban.py脚本

点击(此处)折叠或打开

  1. #-*-coding:utf-8-*-

  2. import Crypto #paramiko模块依赖Crypto模块

  3. import paramiko #paramiko模块是wnidows 远程linux机器用的模块

  4. import os

  5. import sys

  6. import shutil #shutil模块下有copy文件夹的方法

  7. import time #这里使用其休眠函数sleep

  8. import subprocess

  9. import glob




  10. #Update SVN

  11. def UpdateSVN(path):

  12.     p = subprocess.Popen(['svn','update',path],shell=True,stdout=subprocess.PIPE)

  13.     print p.stdout.readlines()

  14.     



  15. #定义函数用来合并svn

  16. def MergeSVN(develop_svn,online_svn):

  17.     with open('filelist.txt') as f:

  18.         for index,line in enumerate(f,1): #1表示索引值从1开始

  19.             line = line.replace('/trunk','') #替换路径

  20.             line = line.replace('\n','') #把换行替换掉,\n是换行符的意思

  21.             develop_svn_path=develop_svn + line #拼接路径

  22.             online_svn_path = online_svn + line #拼接路径

  23.             print "%d  copying:  %s ---> %s" % (index,develop_svn_path,online_svn_path)

  24.             if not os.path.exists(os.path.dirname(online_svn_path)) : #如果目录不存在,就建立一个目录,注意exists方法返回的是布尔值,所以用Not进行否定

  25.                 os.mkdir(os.path.dirname(online_svn_path)) #建立目录

  26.             shutil.copy(develop_svn_path,online_svn_path) #将develop_svn_path里面的代码拷贝到online_svn_path目录下

  27.     print('\n') #输出一个换行

  28.     print("合并SVN目录已完成,请手工通过ecplice编译代码".decode('utf-8').encode('gb2312'))

  29.     print('\n') #输出一个换行

  30.      

  31.     



  32. #定义函数用来远程备份代码--给北京的机器备份

  33. def BackupCode(hostname,port,username,passWord):

  34.     ssh = paramiko.SSHClient() #创建一个从客户端连接服务器端的对象,也就是类的实例化

  35.     ssh.load_system_host_keys() #加载主机秘钥

  36.     ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #接受不在本地Known_host文件下的主机。否则ssh需要手工输入一次yes

  37.     ssh.connect(hostname,port,username,password) #ssh连接

  38.     

  39.     stdin,stdout,stderr = ssh.exec_command(get_pty=False,command='dir=$(date +%Y%m%d%H%M%S) && \

  40.                                              rsync -zrtopg --exclude geadPortrait/ \

  41.                                            --exclude=idcard/ --exclude=temp/ --exclude=upload \

  42.                                            --exclude=files --exclude=temporary_zip/ \

  43.                                            /opt/apache-tomcat-8.0.27/webapps/ROOT  /backup/tms/$dir') #执行远程机器的rsync命令进行备份,rsync命令没加-v参数,所以正常信息不会输出,只有报错才输出内容

  44.     result = stdout.read() #内容输出

  45.     error = stderr.read() #错误输出

  46.     print result

  47.     print error

  48.     #判断是否有错误输出,没有就说备份成功,否则说备份失败

  49.     if result.strip()=="" and error.strip()=="":

  50.         print "%s 完美,备份成功,备份位置在远程机器的/backup目录下".decode('utf-8').encode('gb2312') % hostname

  51.         print('\n')

  52.     else:

  53.         print "%s 不好了,备份失败了".decode('utf-8').encode('gb2312') % hostname

  54.         print('\n')

  55.     ssh.close() #记得关闭paramiko的ssh连接







  56. #定义函数用来远程备份代码--给香港腾讯的机器备份

  57. def BackupCode_HK_QQ(hostname,port,username,password):

  58.     ssh = paramiko.SSHClient() #创建一个从客户端连接服务器端的对象,也就是类的实例化

  59.     ssh.load_system_host_keys() #加载主机秘钥

  60.     ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #接受不在本地Known_host文件下的主机。否则ssh需要手工输入一次yes

  61.     ssh.connect(hostname,port,username,password) #ssh连接

  62.     stdin,stdout,stderr = ssh.exec_command(get_pty=False,command='dir=$(date +%Y%m%d%H%M%S) && \

  63.                                             rsync -zrtopg --exclude geadPortrait/ \

  64.                                            --exclude=idcard/ --exclude=temp/ --exclude=upload \

  65.                                            --exclude=files --exclude=temporary_zip/  \

  66.                                            /opt/tomcat-9090-tms/webapps/ROOT  /backup/tms/$dir') #执行远程机器的rsync命令进行备份,rsync命令没加-v参数,所以正常信息不会输出,只有报错才输出内容

  67.     result = stdout.read() #内容输出

  68.     error = stderr.read() #错误输出

  69.     print result

  70.     print error

  71.     #判断是否有错误输出,没有就说备份成功,否则说备份失败

  72.     if result.strip()=="" and error.strip()=="":

  73.         print "%s 完美,备份成功,备份位置在远程机器的/backup目录下".decode('utf-8').encode('gb2312') % hostname

  74.         print('\n')

  75.     else:

  76.         print "%s 不好了,备份失败了".decode('utf-8').encode('gb2312') % hostname

  77.         print('\n')

  78.     ssh.close() #记得关闭paramiko的ssh连接



  79.         


  80. #定义函数用来远程执行发版动作

  81. def Publish(hostname,port,username,password,local_base_path,remote_base_path):

  82.     count = 0

  83.     trans = paramiko.Transport(hostname,port) #建立paramiko的transport方式连接

  84.     trans.connect(username=username,password=password) #建立连接

  85.     sftp = paramiko.SFTPClient.from_transport(trans) #建立连接

  86.     with open('filelist.txt','r') as f:

  87.         for line in f:

  88.             #本地路径预处理

  89.             localpath_filename = line.replace('/trunk/src','WebRoot/WEB-INF/classes')

  90.             localpath_filename = localpath_filename.replace('/trunk/WebRoot','WebRoot')

  91.             localpath_filename = localpath_filename.replace('.java','.class')

  92.             localpath_filename = localpath_filename.replace('\n','') #把换行替换掉

  93.             #构造真正的父类本地路径

  94.             localpath_filename = local_base_path + localpath_filename

  95.             #构造真正的父类远程路径

  96.             remotepath_filename = remote_base_path + localpath_filename.replace('online_svn/WebRoot/','')

  97.             #拷贝父类到远程机器上

  98.             print "%s is publishing:  %s ---> %s " % (hostname,localpath_filename,remotepath_filename)

  99.             try:

  100.                 sftp.listdir(os.path.dirname(remotepath_filename)) #加个错误处理,如果目录不存在,就建立一个目录

  101.             except ioError:

  102.                 sftp.mkdir(os.path.dirname(remotepath_filename))

  103.             sftp.put(localpath_filename,remotepath_filename)

  104.             count += 1

  105.             print "***********第%s个文件发版成功***************" % count

  106.             #用glob模块寻找子类

  107.             path_filename = os.path.split(localpath_filename) #split:返回一个二元组,包含文件的路径与文件名

  108.             filename_splitext = os.path.splitext(path_filename[1]) #去掉文件扩展名

  109.             localpath_subclassfilenames = glob.glob('%s/%s$*' % (path_filename[0],filename_splitext[0]))

  110.             #把子类拷贝到远程机器的目录下

  111.             for localpath_subclassfilename in localpath_subclassfilenames:

  112.                 localpath_subclassfilename = localpath_subclassfilename.replace('\\',r'/')

  113.                 remotepath_subclassfilename = remote_base_path + localpath_subclassfilename.replace('online_svn/WebRoot/','')

  114.                 print "%s is publishing:  %s ---> %s " % (hostname,localpath_subclassfilename,remotepath_subclassfilename)

  115.                 sftp.put(localpath_subclassfilename,remotepath_subclassfilename)

  116.                 count += 1

  117.                 print "***********第%s个文件拷贝成功,注意该文件是子类哦^_^ *****************************************" % count

  118.         print " %s机器发版完成!!!".decode('utf-8').encode('gb2312') % hostname

  119.         print('\n')

  120.     trans.close() #记得关闭paramiko的transport连接

  121.                 



  122. #定义函数用来重启服务

  123. def RestartService(hostname,port,username,password):

  124.     ssh = paramiko.SSHClient() #创建一个从客户端连接服务器端的对象,也就是类的实例化

  125.     ssh.load_system_host_keys() #加载主机秘钥

  126.     ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #接受不在本地Known_host文件下的主机。否则ssh需要手工输入一次yes

  127.     ssh.connect(hostname,port,username,password) #ssh连接

  128.     stdin,stdout,stderr = ssh.exec_command(get_pty=False,command='/usr/local/shell/restartservice.sh')

  129.     result = stdout.read() #内容输出

  130.     error = stderr.read() #错误输出

  131.     print "%s 在重启服务...".decode('utf-8').encode('gb2312') % hostname

  132.     print result

  133.     print error

  134.     print('\n')

  135.     ssh.close() #记得关闭paramiko的ssh连接

  136.     

  137.   


  138. #主程序

  139. if __name__ == '__main__':

  140.     #Update SVN

  141.     while True:

  142.         temp = str(raw_input('1) 请问你要Update SVN吗?[yes/no]:'.decode('utf-8').encode('gb2312')))

  143.         tips = temp.strip().lower()

  144.         if tips == 'yes':

  145.             print "Now begin Update SVN..."

  146.             UpdateSVN('develop_svn')

  147.             break

  148.         elif tips == 'no':

  149.             break

  150.     

  151.     #合并svn

  152.     while True:

  153.         temp = str(raw_input('2) 请问你要把开发svn合并到生产svn里面吗?[yes/no]:'.decode('utf-8').encode('gb2312')))

  154.         tips = temp.strip().lower()

  155.         if tips == 'yes':

  156.             print "Now begin Merge SVN..."

  157.             MergeSVN('develop_svn','online_svn')

  158.             break

  159.         elif tips == 'no':

  160.             break

  161.         

  162.     #备份远程机器上的代码

  163.     while True:

  164.         temp = str(raw_input('3)请问你要在发版前,备份一下远程服务器上的代码吗?[yes/no]:'.decode('utf-8').encode('gb2312')))

  165.         tips = temp.strip().lower()

  166.         if tips == 'yes':

  167.             print "Now begin backup code..."

  168.             BackupCode(hostname = '10.2.88.2',port = '22',username = 'tms',password = 'xxx')

  169.             BackupCode(hostname = '10.2.88.3',port = '22',username = 'tms',password = 'xxx')

  170.             BackupCode(hostname = '10.2.88.13',port = '22',username = 'tms',password = 'xxx')

  171.             BackupCode(hostname = '10.2.88.14',port = '22',username = 'tms',password = 'xxx')

  172.             BackupCode_HK_QQ(hostname = '10.144.89.252',port = '22',username = 'tms',password = 'xxx')

  173.             break

  174.         elif tips == 'no':

  175.             break

  176.     #提示是否eclipse编译代码

  177.     while True:

  178.         temp = str(raw_input('4) 提示:请问你手工通过eclse编译tms代码了吗[yes/no]:'))

  179.         tips = temp.strip().lower()

  180.         if tips == 'yes':

  181.             break

  182.         elif tips == 'no':

  183.             break

  184.     

  185.     #预发版

  186.     while True:

  187.         temp = str(raw_input('5)请问你需要先单独在预发版机器10.2.88.3上测试一下子发版吗?[yes/no]:'.decode('utf-8').encode('gb2312')))

  188.         tips = temp.strip().lower()

  189.         if tips == 'yes':

  190.             print "Now begin publish code..."

  191.             Publish(hostname='10.2.88.3',port='22',username='tms',password='tmsOo798',local_base_path='online_svn/',remote_base_path='/opt/apache-tomcat-8.0.27/webapps/ROOT/')

  192.             print "Now begin restart service..."

  193.             RestartService(hostname = '10.2.88.3',port = '22',username = 'tms',password = 'tmsOo798')

  194.             break

  195.         elif tips == 'no':

  196.             break


  197.     #生产全发版

  198.     while True:

  199.         temp = str(raw_input('6)请问你要开始在所有正式服务器上进行发版吗,包括10.2.88.13/14/2/3,10.144.89.252?[yes/no]:'.decode('utf-8').encode('gb2312')))

  200.         tips = temp.strip().lower()

  201.         if tips == 'yes':

  202.             print "Now begin publish code..."

  203.             Publish(hostname='10.2.88.13',port='22',username='tms',password='xxx',local_base_path='online_svn/',remote_base_path='/opt/apache-tomcat-8.0.27/webapps/ROOT/')

  204.             Publish(hostname='10.2.88.14',port='22',username='tms',password='xxx',local_base_path='online_svn/',remote_base_path='/opt/apache-tomcat-8.0.27/webapps/ROOT/')

  205.             Publish(hostname='10.2.88.2',port='22',username='tms',password='xxx',local_base_path='online_svn/',remote_base_path='/opt/apache-tomcat-8.0.27/webapps/ROOT/')

  206.             Publish(hostname='10.2.88.3',port='22',username='tms',password='xxx',local_base_path='online_svn/',remote_base_path='/opt/apache-tomcat-8.0.27/webapps/ROOT/')

  207.             Publish(hostname='10.144.89.252',port='22',username='tms',password='xxx',local_base_path='online_svn/',remote_base_path='/opt/tomcat-9090-tms/webapps/ROOT/')


  208.             break

  209.         elif tips == 'no':

  210.             break


  211.     #重启服务

  212.     while True:

  213.         temp = str(raw_input('7)请问你要开始在所有正式服务器上重启服务吗,包括10.2.88.13/14/2/3,10.144.89.252?[yes/no]:'.decode('utf-8').encode('gb2312')))

  214.         tips = temp.strip().lower()

  215.         if tips == 'yes':

  216.             print "Now begin restart service..."

  217.             RestartService(hostname = '10.2.88.13',port = '22',username = 'tms',password = 'xxx')

  218.             print "please wait 60s..."

  219.             time.sleep(60)

  220.             RestartService(hostname = '10.2.88.14',port = '22',username = 'tms',password = 'xxx')

  221.             print "please wait 60s..."

  222.             time.sleep(60)

  223.             RestartService(hostname = '10.2.88.2',port = '22',username = 'tms',password = 'xxx')

  224.             print "please wait 60s..."

  225.             time.sleep(60)

  226.             RestartService(hostname = '10.2.88.3',port = '22',username = 'tms',password = 'xxx')

  227.             print "please wait 60s..."

  228.             time.sleep(60)

  229.             RestartService(hostname = '10.144.89.252',port = '22',username = 'tms',password = 'xxx')

  230.             break

  231.         elif tips == 'no':

  232.             break


  233.     #提示是否手工提交online_svn代码

  234.     while True:

  235.         temp = str(raw_input('8) 提示:请问你手工提交online_svn代码了吗?[yes/no]:'))

  236.         tips = temp.strip().lower()

  237.         if tips == 'yes':

  238.             break

  239.         elif tips == 'no':

  240.             break


  241.     #退出本程时要说的话

  242.     print "\n"

  243.     print "*" * 50

  244.     print "亲,您的完版完成,记得测试业务是否正常哦!!!"

  245.     print "*" * 50

  246.     sys.exit()

  247. #加入下面这句话,才能用windows双击运行Python脚本,否则双击脚本会一闪而过

  248. raw_input()

读到这里,这篇“如何用paramiko模块写发版机”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: 如何用paramiko模块写发版机

本文链接: https://lsjlt.com/news/237347.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何用paramiko模块写发版机
    本文小编为大家详细介绍“如何用paramiko模块写发版机”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何用paramiko模块写发版机”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。说明:为了安全,本文敏感信...
    99+
    2023-06-04
  • Python使用Paramiko模块编写脚本进行远程服务器操作
    简介: paramiko是python(2.2或更高)的模块,遵循SSH2协议实现了安全(加密和认证)连接远程机器。 安装所需软件包: http://ftp.dlitz.net/pub/dlitz/cryp...
    99+
    2022-06-04
    脚本 模块 操作
  • python如何引用自己写的模块
    要引用自己写的模块,可以按照以下步骤进行操作:1. 在你的模块所在的文件夹中创建一个空白的`__init__.py`文件。这个文件是...
    99+
    2023-09-25
    python
  • python如何发布模块
    要发布一个Python模块,可以按照以下步骤进行操作:1. 在你的模块文件夹中创建一个`setup.py`文件,该文件描述了你的模块...
    99+
    2023-08-23
    python
  • 如何使用JS给通用模块写法
    这篇文章主要为大家展示了“如何使用JS给通用模块写法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用JS给通用模块写法”这篇文章吧。模块化这个问题并非一开...
    99+
    2024-04-02
  • 如何用C#开发CF蓝牙模块
    这篇文章主要讲解了“如何用C#开发CF蓝牙模块”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何用C#开发CF蓝牙模块”吧!基本要点首先明确一点,因为涉及到驱动硬件的问题,所以仅靠了解C#开...
    99+
    2023-06-17
  • 如何使用C/C++编写node.js原生模块
    这篇文章主要为大家展示了“如何使用C/C++编写node.js原生模块”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用C/C++编写node.js原生模块...
    99+
    2024-04-02
  • Python中如何使用随机数模块
    这篇文章给大家介绍Python中如何使用随机数模块,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。随机整数:>>> import random  >>...
    99+
    2023-06-17
  • python如何导入自己写的模块
    在Python中,要导入自己写的模块,可以按照以下步骤进行操作:1. 创建一个新的Python文件,例如`my_module.py`...
    99+
    2023-08-15
    python
  • Python如何使用scapy模块发包收包
    这篇文章给大家分享的是有关Python如何使用scapy模块发包收包的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Python对...
    99+
    2023-06-14
  • 如何创建和发布Python模块
    已有 7514 次阅读 2013-1-3 22:22 |个人分类:学习生活|系统分类:科研笔记|关键词:Python 发布 模块 Windows 1. 首先将你要发布的模块(函数)写在一个Python文件里,即以*.py的文件...
    99+
    2023-01-31
    模块 Python
  • node中http模块和url模块如何使用
    这篇“node中http模块和url模块如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这...
    99+
    2024-04-02
  • Perl如何使用模块
    这篇文章主要为大家展示了“Perl如何使用模块”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Perl如何使用模块”这篇文章吧。Perl模块1、创建Perl模块Perl5中用包来创建Perl模块,...
    99+
    2023-06-17
  • ECMAScript模块如何使用
    这篇“ECMAScript模块如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“ECMAScript模块如何使用”文章吧...
    99+
    2023-06-27
  • 如何查看虚拟主机的可用模块
    要查看虚拟主机的可用模块,可以使用以下步骤:1. 登录到虚拟主机的控制面板或通过SSH远程连接到虚拟主机的服务器。2. 打开虚拟主机...
    99+
    2023-08-08
    虚拟主机
  • 如何将自己写的模块上传到pypi
    目录楔子上传模块至pypi编写模块编译上传楔子 我们在安装第三方包的时候,直接一个pip install xxx命令就搞定了,然后pip会去pypi上寻找我们要安装的包,然后下载下...
    99+
    2024-04-02
  • Nginx中如何使用limit模块限制并发数
    小编给大家分享一下Nginx中如何使用limit模块限制并发数,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! nginx 限制ip并发数,nginx限制IP连接数的范例参考:如何Nginx限制同一个ip的连接数,限制并发数...
    99+
    2023-06-04
  • 如何用JS写一个发布订阅模式
    这篇文章给大家介绍如何用JS写一个发布订阅模式,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。什么是发布订阅模式?能手写实现一下吗?它和观察者模式有区别吗?...1 场景引入我们先来看这么一个场景:假设现在有一个社交平台...
    99+
    2023-06-25
  • python如何使用import模块
    这篇文章给大家分享的是有关python如何使用import模块的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。import模块在Python经常使用import声明,以使用其他模块...
    99+
    2024-04-02
  • node path模块如何使用
    这篇文章主要讲解了“node path模块如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“node path模块如何使用”吧!path.resolve...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作