如何利用Fabric自动化你的任务
作者:心内求法 发布时间:2023-02-25 12:37:04
首先让我们首先看一个例子。我们知道在*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。
猜你喜欢
- 下面步骤展示的是如何经过VirtualBox管理器,使得pycharm和ubuntu中的项目环境连接对应起来!如果你有属于自己的服务器,核心
- 首先我的环境已配置好:GO的目录结构是:add.gopackage calc//函数名必须大写首字母,不然外部包找不到func Add(a
- 废话不多说1.win+R 启动“运行”输入cmd 点确定2.输入 cd /d xxxxxxx回车jupyter notebook回车在这里我
- #mysqldump --help1.mysqldump的几种常用方法:(1)导出整个数据库(包括数据库中的数据)mysqldump -u
- XML虽然比JSON复杂,在Web中应用也不如以前多了,不过仍有很多地方在用,所以,有必要了解如何操作XML。DOM vs SAX操作XML
- 从最基础的说起。本教程中,所有IE 均指 WindowXP + IE 6.0, 所有 FF 均指 FF 1.5。1. 不用编程的部分1.1
- import pandas as pdimport numpy as np一、时间类型及其在python中对应的类型时间戳–timestam
- 1 各种疫苗梳理截至2022年3月,中国已经向120多个国家和国际组织提供了超过21亿剂疫苗,占中国以外全球疫苗使用总量的1/3。1.1 灭
- 1. 新建文件夹if not os.path.exists(feature_dir): os.makedirs(f
- 搞社区APP的时候,需要实现这个功能: String filetext = "//@张小名: 25分//@李小花: 43分//@王
- 背景介绍最近在设计数据库的时候因为开始考虑不周,所以产生了大量的重复数据。现在需要把这些重复的数据删除掉,使用到的语句就是Group By来
- LinuxNo.1 IPv4下面是IPv4的IP正则匹配实例:简单的匹配给定的字符串是否是ip地址import reif re.match(
- 本文介绍了目前6种比较常用的进度条,让大家都能直观地看到脚本运行最新的进展情况1.普通进度条在代码迭代运行中可以自己进行统计计算,并使用格式
- 希尔排序希尔排序是一个叫希尔的数学家提出的一种优化版本的插入排序。首先取一个整数d1=n//2,将元素分为d1个组,每组相邻元素之间的距离为
- python中捕获键盘操作一共有两种方法第一种方法:使用pygame中event方法使用方式如下:使用键盘右键为例if event.type
- 简述:Django的admin可以提供一个强大的后台管理功能,可以在web界面对数据库进行操作,我们需要修改admin.py将要操作的数据表
- 1. 引言Python是一种强大的编程语言,有很多内置的功能来处理文本。然而,有时候,我们需要处理的文本非常复杂,而Python内置的功能可
- 对于React,Vue构建的单页面应用老说,SEO是一个众所周知的问题。服务端渲染(SSR-server Side Render)是目前看来
- 一、背景Python 是一门易于学习、功能强大的编程语言。它提供了高效的高级数据结构,还能简单有效地面向对象编程。Python 优雅的语法和
- 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档协程:协程(Coroutine),也可以被称为微线程,是一种用户态内的上下文