远程部署工具Fabric详解(支持Python3)


Posted in Python onJuly 04, 2019

前言

如果你搜一圈 "Fabric "关键字,你会发现 90% 的资料都是过时的,因为现在 Fabric 支持 Python3,但是它又不兼容旧版 Fabric。所以,如果你按照那些教程去操作的话根本跑不通。

如果你还没用过 Fabric,那么这篇文章就是帮你快速上手 Fabric 的。不管你现在用不用,先了解了以后也用得着。

平时我们的开发流程是这样,经过几个月奋战,项目终于开发完了,测试也没问题了,我们就把代码提交到 GitHub 那样的托管平台,准备部署到正式环境。你小心翼翼地登录到正式服务器,进入到项目目录中,把代码从远程仓库拉下来,然后启动程序。后面每次有新功能发布或者哪怕只是修改了一个小小的 Bug 时,你都要执行重复的操作,登录服务器,切换到指定目录,拉取代码,重启服务。

其实这种操作非常繁琐,也没什么技术含量,还容易出问题,于是 Fabric 出场了。Fabric 是一个远程部署神器,它可以在本地执行远程服务器的命令。

怎么做?很简单,就几个步骤。

安装 Fabric

$ pip install fabric --upgrade

注意,如果你安装的是旧版的 Fabric,那么新版的 Fabric 是不兼容旧版的,目前 Fabric 有三个版本,Fabric1 就是以前的 Fabric,只支持 Python2,已不推荐使用,而 Fabric2 就是现在的 Fabric,同时支持 Python2 和 Python3, 也是官方强烈推荐的版本, 还有一个 Fabric3,这是网友从旧版的 Fabric1 克隆过来的非官方版本,但是兼容 Fabric1,也支持 Python2 和 Python3。

最新的 Fabric 不需要 fabfile.py 文件, 也不需要 fab 命令,而现在网络上几乎所有的教程、资料都还是基于 fabric1 写的,当你在看那些教程的时候,注意甄别。 而新版 Fabric 提供的 API 非常简单。

运行命令

先看个例子,下面是一段部署脚本

# deploy.py
# 1. 创建一个远程连接
# 2. 进入指定目录
# 3. 在指定目录下面执行重启命令

from fabric import Connection

def main():
  # ip 我是随便填的
  # 如果你的电脑配了ssh免密码登录,就不需要 connect_kwargs 来指定密码了。
  c = Connection("root@232.231.231.22", connect_kwargs={"password": "youpassword"})

  with c.cd('/var/www/youproject'):
    c.run("git pull origin master")
    c.run("/usr/bin/supervisorctl -c ../supervisor/supervisord.conf restart youproject")

if __name__ == '__main__':
  main()

执行

python deploy.py

执行完成后,最新代码就已经部署到正式环境并重启了服务,是不是非常方便,妈妈再也不要担心我在正式环境敲错命令删数据库跑路了。

Fabric 不仅支持 Linux,而且在 Windows 平台也能很好的运行,在中小型项目,它是非常不错的运维工具,有了 Frabic ,管理上百台服务器都不成问题。

构建连接

class Connection(Context):
  host = None
  user = None
  port = None
  ssh_config = None
  connect_timeout = None
  connect_kwargs = None
  ...

构建 Connection 对象的方式有不同的方式,例如你可以将 host 写成 "root@192.168.101.1:22" ,也可以作为3个参数分开写。而 connect_kwargs 是字典对象,通常填服务器的登录密码或者密钥。

上传文件
run 方法用于执行命令,cd 进入指定目录,put 方法用于上传文件, 例如:

from fabric import Connection
c = Connection('web1')
c.put('myfiles.tgz', '/opt/mydata')
c.run('tar -C /opt/mydata -xzvf /opt/mydata/myfiles.tgz')

多台服务器

如果是要在多台服务器运行命令,简单的办法就是使用迭代,挨个服务器执行命令:

# web1,web2,mac1 都是服务器的名字,你也可以用ip代替
>>> from fabric import Connection
>>> for host in ('web1', 'web2', 'mac1'):
>>>   result = Connection(host).run('uname -s')
...   print("{}: {}".format(host, result.stdout.strip()))
...
web1: Linux
web2: Linux
mac1: Darwin

或者使用 SerialGroup

from fabric import SerialGroup as Group
pool = Group('web1', 'web2', 'web3', connect_kwargs={"password": "youpassword"} )
pool.put('myfiles.tgz', '/opt/mydata')
pool.run('tar -C /opt/mydata -xzvf /opt/mydata/myfiles.tgz')

Group(*hosts, **kwargs) 参数说明:

  • *hosts: 可以传入多个主机名或IP
  • **kwargs 接收的参数可以和Connection一样,可以指定密码

本文完,你 get 了吗?

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

Python 相关文章推荐
Python Sleep休眠函数使用简单实例
Feb 02 Python
Django中利用filter与simple_tag为前端自定义函数的实现方法
Jun 15 Python
python将每个单词按空格分开并保存到文件中
Mar 19 Python
python try except 捕获所有异常的实例
Oct 18 Python
使用python对文件中的数值进行累加的实例
Nov 28 Python
python3模拟实现xshell远程执行liunx命令的方法
Jul 12 Python
Python shutil模块用法实例分析
Oct 02 Python
django实现将修改好的新模型写入数据库
Mar 31 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
Jun 10 Python
Python连接Impala实现步骤解析
Aug 04 Python
python爬虫爬取淘宝商品比价(附淘宝反爬虫机制解决小办法)
Dec 03 Python
Python绘制地图神器folium的新人入门指南
May 23 Python
Python之修改图片像素值的方法
Jul 03 #Python
在python中,使用scatter绘制散点图的实例
Jul 03 #Python
python opencv 二值化 计算白色像素点的实例
Jul 03 #Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
Jul 03 #Python
python画图--输出指定像素点的颜色值方法
Jul 03 #Python
基于python的Paxos算法实现
Jul 03 #Python
python区块及区块链的开发详解
Jul 03 #Python
You might like
自制汽车收音机天线:收听广播的技巧和方法
2021/03/02 无线电
sony ICF-2010 拆解与改装
2021/03/02 无线电
如何在WIN2K下安装PHP4.04
2006/10/09 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
2012/01/12 PHP
php使用str_replace实现输入框回车替换br的方法
2014/11/24 PHP
php禁止某ip或ip地址段访问的方法
2015/02/25 PHP
Yii2创建控制器(createController)方法详解
2016/07/23 PHP
js利用与或运算符优先级实现if else条件判断表达式
2010/04/15 Javascript
一些主流JS框架中DOMReady事件的实现小结
2011/02/12 Javascript
javaScript 删除字符串空格多种方法小结
2012/10/24 Javascript
分享Javascript中最常用的55个经典小技巧
2013/11/29 Javascript
JavaScript实现动画打开半透明提示层的方法
2015/04/21 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
Jquery针对tr td的一些实用操作方法(必看篇)
2016/10/05 Javascript
JS实现重新加载当前页面
2016/11/29 Javascript
Windows下快速搭建NodeJS本地服务器的步骤
2017/08/09 NodeJs
Vue-Access-Control 前端用户权限控制解决方案
2017/12/01 Javascript
JavaScript Window浏览器对象模型原理解析
2020/05/30 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
2020/09/10 Javascript
python3实现ftp服务功能(服务端 For Linux)
2017/03/24 Python
简单的python后台管理程序
2017/04/13 Python
详解django实现自定义manage命令的扩展
2019/08/13 Python
在Python中等距取出一个数组其中n个数的实现方式
2019/11/27 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
2020/05/27 Python
Python爬虫+Tkinter制作一个翻译软件的示例
2021/02/20 Python
在css3中background-clip属性与background-origin属性的用法介绍
2012/11/13 HTML / CSS
CSS3中currentColor关键字的妙用
2016/02/27 HTML / CSS
英国在线珠宝店:The Jewel Hut
2017/03/20 全球购物
UNIX文件系统分类
2014/11/11 面试题
城管综合整治方案
2014/05/01 职场文书
八年级英语教学计划
2015/01/23 职场文书
大连星海广场导游词
2015/02/10 职场文书
证券区域经理岗位职责
2015/04/10 职场文书
开业庆典嘉宾致辞
2015/08/01 职场文书
Python中seaborn库之countplot的数据可视化使用
2021/06/11 Python
AngularJS实现多级下拉框
2022/03/25 Javascript