如何通过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+tkinter模拟“记住我”自动登录实例代码
Jan 16 Python
python批量复制图片到另一个文件夹
Sep 17 Python
Python中利用aiohttp制作异步爬虫及简单应用
Nov 29 Python
django主动抛出403异常的方法详解
Jan 04 Python
使用Pandas将inf, nan转化成特定的值
Dec 19 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
Mar 05 Python
python zip,lambda,map函数代码实例
Apr 04 Python
Python实现发票自动校核微信机器人的方法
May 22 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
Oct 15 Python
Python txt文件如何转换成字典
Nov 03 Python
K近邻法(KNN)相关知识总结以及如何用python实现
Jan 28 Python
python实现图片转字符画
Feb 19 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
PL-880隐藏功能
2021/03/01 无线电
用Socket发送电子邮件
2006/10/09 PHP
用php+javascript实现二级级联菜单的制作
2008/05/06 PHP
PHP入门学习的几个不错的实例代码
2008/07/13 PHP
利用谷歌 Translate API制作自己的翻译脚本
2014/06/04 PHP
Ubuntu上安装yaf扩展的方法
2018/01/29 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
有趣的javascript数组定义方法
2010/09/10 Javascript
深入分析js的冒泡事件
2014/12/05 Javascript
js实现prototype扩展的方法(字符串,日期,数组扩展)
2016/01/14 Javascript
Bootstrap按钮组件详解
2016/04/26 Javascript
AngularJS 指令的交互详解及实例代码
2016/09/14 Javascript
详解React-Native解决键盘遮挡问题(Keyboard遮挡问题)
2017/07/13 Javascript
vue给input file绑定函数获取当前上传的对象完美实现方法
2017/12/15 Javascript
Angular实现的敏感文字自动过滤与提示功能示例
2017/12/29 Javascript
详解js类型判断
2018/05/22 Javascript
vue无限轮播插件代码实例
2019/05/10 Javascript
微信小程序中的video视频实现 自定义播放按钮、封面图、视频封面上文案
2020/01/02 Javascript
js与jquery获取input输入框中的值实例讲解
2020/02/27 jQuery
JavaScript Image对象实现原理实例解析
2020/08/26 Javascript
js实现简易计算器小功能
2020/11/18 Javascript
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
python Opencv将图片转为字符画
2021/02/19 Python
keras:model.compile损失函数的用法
2020/07/01 Python
python实现马丁策略回测3000只股票的实例代码
2021/01/22 Python
Darphin迪梵官网: 来自巴黎,植物和精油调制的护肤品牌
2016/10/11 全球购物
Shopping happy life西班牙:以最优惠的价格提供最好的时尚配饰
2020/03/13 全球购物
英国最大的在线照明商店:Litecraft
2020/08/31 全球购物
EJB的基本架构
2016/09/22 面试题
医学生个人求职信范文
2014/02/07 职场文书
仓库管理员岗位职责
2014/03/19 职场文书
生日宴会主持词
2014/03/20 职场文书
2014年社区个人工作总结
2014/12/02 职场文书
强烈推荐:小学生:暑假作息时间表(值得收藏)
2019/07/09 职场文书
Oracle用户管理及赋权
2022/04/24 Oracle
IIS服务器中设置HTTP重定向访问HTTPS
2022/04/29 Servers