如何高效地远程部署?自动化运维利器 Fabric 教程

关于 Python 自动化的话题,在上一篇文章中,我介绍了 Invoke 库,它是 Fabric 的最重要组件之一。Fabric 也是一个被广泛应用的自动化工具库,是不得不提的自动化运维利器,所以,本文将来介绍一下它。

Fabric 主要用在应用部署与系统管理等任务的自动化,简单轻量级,提供有丰富的 SSH 扩展接口。在 Fabric 1.x 版本中,它混杂了本地及远程两类功能;但自 Fabric 2.x 版本起,它分离出了独立的 Invoke 库,来处理本地的自动化任务,而 Fabric 则聚焦于远程与网络层面的任务。

为了做到这点,Fabric 主要依赖另一大核心组件 Paramiko,它是基于 SSH 协议的远程控制模块,Fabric 在其基础上封装出了更加友好的接口,可以远程执行 Shell 命令、传输文件、批量操作服务器、身份认证、多种配置与设置代理,等等。

一、Fabric 的版本区分
Python 2 版本已经被官宣在今年元旦“退休”了,未来只会是 Python 3 的舞台。为了适应 Python 版本的非兼容性迁移,很多项目也必须推出自己的新版本(兼容或只支持 Python 3),其中就包括本文的主角 Fabric。

Fabric 自身存在着 2 个大版本:Fabric 1 和 Fabric 2,而在这个库的基础上,还有两个很容易混淆的相关库:Fabric2 和 Fabric3(注意这里的数字是库名的一部分)。

它们的区分如下:

Fabric 1.x:支持 Python 2.5-2.7,但不支持 Python 3
Fabric 2.x:支持 Python 2.7 与 3.4+,但不兼容 Fabric 1.x 的 fabfile
Fabric2:等同于 Fabric 2.x,为了使不同版本共存(装一个 1.x 旧版本,再装它作为新版本)
Fabric3:一个基于 Fabric 1.x 的 fork(非官方),兼容 Python 2&3,兼容 Fabric1.x 的 fabfile
综上可见,我们推荐使用官方的 Fabric 2.x 系列版本,但同时要注意,某些过时的教程可能是基于早期版本的(或非官方的 Fabric3,也是基于 Fabric 1.x),需要注意识别。

例如,在 Fabric 1.x 系列中这么写导入:from fabric.api import run;在新版本中将报错:“ImportError: No module named api”(PS:可根据是否有 fabric.api 来判断 Fabric 的版本,就像在 Python 中根据 print 语句或 print 函数来判断版本一样)。同时,由于新版本不支持老版本的 fabfile,在使用时就可能报错:“No idea what 'xxx' is!”

Fabric 2 是非兼容性版本,相比于前个版本,它主要改进的点有:

支持 Python 2.7 与 3.4+
线程安全,取消了多进程的并发实现
API 围绕 fabric.connection.Connection 进行了重组
全面修改了命令行解析器,允许在每个任务的基础上使用规则的 GNU/POSIX 风格的标志和选项(不再需要 fab mytask:weird = custom,arg = format)
可以声明前置任务与后置任务
……(官方列了10几条 [1],本文不一一罗列)
之前介绍过的 invoke,就是在开发 Fabric 2 时被分离出来的,具体的原因可参见这个回答 [2]。总而言之,在使用 Fabric 时,应该注意版本差异的问题。

二、Fabric 的基本用法
1、安装
首先是安装:pip intall fabric ,安装后,可在命令行窗口查看版本信息:

>>> fab -V
Fabric 2.5.0
Paramiko 2.7.1
Invoke 1.4.0
执行“fab -V”,以上结果可看出我安装的是 Fabric 2.5.0 版本,同时可看到它的两个核心依赖库 Paramiko 及 Invoke 的版本信息。

2、一个简单的例子
Fabric 主要用于远程任务,即要对远程服务器进行操作,下面是一个简单的例子:

# 可使用任意的文件名
from fabric import Connection

host_ip = '47.xx.xx.xx'  # 服务器地址
user_name = 'root' # 服务器用户名
password = '****'  # 服务器密码
cmd = 'date'  # shell 命令,查询服务器上的时间

con = Connection(host_ip, user_name, connect_kwargs={'password': password})
result = con.run(cmd, hide=True)

print(result)
以上代码,通过账号+密码登录到远程服务器,然后执行date命令,查看服务器的时间,执行结果:

Command exited with status 0.
=== stdout ===
Fri Feb 14 15:33:05 CST 2020

(no stderr)
现在打印的结果中,除了服务器时间,还有一些无关的信息。这是因为它打印的“result”是一个"fabric.runners.Result"类,我们可以把其中的信息解析出来

groups.tianya.cn/post-5311-f3fc8754ed0140be9531816826dde718-1.shtml
groups.tianya.cn/post-5311-acf068b966314398abe76a3598b308f6-1.shtml
groups.tianya.cn/post-5311-9c6af9c9a2754122aacdd2a762467323-1.shtml
groups.tianya.cn/post-5311-0a2c1367cf9d4c0d9955fb99866f30b0-1.shtml
groups.tianya.cn/post-5311-7012c685fa3c4dc5b571fa7e14d79080-1.shtml
groups.tianya.cn/post-5311-eb2c5e661b7f46c9808081e3544b6f78-1.shtml
groups.tianya.cn/post-5311-a6d6fada86a34a3f935ff4d5b2c351b3-1.shtml
groups.tianya.cn/post-5311-3f123ac0e7014dfdaec926343d8ffc6d-1.shtml
groups.tianya.cn/post-5311-723933acd37146e7b5e46125ffdebdf3-1.shtml
groups.tianya.cn/post-5311-1f2a87cd27b54c048bdf5e3d140136d2-1.shtml
groups.tianya.cn/post-5311-409e236db58f400ebc521ff3d114504a-1.shtml
groups.tianya.cn/post-5311-b37b909c15944fab8c5fa99e963a9d87-1.shtml
groups.tianya.cn/post-5311-a28620d8c0f4487eb24889dc4e5bfe77-1.shtml
groups.tianya.cn/post-5311-fdc61188fb4b41b78090ebebd87bd856-1.shtml
groups.tianya.cn/post-5311-3395911f8a99448ca4388975e3df1079-1.shtml
groups.tianya.cn/post-5311-f6bc803a97c94f9da9b2ba015f281fa7-1.shtml
groups.tianya.cn/post-5311-fe18cf44c1984503a87bb7694e5c3ee4-1.shtml
groups.tianya.cn/post-5311-f17dbbd754be47aab8bd9e053e59db8b-1.shtml
groups.tianya.cn/post-5311-de7989ead4744523aa3e68e21cab23a3-1.shtml
groups.tianya.cn/post-5311-2852da33f83348c88f0c5f71f918f1c3-1.shtml
groups.tianya.cn/post-5311-10c37913b2f440839e268b09a25fa094-1.shtml
groups.tianya.cn/post-5311-abe8883c27ce487e8ac8f48d42e01065-1.shtml
groups.tianya.cn/post-5311-b1adbb0ff2ce4bdbb35a6388607832e7-1.shtml
groups.tianya.cn/post-5311-61bee67dfa764a5e834498eee1936c37-1.shtml
groups.tianya.cn/post-5311-4e67686110754f5c8da2546c8b0abfc9-1.shtml
groups.tianya.cn/post-5311-8008d41fbb894275ab8d06ee5655aca7-1.shtml
groups.tianya.cn/post-5311-e05bbca7ef7f449bbc984b50c7a5301d-1.shtml
groups.tianya.cn/post-5311-c429807f103f41ef9e3e0a963d746760-1.shtml
groups.tianya.cn/post-5311-baa46d0e707748f9abf1c087f651b2b0-1.shtml
 

上一篇:Hyperledger Fabric教程(13)-- 集成CouchDB作为状态数据库


下一篇:Fabric-CA1.0模块的搭建与使用