运维好帮手之–fabric

Fabric是一个Python的库,它提供了丰富的同SSH交互的接口,可以用来在本地或远程机器上自动化、流水化地执行Shell命令。因此它非常适合用来做应用的远程部署及系统维护。其上手也极其简单,你需要的只是懂得基本的Shell命令。本文将为大家详细介绍Fabric的使用。

安装Fabric

首先Python的版本必须是2.7以上,可以通过下面的命令查看当前Python的版本:

python -V

1、源码安装

fabric官网 http://www.fabfile.org/installing.html有详细的安装步骤,请参考

2、pip安装

pip install fabric

使用fabric

万事从Hello World开始,我们创建一个”fabfile.py”文件,然后写个hello函数:

def hello():
 print("hello fabrci")
保存后,执行下面的命令:
 fab hello

你可以在终端看到”Hello fabric!”字样。
简单解释下,”fabfile.py”文件中每个函数就是一个任务,任务名即函数名,上例中是”hello”。”fab”命令就是用来执行”fabfile.py”中定义的任务,它必须显式地指定任务名。你可以使用参数”-l”来列出当前”fabfile.py”文件中定义了哪些任务:

fab -l

任务可以带参数,比如我们将hello函数改为:

def hello(name, value):
 print "Hello Fabric! %s=%s" % (name,value)

此时执行hello任务时,就要传入参数值:

fab hello:name=Year,value=2016

执行本地命令

“fabric.api”包里的”local()”方法可以用来执行本地Shell命令,比如让我们列出本地”/home/bjhee”目录下的所有文件及目录:

from fabric.api import local
 def hello():
 local('ls -l /home/bjhee/')

“local()”方法有一个”capture”参数用来捕获标准输出,比如

def hello():

    output = local('echo Hello', capture=True)
这样,Hello字样不会输出到屏幕上,而是保存在变量output里。”capture”参数的默认值是False。

执行远程命令

Fabric真正强大之处不是在执行本地命令,而是可以方便的执行远程机器上的Shell命令。它通过SSH实现,你需要的是在脚本中配置远程机器地址及登录信息:

from fabric.api import run, env
 
env.hosts = ['example1.com', 'example2.com']
env.user = 'bjhee'
env.password = '111111'
 
def hello():
 run('ls -l /home/bjhee/')

“fabric.api”包里的”run()”方法可以用来执行远程Shell命令。上面的任务会分别到两台服务器”example1.com”和”example2.com”上执行”ls -l /home/bjhee/”命令。这里假设两台服务器的用户名都是”bjhee”,密码都是6个1。你也可以把用户直接写在hosts里,比如:

 

env.hosts = ['bjhee@example1.com', 'bjhee@example2.com']

 

如果你的”env.hosts”里没有配置某个服务器,但是你又想在这个服务器上执行任务,你可以在命令行中通过”-H”指定远程服务器地址,多个服务器地址用逗号分隔:

如果对于不同的服务器,我们想执行不同的任务,上面的方法似乎做不到,那怎么办?我们要对服务器定义角色:

from fabric.api import env, roles, run, execute, cd
 
env.roledefs = {
 'staging': ['bjhee@example1.com','bjhee@example2.com'],
 'build': ['build@example3.com']
}
 
env.passwords = {
 'staging': '11111',
 'build': '123456'
}
 
@roles('build')
def build():
 with cd('/home/build/myapp/'):
 run('git pull')
 run('python setup.py')
 
@roles('staging')
def deploy():
 run('tar xfz /tmp/myapp.tar.gz')
 run('cp /tmp/myapp /home/bjhee/www/')
 
def task():
 execute(build)
 execute(deploy)

现在让我们执行:

fab task

这时Fabric会先在一台build服务器上执行build任务,然后在两台staging服务器上分别执行deploy任务。”@roles”装饰器指定了它所装饰的任务会被哪个角色的服务器执行。

如果某一任务上没有指定某个角色,但是你又想让这个角色的服务器也能运行该任务,你可以通过”-R”来指定角色名,多个角色用逗号分隔:

fab -R build deploy

这样”build”和”staging”角色的服务器都会运行”deploy”任务了。注:”staging”是装饰器默认的,因此不用通过”-R”指定。

此外,上面的例子中,服务器的登录密码都是明文写在脚本里的。这样做不安全,推荐的方式是设置SSH自动登录

更多资料请参阅

1、Python远程部署利器Fabric详解

2、官方文档

3、PYTHON FABRIC实现远程操作和部署

 

0
如无特殊说明,文章均为本站原创,转载请注明出处

该文章由 发布

这货来去如风,什么鬼都没留下!!!