Python Fabric模块详解
Python Fabric模块详解
什么是Fabric?
简单介绍一下:
Fabric是一个Python的库和命令行工具,用来提高基于SSH的应用部署和系统管理效率。
再具体点介绍一下,Fabric是:
- 一个让你通过命令行执行无参数Python函数的工具
- 一个让通过 SSH 执行 Shell 命令更加 容易 、 更符合 Python 风格 的命令库(建立于一个更低层次的库)。
Fabric的安装
作为一个python的库,那简单粗暴中略带着些许优雅的pip
一定是首选了。
python2推荐安装方法:
pip install fabric
如果是python3,相对应的库是fabric3。
python3推荐安装方法:
pip3 install fabric3
这里要注意一下,在同一个环境中,安装fabric3之前,需要先卸载fabric。
fabric是一个特殊的模块,不仅仅是一个python库,还是一个命令行工具,所以我们可以在命令行直接使用fab
命令来调用。譬如:
通过help对fab命令进行了解:
fab -h
查看版本信息:
fab -V
简单示例:迈出第一步
接下来做个最简单的示例示范一下吧
- 当前目录新建一个fabfile.py文件
- 写入一个最简单的函数
- 在命令行使用fab调用该函数
[root@mycomputer test]# ls
fabfile.py
[root@mycomputer test]# cat fabfile.py
def hello():
print("Hello fab !!!")
[root@mycomputer test]# fab hello
Hello fab !!!
Done.
当你使用fab
命令时,fabric模块会自动默认寻找当前路径下的fabfile.py文件
当然,fabfile.py只是一个默认选项,如果你想指定其他的文件,可以通过 fab -f xx.py
来指定。
常用参数
-l 显示定义好的任务函数名
-f 指定fab入口文件,默认入口文件名为fabfile.py.. 即指定fabfile文件
-g 指定网关(中转)设备,即HOST逗号分隔要操作的主机, 比如堡垒机环境,填写堡垒机IP即可.
-H 指定目标主机,多台主机用‘,’号分隔
-p 远程账号的密码,fab执行时默认使用root账户
-P 以异步并行方式运行多主机任务,默认为串行运行
-R 指定role(角色),以角色名区分不同业务组设备
-t 设置设备连接超时时间(秒)
-T 设置远程主机命令执行超时时间(秒)
-w 当命令执行失败,发出警告,而非默认中止任务。
其他参数:
--``set``=KEY=VALUE,... 逗号分隔,设置环境变量
--shortlist 简短打印可用命令
-c PATH 指定本地配置文件
-D 不加载用户known_hosts文件
-i PATH 指定私钥文件
-k 不加载来自~/.``ssh``下的私钥文件
--port=PORT 指定SSH连接端口
-R ROLES 根据角色操作,逗号分隔
-s SHELL 指定新shell,默认是``'/bin/bash -l -c'
--show=LEVELS 以逗号分隔的输出
--``ssh``-config-path=PATH SSH配置文件路径
-T N 设置远程命令超时时间,单位秒
-u USER 连接远程主机用户名
-x HOSTS 以逗号分隔排除主机
-z INT 并发进程数
常用的API
- local ——执行本地命令
- lcd——切换本地目录
- cd——切换远程目录
- run——执行远程命令
- sudo——以sudo权限执行远程命令
- put——上传本地文件到远程主机
- get——从远程主机下载文件到本地
- prompt——获取用户输入信息
- confirm——获取提示信息确认
- reboot——重启远程主机, reboot()
- @task——装饰器,装饰的函数为fab可以调用的
- @runs_once——装饰器,标识的函数只会执行一次
fabric全局属性设定
-
env.exclude_hosts——排除指定主机,同样以列表表示
-
env.port——定义目标主机端口,默认22
-
env.user——定义用户名
-
env.password——定义密码
-
env.passwords——与上一致,但是区别不同主机不同配置的应用情景。例如:
env.passwords = {'root@x.x.x.x:22' : '1234','root@x.x.x.x:22' : '5678'}
-
env.getway——定义网关
-
env.deploy_release_dir——自定义全局变量
-
env.roledefs——定义角色分组
fabric装饰器
@hosts
指定被装饰的函数执行在哪台主机或哪些主机列表上。
hosts 接受host的参数列表 @hosts('h1','h2'),或者一个可迭代对象 @hosts(['h1', 'h2'])。
h1可以是一个IP,也可以是user@host
这个装饰器是设置函数的.hosts
属性,在执行函数之前读取。
@paralle
fabric.decorators.parallel
强制被装饰的函数并行执行,而非同步执行。
优先级:高于全局变量env.parallel
,高于装饰器@serial
@roles
定义(服务器)“角色”名,然后用于寻找对应的主机列表
env.roledefs.update({
'webserver': ['www1', 'www2'],
'dbserver': ['db1']
})
@roles('webserver', 'dbserver')
def my_func():
pass
roles接受参数列表,或单个的可迭代对象作为参数
不考虑控制台参数覆盖的话,my_func
将会在 webserver
和 dbserver
角色对应的主机列表上执行。
@runs_once
组织函数多次执行的装饰器。
通过保存内部状态,使用该装饰器可以保证函数在每个Python解释器中只运行一次。任何被该装饰器装饰的函数在第二次,第三次.....第n次执行时都会静默失败,并返回初次运行的结果。
runs_once 无法和任务并行执行同时生效。
@serial
强制被装饰的函数顺序执行,不并行执行。
该装饰器效果的优先级高于全局变量env.parallel
若同时被 serial 和 parallel 装饰器装饰,parallel 优先级更高。
判断模块:
>>> from fabric.contrib.console import confirm
>>> content = confirm("continue[Y/N]?")
continue[Y/N]? [Y/n] y
>>> content
True
>>> content = confirm("continue[Y/N]?")
continue[Y/N]? [Y/n] n
>>> content
False
颜色模块:
>>> from fabric.colors import *
>>> print(red('hello fab !!!'))
hello fab !!!
>>> print(blue('hello fab !!!'))
hello fab !!!
>>> print(cyan('hello fab !!!'))
hello fab !!!
>>> print(white('hello fab !!!'))
hello fab !!!
>>> print(magenta('hello fab !!!'))
hello fab !!!
>>> print(green('hello fab !!!'))
hello fab !!!
>>> print(yellow('hello fab !!!'))
hello fab !!!
具体颜色效果大家可以自己试一下子。
好了,以上是fabric较常用部分,大家如需了解更多,可以点击下方链接,前往官方文档: