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


Posted in Python onOctober 20, 2016

首先让我们首先看一个例子。我们知道在*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的兴趣,并在你的实际应用中解决问题。如果有疑问大家可以留言交流。

Python 相关文章推荐
python 实时遍历日志文件
Apr 12 Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
Feb 21 Python
Python元组拆包和具名元组解析实例详解
Mar 26 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
Oct 21 Python
通过PYTHON来实现图像分割详解
Jun 26 Python
Python数据可视化实现正态分布(高斯分布)
Aug 21 Python
python django生成迁移文件的实例
Aug 31 Python
python yield和Generator函数用法详解
Feb 10 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
Jun 08 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
Python字典取键、值对的方法步骤
Sep 30 Python
python制作一个简单的gui 数据库查询界面
Nov 19 Python
windows下ipython的安装与使用详解
Oct 20 #Python
Python做文本按行去重的实现方法
Oct 19 #Python
Python首次安装后运行报错(0xc000007b)的解决方法
Oct 18 #Python
python类中super()和__init__()的区别
Oct 18 #Python
Python 序列的方法总结
Oct 18 #Python
python 异常处理总结
Oct 18 #Python
python 队列详解及实例代码
Oct 18 #Python
You might like
PHP文件上传实例详解!!!
2007/01/02 PHP
php中如何防止表单的重复提交
2013/08/02 PHP
php ci框架中加载css和js文件失败的解决方法
2014/03/03 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
Yii2简单实现多语言配置的方法
2016/07/23 PHP
PHP队列场景以及实现代码实例详解
2021/02/26 PHP
JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
2008/11/03 Javascript
js函数模拟显示桌面.scf程序示例
2014/04/20 Javascript
Javascript基础教程之变量
2015/01/18 Javascript
javascript实现获取浏览器版本、操作系统类型
2015/01/29 Javascript
JavaScript获取元素尺寸和大小操作总结
2015/02/27 Javascript
纯JS实现旋转图片3D展示效果
2015/04/12 Javascript
JS实现简单的tab切换选项卡效果
2016/09/21 Javascript
JS类的定义与使用方法深入探索
2016/11/26 Javascript
微信小程序开发中的疑问解答汇总
2017/07/03 Javascript
vue源码学习之Object.defineProperty 对数组监听
2018/05/30 Javascript
详解vue 2.6 中 slot 的新用法
2019/07/09 Javascript
通过实例了解JS 连续赋值
2019/09/24 Javascript
Auto.JS实现抖音刷宝等刷视频app,自动点赞,自动滑屏,自动切换视频功能
2020/05/08 Javascript
JavaScript实现商品评价五星好评
2020/11/30 Javascript
phpsir 开发 一个检测百度关键字网站排名的python 程序
2009/09/17 Python
Python多线程编程(一):threading模块综述
2015/04/05 Python
在Django的视图中使用form对象的方法
2015/07/18 Python
详解JavaScript编程中的window与window.screen对象
2015/10/26 Python
Django视图和URL配置详解
2018/01/31 Python
Python 从列表中取值和取索引的方法
2018/12/25 Python
numpy中三维数组中加入元素后的位置详解
2019/11/28 Python
Python 实现Serial 与STM32J进行串口通讯
2019/12/18 Python
python简单的三元一次方程求解实例
2020/04/02 Python
CSS3属性background-size使用指南
2014/12/09 HTML / CSS
匡威俄罗斯官网:Converse俄罗斯
2020/05/09 全球购物
成语的广告词
2014/03/19 职场文书
代领报检证委托书范本
2014/10/11 职场文书
倡议书的格式写法
2015/04/28 职场文书
Django+Nginx+uWSGI 定时任务的实现方法
2022/01/22 Python
微信小程序纯CSS实现无限弹幕滚动效果
2022/09/23 HTML / CSS