如何通过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 获取本机ip地址的两个方法
Feb 25 Python
使用Python中的greenlet包实现并发编程的入门教程
Apr 16 Python
Python使用smtp和pop简单收发邮件完整实例
Jan 09 Python
Python使用matplotlib实现绘制自定义图形功能示例
Jan 18 Python
Python简单生成随机数的方法示例
Mar 31 Python
PyQt5每天必学之事件与信号
Apr 20 Python
Python学习笔记之lambda表达式用法详解
Aug 08 Python
python爬虫 Pyppeteer使用方法解析
Sep 28 Python
pytorch中torch.max和Tensor.view函数用法详解
Jan 03 Python
pytorch中index_select()的用法详解
Jan 06 Python
Python爬虫之爬取哔哩哔哩热门视频排行榜
Apr 28 Python
Python matplotlib多个子图绘制整合
Apr 13 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
php dirname(__FILE__) 获取当前文件的绝对路径
2011/06/28 PHP
Trying to clone an uncloneable object of class Imagic的解决方法
2012/01/11 PHP
php函数array_merge用法一例(合并同类数组)
2013/02/03 PHP
Laravel 5.0 发布 新版本特性详解
2015/02/10 PHP
asp.net和asp下ACCESS的参数化查询
2008/06/11 Javascript
JavaScript EasyPager 分页函数
2011/05/25 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
readonly和disabled属性的区别
2015/07/26 Javascript
AngularJS ng-template寄宿方式用法分析
2016/11/07 Javascript
jQuery插件zTree实现删除树节点的方法示例
2017/03/08 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
vue中实现在外部调用methods的方法(推荐)
2018/02/08 Javascript
js神秘的电报密码 哈弗曼编码实现
2019/09/10 Javascript
layui自定义工具栏的方法
2019/09/19 Javascript
vue实现浏览器全屏展示功能
2019/11/27 Javascript
JavaScript获取时区实现过程解析
2020/09/24 Javascript
python中列表元素连接方法join用法实例
2015/04/07 Python
简单易懂的python环境安装教程
2017/07/13 Python
Python使用smtp和pop简单收发邮件完整实例
2018/01/09 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
基于python实现查询ip地址来源
2020/06/02 Python
基于Keras 循环训练模型跑数据时内存泄漏的解决方式
2020/06/11 Python
Python装饰器结合递归原理解析
2020/07/02 Python
使用jupyter notebook运行python和R的步骤
2020/08/13 Python
英国时尚服饰电商:Boohoo
2017/10/12 全球购物
Lookfantastic意大利官网:英国知名美妆购物网站
2019/05/31 全球购物
物业管理专业个人的自我评价
2013/11/19 职场文书
打造高效课堂实施方案
2014/03/22 职场文书
教师评语大全
2014/04/28 职场文书
小学生三分钟演讲稿
2014/08/18 职场文书
预备党员思想汇报1000字
2014/10/07 职场文书
医院护士工作检讨书
2014/10/26 职场文书
高考升学宴答谢词
2015/01/20 职场文书
2016学习依法治国心得体会
2016/01/15 职场文书
.Net Core导入千万级数据至Mysql的步骤
2021/05/24 MySQL
pytest实现多进程与多线程运行超好用的插件
2022/07/15 Python