fabric可谓部署神器,在小规模集群环境部署方面简直就是屠龙刀
的存在
简介
- fabric目前存在两个版本,分别对应python2和python3
- 本文主要介绍fabric两个版本的常用方法
fabric(python2)
安装(python2环境)
1 | pip install fabric |
若要实现ssh跳转,需另外安装fexpect
1 | pip install fexpect |
fabric2的API对应部署的对象定义比较明了
- env(定义部署主机的ip,密码,节点属性,全局变量等)
1 | def dev(): |
- roles
1 |
|
- run
执行shell指令
- hide, settings
配合使用,隐藏输出内容等
1 | with settings(hide("warnings", "running", "stdout", "stderr"), warn_only=True): |
- cd,sudo
同shell指令
- execute
在本地任务中执行其他任务函数,提高代码复用率
- shell_env
设置环境变量
1 | with shell_env(ASSET_CONFIG=ASSET_CONFIG, TAG=tag): |
- 配合fexpect使用
贴了段之前用过的代码,可用于修饰任务函数
1 | def env_init(f): |
fabric(python3)
安装(python3环境)
1 | pip install fabric |
fabirc3的API相较而言显的抽象简单
- Connection 作为连接通道抽象
1 | # 连接本地 |
- task 定义任务
1 |
|
通过fab deploy
执行该任务,值得注意的是ctx这个变量必须要写
指定传参fab start-server --jar-timestamp=20191203-1637 debug=True
(让人琢磨尝试了半天)
- 其他注意点
对task任务函数使用装饰器,需要注意ctx的传入
1 | def timeit(start_msg=None, end_msg=None): |
然而遗憾的是,在自定义装饰器的修饰下,再使用命令行传参将失效
1 | # 此时debug的将无法被解析 |
究其原因,是invoke中使用的python2的inspect.getargspec,而python3中删除了对应函数,并且six对此并未兼容,从而导致参数解析失败
1 | def argspec(self, body): |
总结
- 综上,可以看出fabric3较fabric2而言基本是完败,使用过fabric2再迁移到fabric3是格外的别扭,由此不难理解网上对fabric3对使用教程基本上寥寥无几,即便存在大部分也只是对官网用例的简单翻译,谈不上工业级的使用
- fabric3是面向程序编程而非面向human编程
- 无奈于python2终将被淘汰,还是对fabric3保留一些些期待吧