如何利用Fabric自动化你的任务

 更新时间:2016年10月20日 16:01:38   作者:心内求法  
大家都知道Fabric是一个Python库,可以通过SSH在多个host上批量执行任务。你可以编写任务脚本,然后通过Fabric在本地就可以使用SSH在大量远程服务器上自动运行。这些功能非常适合应用的自动化部署,或者执行系统管理任务。本文将介绍如何利用Fabric自动化你的任务。

首先让我们首先看一个例子。我们知道在*NIX下面,uname命令是查看系统的发行版。

可以写这样一个Fabric脚本:

from fabric.api import run
def host_type():
 run('uname -s')

将上面的脚本保存为fabfile.py,就可以通过fab命令在多个主机上执行host_type脚本了:

$ fab -H localhost,linuxbox host_type
[localhost] run: uname -s
[localhost] out: Darwin
[linuxbox] run: uname -s
[linuxbox] out: Linux

执行过程中可能需要你输入系统密码。

安装

如果你看到这里了,说明你开始对Fabric感兴趣了。但是上述操作在你那里无法执行,因为你还没有安装Fabric。安装Fabric很简单,可以用pip或者easy_install,也可以下载原代码安装。

任务函数

很好,安装Fabric并没有难住你。可能你已经成功的执行了前面的任务,现在让我们更深入一些。

Fabric中的任务就是一个python函数,姑且让我们称之为“任务函数”。既然是python函数,那么对函数的一些用法也适用于任务函数。比如传递参数、互相调用、返回值等等。

首先看一个传递参数的例子:

def hello(name="world"):
 print("Hello %s!" % name)

在执行任务的时候,可以通过fab的命令行参数为任务函数传递参数:

$ fab hello:name=Holbrook
Hello Holbrook!

组合任务的例子如下:

from fabric.api import run
def host_type():
 run('uname -s')

def hello(name="world"):
 print("Hello %s!" % name)

def composite(name="world"):
 hello(name)
 host_type()

Fabric提供的命令

前面我们见过了fabric.api模块中的run函数,其功能是在远端主机上执行命令。fabric.api中还提供了local函数,用于执行本地(Fabric所在的主机)命令。

如下:

from fabric.api import local
def lslocal():
 local('ls')

类似远端命令和本地命令,Fabric也区分远端目录和本地目录。Fabric提供的对远端和本地目录的操作分别是cd和lcd。如果你用过命令行的ftp,这很容易理解。

让我们看一个例子:

def filepath():
 remote_dir = '/opt/xxx'
 with cd(remote_dir):
  run("touch README")

上面代码的功能是进入远端的/opt/xxx目录,并创建一个README文件。

Fabric还提供了很多的命令,比如文件操作等。

管理服务器连接

前面的例子中,都需要在fab命令行参数中指定server。当要管理大量服务器时很麻烦。Fabric提供了环境变量的字典env,其中就包含了hosts字典项,可以定义需要连接的server。

如下:

from fabric.api import env, run

env.hosts = ['host1', 'host2']
def mytask():
 run('ls /var/www')

也可以为每个任务单独指定要执行该任务的host列表:

from fabric.api import env, run

def set_hosts():
 env.hosts = ['host1', 'host2']

def mytask():
 run('ls /var/www')

这样执行 fab set_hosts mytask时,就可以为set_hosts中指定的两个host执行mytask任务了。如果你懒得写函数,在fab命令行中指定也是一样的:

fab mytask:hosts="host1;host2"

为了更方便的执行批量任务,Fabric中还定义了Role,有兴趣可以阅读其官方文档。

管理SSH密码、用户、端口

尽管更推荐使用SSH公钥认证,但是Fabric还是提供了管理密码的机制。Fabric提供了两层密码。

如果你的server有相同的密码,可以在env.password中设置默认的密码;如果server密码不同,还可以在env.passwords中设置(host,password)对,为每个server设置单独的ssh密码。

上面的host字符串采用这种格式:username@hostname:port。所以,在指定ssh密码的同时,也就指定了ssh用户。同密码一样,你也可以在env.user中指定一个默认的用户。如果都没有指定,执行fab命令时会提示你输入密码。

使用Fabric,你可以管理一系列host的SSH连接(包括主机名,用户,密码),定义一系列的任务函数,然后灵活的指定在哪些host上执行哪些任务。这非常使用于需要管理大量host的场景,比如运维,私有云管理,应用自动化部署等。

总结

本文只是一篇入门文档,远没有体现出Fabric的强大。实际上,Fabric还包括大量的功能,比如Role的定义,远程交互及异常处理,并发执行,文件操作等,并且不仅仅局限于命令行方式,可以在你的应用中调用Fabric。

以上就是本文的全部内容了,希望本文的内容能够引起你对Fabric的兴趣,并在你的实际应用中解决问题。如果有疑问大家可以留言交流。

相关文章

  • pycharm使用matplotlib.pyplot不显示图形的解决方法

    pycharm使用matplotlib.pyplot不显示图形的解决方法

    今天小编就为大家分享一篇pycharm使用matplotlib.pyplot不显示图形的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • python使用json将字符串转字典报错的解决

    python使用json将字符串转字典报错的解决

    这篇文章主要介绍了python使用json将字符串转字典报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • python简单获取数组元素个数的方法

    python简单获取数组元素个数的方法

    这篇文章主要介绍了python简单获取数组元素个数的方法,实例分析了Python中len方法的相关使用技巧,非常简单实用,需要的朋友可以参考下
    2015-07-07
  • Python构建一个文档扫描器的实现

    Python构建一个文档扫描器的实现

    本文主要介绍了Python构建一个文档扫描器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Django中使用极验Geetest滑动验证码过程解析

    Django中使用极验Geetest滑动验证码过程解析

    这篇文章主要介绍了Django中使用极验Geetest滑动验证码过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Python 读取位于包中的数据文件

    Python 读取位于包中的数据文件

    这篇文章主要介绍了Python 如何读取位于包中的数据文件,帮助大家更好的理解和学习Python,感兴趣的朋友可以了解下
    2020-08-08
  • python 表达式和语句及for、while循环练习实例

    python 表达式和语句及for、while循环练习实例

    下面小编就为大家带来一篇python 表达式和语句及for、while循环练习实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Django模板语言 Tags使用详解

    Django模板语言 Tags使用详解

    这篇文章主要介绍了Django模板语言 Tags使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • python获取标准北京时间的方法

    python获取标准北京时间的方法

    这篇文章主要介绍了python获取标准北京时间的方法,实例分析了Python通过www.beijing-time.org的官网获取标准北京时间的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • python使用ctypes调用第三方库时出现undefined symbol错误详解

    python使用ctypes调用第三方库时出现undefined symbol错误详解

    python中时间的库有time和datetime,pandas也有提供相应的时间处理函数,下面这篇文章主要给大家介绍了关于python使用ctypes调用第三方库时出现undefined symbol错误的相关资料,需要的朋友可以参考下
    2023-02-02

最新评论