如何通过python的fabric包完成代码上传部署


Posted in Python onJuly 29, 2019

首先是安装fabric包

pip install fabric

fabric常用参数

-l : 显示定义好的任务函数名

-f : 指定fab入口文件,默认入口文件名为fabfile.py

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

fabric常用API

local : 执行本地命令,如:local('uname -s')

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

cd : 切换远程目录,如:cd('/etc')

run : 执行远程命令,如:run('free -m')

sudo : sudo方式执行远程命令,如:sudo('touch /abc')

put : 上传本地文件到远程主机,如:put('/hello', '/home/baagee/hello')

get : 从远程主机下载文件到本地,如:get('/home/python/world', '/home/baagee/world')

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

@task : 函数装饰器,标识的函数为fab可调用的,非标记的对fab不可见,纯业务逻辑

@runs_once : 函数装饰器,标识的函数只会执行一次,不受多台主机影响

fabric全局属性设定

env.hosts : 定义目标主机,如:env.hosts=['192.168.117.192', '192.168.117.193']

env.user : 定义用户名,如:env.user="root"

env.port : 定义目标主机端口,默认为22,如:env.port="22"

env.password : 定义密码,如:env.password="lijin"

env.passwords : 不同的主机不同的密码,如:env.passwords={'baagee@192.168.117.192:22':'lovelijin', 'lijin@192.168.117.193:22':'lovebaagee'}

简单入门示例

from fabric.api import run

def host_type():
  run('uname -s')

执行的话就不能用python fabfile.py执行了要使用:fab -f fabfile.py host_type -H baagee@192.168.117.136

意思就是-f指定文件,后面跟要执行的函数,-H指明登录用户名和host,

[root@localhost pythontest]# fab -f fabfile.py host_type -H baagee@192.168.117.136
[baagee@192.168.117.136] Executing task 'host_type'
[baagee@192.168.117.136] run: uname -s
[baagee@192.168.117.136] Login password for 'baagee':
[baagee@192.168.117.136] out: Linux
[baagee@192.168.117.136] out:


Done.
Disconnecting from baagee@192.168.117.136... done.
[root@localhost pythontest]

示例1:动态获取远程目录列表

首先写个小例子熟悉一下这东西到底要怎么用:

from fabric.api import *

env.hosts=['192.168.117.136']
env.user='baagee'
env.password = 'ubuntu@2017'

@runs_once
def input_raw():
  return prompt("please input directory name:", default="/home")

def workask(dirname):
  run('ls -l ' + dirname)

@task
def go():
  print('start ...')
  getdirname = input_raw()
  workask(getdirname)
  print('end ...')

go函数是入口函数,首先获取用户输入的路径,然后ls它,显示里面的文件就是这么简单。

执行结果显示:

[root@localhost pythontest]# fab -f test3.py go
[192.168.117.136] Executing task 'go'
start ...
please input directory name: [/home] /home/baagee/baagee-blog
[192.168.117.136] run: ls -l /home/baagee/baagee-blog
[192.168.117.136] out: 总用量 24
[192.168.117.136] out: -rw-rw-r-- 1 baagee baagee  0 8月 22 15:05 abcd
[192.168.117.136] out: drwxrwxr-x 6 baagee baagee 4096 8月  3 10:37 Application
[192.168.117.136] out: drwxrwxr-x 2 baagee baagee 4096 8月  3 10:37 DB_back
[192.168.117.136] out: -rw-rw-r-- 1 baagee baagee 1009 8月  3 10:37 index.php
[192.168.117.136] out: drwxrwxr-x 3 baagee baagee 4096 8月  3 10:37 Public
[192.168.117.136] out: -rw-rw-r-- 1 baagee baagee  97 8月  3 10:37 README.md
[192.168.117.136] out: drwxrwxr-x 8 baagee baagee 4096 8月  3 10:37 ThinkPHP
[192.168.117.136] out:

end ...

Done.
Disconnecting from 192.168.117.136... done.

熟悉了之后接下来就是写一个小程序将本地某个文件夹的代码上传到执行服务器,然后执行它;

示例2:上传文件并执行

首先写个小代码:(demo.py)

#coding:utf-8
def add(a,b):
  print('开始计算a+b')
  print(a+b)

add(9,1)

将本机centos7上的demo.py上传到ubuntu上并执行:

#coding:utf-8
from fabric.api import *

env.user = 'baagee'
env.hosts = ['192.168.117.136']
env.password = 'ubuntu@2017'

@task
@runs_once
def tar_task():
  #进入本地目录
  with lcd('/home/vagrant/windowshare/pythontest'):
    #打包
    local('tar zcvf demo.tar.gz demo.py')

@task
def put_task():
  #创建远程服务器文件夹
  run('mkdir -p /home/baagee/testdemo')
  with cd('/home/baagee/testdemo'):
    #上传文件
    put('/home/vagrant/windowshare/pythontest/demo.tar.gz', '/home/baagee/testdemo/demo.tar.gz')

@task
def check_task():
  #md5验证文件
  lmd5 = local('md5sum /home/vagrant/windowshare/pythontest/demo.tar.gz', capture=True).split(' ')[0]
  rmd5 = run('md5sum /home/baagee/testdemo/demo.tar.gz').split(' ')[0]
  if lmd5 == rmd5:
    print('md5 OK ...')
  else:
    print('md5 ERROR ...')

@task
def run_task():
  with cd('/home/baagee/testdemo'):
    run('tar zxvf demo.tar.gz')
    run('python demo.py')

@task
def go():
  tar_task()
  put_task()
  check_task()
  run_task()

步骤就是

1,找到demo.py打包,。2,上传,。3,验证文件md5。4,然后就是解压执行。

也很简单,当然你也可以一次性填写多个host,将他们同时上传到多台服务器上。

最后程序在我centos上执行的效果是:

[root@localhost pythontest]# fab -f upload1.py go
[192.168.117.136] Executing task 'go'
[localhost] local: tar zcvf demo.tar.gz demo.py
demo.py
[192.168.117.136] run: mkdir -p /home/baagee/testdemo
[192.168.117.136] put: /home/vagrant/windowshare/pythontest/demo.tar.gz -> /home/baagee/testdemo/demo.tar.gz
[localhost] local: md5sum /home/vagrant/windowshare/pythontest/demo.tar.gz
[192.168.117.136] run: md5sum /home/baagee/testdemo/demo.tar.gz
[192.168.117.136] out: 12b4bed255ad7afb6a53cc84bd7a25e7 /home/baagee/testdemo/demo.tar.gz
[192.168.117.136] out:

md5 OK ...
[192.168.117.136] run: tar zxvf demo.tar.gz
[192.168.117.136] out: demo.py
[192.168.117.136] out:

[192.168.117.136] run: python demo.py
[192.168.117.136] out: 开始计算a+b
[192.168.117.136] out: 10
[192.168.117.136] out:


Done.
Disconnecting from 192.168.117.136... done.

最后结合git完成代码部署:

需要服务器和本地都需要安装git

#coding:utf-8
from fabric.api import *
#这两台服务器用户名和密码都一样,所以就不用env.passwords了
env.user = 'baagee'
env.hosts = ['192.168.117.192', '192.168.117.193']
env.password = 'pythontestpass'

@runs_once
@task
def local_update():
	#本地代码上传到git
  with lcd("/home/baagee/tmp/baageehello"):
    local("git add -A")
    local("git commit -m 'update'")
    local("git pull origin master")
    local("git push origin master")


@task
def remote_update():
	#服务器将git上的代码拉下来
  with cd("/home/baagee/tmp/baageehello"):
    run("git checkout master")
    run("git pull origin master")

@task
def deploy():
	#本地上传
  local_update()
  #服务器下拉
  remote_update()

over。。。。。。。。。。。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python定时检查启动某个exe程序适合检测exe是否挂了
Jan 21 Python
浅谈python多线程和队列管理shell程序
Aug 04 Python
Python中在脚本中引用其他文件函数的实现方法
Jun 23 Python
python脚本爬取字体文件的实现方法
Apr 29 Python
Python登录注册验证功能实现
Jun 18 Python
Python学习笔记之lambda表达式用法详解
Aug 08 Python
Python中的单下划线和双下划线使用场景详解
Sep 09 Python
Python实现遗传算法(二进制编码)求函数最优值方式
Feb 11 Python
Python统计文本词汇出现次数的实例代码
Feb 27 Python
详解Python中如何将数据存储为json格式的文件
Nov 18 Python
python 进制转换 int、bin、oct、hex的原理
Jan 13 Python
Python入门之使用pandas分析excel数据
May 12 Python
Python八皇后问题解答过程详解
Jul 29 #Python
python 标准差计算的实现(std)
Jul 29 #Python
Python 二叉树的层序建立与三种遍历实现详解
Jul 29 #Python
Python完成哈夫曼树编码过程及原理详解
Jul 29 #Python
Python秒算24点实现及原理详解
Jul 29 #Python
django之状态保持-使用redis存储session的例子
Jul 28 #Python
django 通过URL访问上传的文件方法
Jul 28 #Python
You might like
thinkphp3.0 模板中函数的使用
2012/11/13 PHP
php缩放gif和png图透明背景变成黑色的解决方法
2014/10/14 PHP
thinkphp中ajax与php响应过程详解
2014/12/08 PHP
实例讲解PHP验证邮箱是否合格
2019/01/28 PHP
NodeJS的模块写法入门(实例代码)
2012/03/07 NodeJs
JavaScript表达式:URL 协议介绍
2013/03/10 Javascript
JS的事件绑定深入认识
2014/06/26 Javascript
js 实现省市区三级联动菜单效果
2017/02/20 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
微信小程序 滚动到某个位置添加class效果实现代码
2017/04/19 Javascript
Bootstrap datepicker日期选择器插件使用详解
2017/07/26 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
2018/12/26 Javascript
原生javascript实现连连看游戏
2019/01/03 Javascript
vue-cli webpack配置文件分析
2019/05/20 Javascript
微信小程序顶部导航栏可滑动并选中放大
2019/12/05 Javascript
详解JavaScript中分解数字的三种方法
2021/01/05 Javascript
python通过BF算法实现关键词匹配的方法
2015/03/13 Python
解决django后台样式丢失,css资源加载失败的问题
2019/06/11 Python
python 普通克里金(Kriging)法的实现
2019/12/19 Python
如何完美的建立一个python项目
2020/10/09 Python
如何用python 操作zookeeper
2020/12/28 Python
html5使用canvas实现弹幕功能示例
2017/09/11 HTML / CSS
澳大利亚最好的在线时尚精品店:Princess Polly
2018/01/03 全球购物
Holland & Barrett爱尔兰:英国领先的健康零售商
2019/03/31 全球购物
上班早退检讨书
2014/01/09 职场文书
管理失职检讨书
2014/02/12 职场文书
学习十八大报告感言
2014/02/28 职场文书
特教教师先进事迹
2014/05/21 职场文书
学校百日安全生产活动总结
2014/07/05 职场文书
关心下一代工作先进事迹
2014/08/15 职场文书
村安全生产责任书
2014/08/25 职场文书
什么是动态刷新率DRR? Windows11动态刷新率功能介绍
2021/11/21 数码科技
使用jpa之动态插入与修改(重写save)
2021/11/23 Java/Android
vue项目支付功能代码详解
2022/02/18 Vue.js
分享7个 Python 实战项目练习
2022/03/03 Python