最近打算使用Python实现linux自动化执行Shell命令,于是研究了一下Facbic库,Fabric是一个Python的库,提供了丰富的同SSH交互的接口,可以用来在本地或远程机器上自动化、流水化地执行Shell命令。非常适合用来做应用的远程部署及系统维护。简单易用,只需懂得基本的Shell命令。
fabric帮助网站
目前,从PyPI可以搜索到主要的fabric库为“ Fabric 2.5.0 ”、“ fabric3 3.1.14 ”和“ Fabric2 2.5.0 ”。
- Fabric:官方Fabric,兼容 Python 2 & Python 3,但不兼容Fabric 1.x的fabfile;
- Fabric2: 与Fabric相同,仅作为平滑迁移(使用Fabric包安装1.x 版本,使用Fabric2包安装2.x版本,来实现1.x和2.x的共存);
- Fabric3:是一个基于Fabric 1.x 的fork,兼容Python2 & Python3,兼容 Fabric1.x 的 fabfile;
从pypi网站可以搜索到最新的fabric版本
Fabric 1.x 与2.x版本的主要区别:
- Fabric 1.x只支持Python2.5-2.7,而Fabric2支持Python (2.7, 3.4+);
- Fabric 2.x是重写Fabric 1.x的版本,不再兼容1.x 版本的fabfile,而且有些模块和用法也发生了很大改变;
问题处理
1 - 导入fabric.api提示报错“No module named api”
1 >>> from fabric.api import run2Traceback (most recent call last):3 File "", line 1, in 4ImportError: No module named api5 >>>
处理方法:
确认fabric版本信息,“from fabric.api import run”的方式只适用fabric1.x版本。
2 - 运行fabric示例提示报错“No idea what 'hello' is!”
1$ cat fabfile.py 2# coding:utf-8 3 4 5def hello(): 6print("hello fabric!") 7 8$ fab hello 9 No idea what 'hello'is!1011 $ fab --list12 No tasks found in collection 'fabfile'!
处理方法:
确认fabric版本信息,fabric2.x版本不兼容Fabric 1.x的fabfile。遵照fabric 2.x要求,更改fabfile文件内容格式,重新运行即可。
具体信息可查看:http://docs.fabfile.org/en/2.1/getting-started.html#addendum-the-fab-command-line-tool
下面是我在centos7下面安装Python2.7+Fabric。
fabric的脚本目录fabfile.py为脚本,fab.conf是我定义的主机列表