热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python自动化验证部署_python自动化远程部署fabric

项目发布部署时,往往需要花大量的时间去ssh多台机器,然后逐一敲重复的命令,同样的操作和同样的命令反复做,作为一个程序员是不

项目发布部署时,往往需要花大量的时间去ssh多台机器,然后逐一敲重复的命令,同样的操作和同样的命令反复做,作为一个程序员是不能忍受的,这也是自动化存在的意义,可以大大节省不必要的时间,python做为一个脚本语言本身就有这方面的优势,fabric 这个库可以很好的偷懒,本文使用python3。

安装

会安装一大堆包,提示 Successfully installed 等字样表示安装成功,安装完后,系统有一个 fab 命令可以使用。想要了解更多,看 官方文档 。

sudo pip3 install fabric3

简单示例

1、先见识一下使用效果,然后再看常用的一些命令

例一:执行远程主机命令,查看主机操作系统, 'uname -o'

首先创建一个 check.py 文件

from fabric.api import run # 导入api中的run

def look():

run('uname -o') # 执行run函数,把用使用的命令传入

然后使用 fab 命令执行,输入目标主机用户密码后即可执行命令,并打印结果

fab -f check.py -H 127.0.0.1 'look' # -f指定文件, -H 指定主机,这里我们直接用本地, look 是文件里面的任务函数名

输出的结果如下:

例一执行结果

这里只是一个小示例,当然不可能每个都自己手动输入密码,通过配置都可以完成自动化。

例二:多台远程主机创建目录 test 。

创建一个 mk_dir.py 文件:

from fabric.api import *

# 设置目标主机

env.hosts = ['192.168.139.139', '192.168.139.141']

# 设置多台主机用户名及密码

env.passwords = {

'python@192.168.139.139:22': '12345678',

'python@192.168.139.141:22': '12345678'

}

# 设置一个任务

@task

def start():

run('mkdir test')

然后执行任务

fab -f mk_dir.py start # start 是任务名

结果如下,可以在两个主机的 python 用户家目录看到 test 文件夹,这样就可以实现自动连接远程主机,并执行相应的任务了。

例二执行结果

例三:打包本地文件,上传到目标主机,并校验 md5 ,然后解压并执行这个文件(该例可以配合后面的命令说明测试)

场景:本地有一个 /home/python/test/test.py 文件,打包成 test.tar.gz ,上传到目标主机的 /home/python/temp 目录下,解压并执行。

创建一个本地的test.py如下,用来上传后执行:

print('===========')

print('hello world')

print('===========')

创建一个任务文件 uploadfile.py

from fabric.api import *

env.hosts = ['192.168.139.139', '192.168.139.141']

env.user = 'python' # 多台主机用户名密码相同可以只写一次

env.password = '12345678'

# 打包

@runs_once # 该装饰器表示只执行一次,没有的话默认每台主机都执行一次

def task_tar(): # 该场景本地文件打包本身就只需要执行一次

with lcd('/home/python/test'):

local('tar zcvf test.tar.gz test.py')

# 上传

def task_upload():

run('mkdir -p /home/python/temp')

put('/home/python/test/test.tar.gz', '/home/python/temp/test.tar.gz')

# 验证md5

def task_md5():

# 计算本地的md5

local_md5 = local('md5sum /home/python/test/test.tar.gz', capture=True).split(' ')[0]

# 计算远程主机md5

remote_md5 = run('md5sum /home/python/temp/test.tar.gz').split(' ')[0]

print(local_md5)

print(remote_md5)

if remote_md5 == local_md5:

print('上传成功')

else:

print('上传出错')

# 解包并执行

def task_exc():

with cd('/home/python/temp'):

run('tar zxvf test.tar.gz')

run('python3 test.py')

# 调度

@task

def start():

task_tar()

task_upload()

task_md5()

task_exc()

执行任务:

fab -f uploadfile.py start

屏幕输出结果如下

[python@ubuntu Test]$ fab -f uploadfile.py start

[192.168.139.139] Executing task 'start'

[localhost] local: tar zcvf test.tar.gz test.py

test.py

[192.168.139.139] run: mkdir -p /home/python/temp

[192.168.139.139] put: /home/python/test/test.tar.gz -> /home/python/temp/test.tar.gz

[localhost] local: md5sum /home/python/test/test.tar.gz

[192.168.139.139] run: md5sum /home/python/temp/test.tar.gz

[192.168.139.139] out: d5e8f717b176270f4c1a4fa72493239a /home/python/temp/test.tar.gz

[192.168.139.139] out:

d5e8f717b176270f4c1a4fa72493239a

d5e8f717b176270f4c1a4fa72493239a

上传成功

[192.168.139.139] run: tar zxvf test.tar.gz

[192.168.139.139] out: test.py

[192.168.139.139] out:

[192.168.139.139] run: python3 test.py

[192.168.139.139] out: ===========

[192.168.139.139] out: hello world

[192.168.139.139] out: ===========

[192.168.139.139] out:

[192.168.139.141] Executing task 'start'

[192.168.139.141] run: mkdir -p /home/python/temp

[192.168.139.141] put: /home/python/test/test.tar.gz -> /home/python/temp/test.tar.gz

[localhost] local: md5sum /home/python/test/test.tar.gz

[192.168.139.141] run: md5sum /home/python/temp/test.tar.gz

[192.168.139.141] out: d5e8f717b176270f4c1a4fa72493239a /home/python/temp/test.tar.gz

[192.168.139.141] out:

d5e8f717b176270f4c1a4fa72493239a

d5e8f717b176270f4c1a4fa72493239a

上传成功

[192.168.139.141] run: tar zxvf test.tar.gz

[192.168.139.141] out: test.py

[192.168.139.141] out:

[192.168.139.141] run: python3 test.py

[192.168.139.141] out: ===========

[192.168.139.141] out: hello world

[192.168.139.141] out: ===========

[192.168.139.141] out:

Done.

Disconnecting from 192.168.139.139... done.

Disconnecting from 192.168.139.141... done.

常用命令

常用参数

-l : 列出指定文件的任务函数名,只有使用了装饰器 @task 的才会列出

-H : 指定目标主机,多台主机用","号分割

-u:指定远程用户名

-f : 指定fab的任务文件,默认的任务文件名是fabfile.py,即文件直接命名 fabfile.py ,可以不用 -f 指定文件

-t:设置超时时间,单位秒

-V:查看版本

API

@task : 函数装饰器,装饰的函数fab才能调用

@runs_once : 函数装饰器,装饰的函数只执行一次

local : 执行本地命令,例:local('ls -la')

run : 执行远程命令,例:run('ls -la')

lcd : 切换本地目录,例:lcd('/home/python')

cd : 切换远程目录,例:cd('/home/python')

put : 上传本地文件到远程主机,例:put('test', '/home/python/')

get : 从远程主机下载文件到本地,例:get('/home/python/test', './')

reboot : 重启远程主机,例:reboot()

sudo : sudo执行远程命令,例:sudo('service nginx start')

主机设置

env.host : 设置目标主机

env.user : 设置用户名

env.port : 设置目标主机端口,默认是22

env.password : 设置密码

env.passwords : 设置多台主机不同的密码。



推荐阅读
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • PHP连接MySQL的2种方法小结以及防止乱码【PHP】
    后端开发|php教程PHP,MySQL,乱码后端开发-php教程PHP的MySQL配置报错信息:ClassmysqlinotfoundinAnswer:1.在confphp.ini ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • AFNetwork框架(零)使用NSURLSession进行网络请求
    本文介绍了AFNetwork框架中使用NSURLSession进行网络请求的方法,包括NSURLSession的配置、请求的创建和执行等步骤。同时还介绍了NSURLSessionDelegate和NSURLSessionConfiguration的相关内容。通过本文可以了解到AFNetwork框架中使用NSURLSession进行网络请求的基本流程和注意事项。 ... [详细]
  • mysqldinitializeconsole失败_mysql03误删除了所有用户解决办法
    误删除了所有用户解决办法第一种方法(企业常用)1.将数据库down掉[rootdb03mysql]#etcinit.dmysqldstopShuttingdownMySQL..SU ... [详细]
  • Yii framwork 应用小窍门
    Yiiframework应用小窍门1.YiiFramework]如何获取当前controller的名称?下面语句就可以获取当前控制器的名称了!Php代码 ... [详细]
  • Java大文件HTTP断点续传到服务器该怎么做?
    最近由于笔者所在的研发集团产品需要,需要支持高性能的大文件http上传,并且要求支持http断点续传。这里在简要归纳一下,方便记忆 ... [详细]
author-avatar
十分风格的功夫_723
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有