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

简单示例:迈出第一步

接下来做个最简单的示例示范一下吧

  1. 当前目录新建一个fabfile.py文件
  2. 写入一个最简单的函数
  3. 在命令行使用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 将会在 webserverdbserver 角色对应的主机列表上执行。

@runs_once

组织函数多次执行的装饰器。

通过保存内部状态,使用该装饰器可以保证函数在每个Python解释器中只运行一次。任何被该装饰器装饰的函数在第二次,第三次.....第n次执行时都会静默失败,并返回初次运行的结果。

runs_once 无法和任务并行执行同时生效。

@serial

强制被装饰的函数顺序执行,不并行执行。

该装饰器效果的优先级高于全局变量env.parallel

若同时被 serialparallel 装饰器装饰,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较常用部分,大家如需了解更多,可以点击下方链接,前往官方文档:

Fabric 官方文档

Fabric 官方文档-中文版

posted @ 2019-10-09 15:52  君无颜  阅读(3073)  评论(0编辑  收藏  举报