一、什么是fabric
Fabric是一个Python(2.5-2.7)库,用于简化使用SSH的应用程序部署或系统管理任务的命令行工具。它提供的操作包括:执行本地或远程shell命令,上传/下载文件,以及其他辅助功能,如提示用户输入、中止执行等操作。
简单来说,它可以通过SSH在多个host上批量执行任务。你可以编写任务脚本,然后通过Fabric在本地就可以使用SSH在大量远程服务器上自动运行。这些功能非常适合应用的自动化部署,或者执行系统管理任务。
二、先看一个例子,用fabric实现批量修改机器密码:
编写一个名字为fabfile.py的脚本:
$ vim fabfile.py
<code>#!/usr/bin/env python</code>
<code># _*_ coding:utf-8 _*_</code>
<code>from</code> <code>fabric.api </code><code>import</code> <code>run</code>
<code>from</code> <code>fabric.context_managers </code><code>import</code> <code>env</code>
<code>#指定需要修改密码的host</code>
<code>env.hosts </code><code>=</code> <code>[</code><code>'10.13.25.2'</code><code>,</code><code>'10.13.25.3'</code><code>,</code><code>'10.13.25.4'</code><code>]</code>
<code>env.user </code><code>=</code> <code>'root'</code>
<code>env.password </code><code>=</code> <code>'mypassword'</code>
<code>env.parallel </code><code>=</code> <code>True</code>
<code>def</code> <code>chpasswd():</code>
<code>#用chpasswd修改用户密码</code>
<code> </code><code>run(</code><code>"echo 'root:newpassword'| chpasswd"</code><code>)</code>
执行:$fab chpasswd
会看到以下返回结果,执行完成修改成功:
$ fab sysbench
[10.13.25.2] Executing task 'sysbench'
[10.13.25.3] Executing task 'sysbench'
[10.13.25.4] Executing task 'sysbench'
[10.13.25.4] run: echo 'root:newpassword'| chpasswd
[10.13.25.3] run: echo 'root:newpassword'| chpasswd
[10.13.25.2] run: echo 'root:newpassword'| chpasswd
Done.
会看到fabric的返回结果在前面都有相对应的IP地址,由于env.parallel的值为True,任务可以在多台机器上同时进行。
官方文档中建议,为了安全起见,最好是使用 SSH KEY 的方式来批量执行主机。
三、安装
fabric的安装很简单,可以直接用镜像源中自带的包;
E.g.:
<code>$</code><code>sudo</code> <code>apt-get </code><code>install</code> <code>fabric</code>
官方的建议用pip或者easy_install(老版本,尤可用),需要先装python-pip;你也可以直接下载源码;
<code>$</code><code>sudo</code> <code>apt-get </code><code>install</code> <code>python-pip</code>
<code>$</code><code>sudo</code> <code>pip </code><code>install</code> <code>fabric</code>
四、fabric的使用
1、Fabric有默认的执行文件名"fabfile.py",也可以用-f参数指定;
fab -f chpasswd.py chpasswd
2、Fabric区分远程目录和本地目录,fabric提供的对远端和本地目录的操作分别是cd和lcd,我们可以用普通用户登陆上去pwd测试一下;
E.g.:$ vim fabfile.py
<code>from</code> <code>fabric.context_managers </code><code>import</code> <code>cd</code>
<code>env.user </code><code>=</code> <code>'xjx'</code>
<code>env.password </code><code>=</code> <code>'xjx123'</code>
<code>def</code> <code>pwdtest():</code>
<code> </code><code>run(</code><code>'pwd'</code><code>)</code>
$ fab pwdtest
[10.13.25.2] Executing task 'pwdtest'
[10.13.25.3] Executing task 'pwdtest'
[10.13.25.4] Executing task 'pwdtest'
[10.13.25.4] run: pwd
[10.13.25.3] run: pwd
[10.13.25.2] run: pwd
[10.13.25.3] out: /home/xjx
[10.13.25.3] out:
[10.13.25.2] out: /home/xjx
[10.13.25.2] out:
[10.13.25.4] out: /home/xjx
[10.13.25.4] out:
可以看到默认登陆上去的路径是home目录,很容易被忽略这一点;如果想要切换目录引入'cd'命令,如下使用;
E.g切换到/usr/local目录:
<code>with </code><code>cd</code><code>(</code><code>'/usr/local'</code><code>)</code>
3、Fabric里的任务就是一个python函数,既然是python函数,那么对函数的一些用法也适用于任务函数。比如传递参数、互相调用、返回值等等;
<code>def hello(name=</code><code>"world"</code><code>):</code>
<code> </code><code>print(</code><code>"Hello %s!"</code> <code>% name)</code>
在执行任务的时候,可以通过fab的命令行参数为任务函数传递参数:
$ fab hello:name=XJX
Hello XJX
4、环境字典
5、定义主机列表
主机字符串就是 user@host:port 形式的字符串, user 和/或 port 可以省略。 hosts 变量定义主机列表,还可以用roledefs 分组定义主机。
<code>from fabric.api </code><code>import</code> <code>env</code>
<code>env</code><code>.roledefs = {</code>
<code> </code><code>'web'</code><code>: [</code><code>'www1'</code><code>, </code><code>'www2'</code><code>, </code><code>'www3'</code><code>],</code>
<code> </code><code>'dns'</code><code>: [</code><code>'ns1'</code><code>, </code><code>'ns2'</code><code>],</code>
<code>}</code>
构造主机列表有多种方式:
a.可以通过命令行以全局的方式,使用 --hosts/-H 和 --roles/-R 参数。
<code>from fabric.api </code><code>import</code> <code>env</code><code>, run</code>
<code>env</code><code>.hosts.extend([</code><code>'host3'</code><code>, </code><code>'host4'</code><code>])</code>
<code>def mytask():</code>
<code> </code><code>run(</code><code>'ls /var/www'</code><code>)</code>
fab -H host1,host2 mytask 将在 host1 、 host2 、 host3 、 host4 上执行 mytask 。
b.可以通过全局 env 。
<code>env</code><code>.hosts = [</code><code>'host1'</code><code>, </code><code>'host2'</code><code>]</code>
fab mytask 将在 host1 和 host2 上执行 mytask 。
c.
<code>def set_hosts():</code>
<code> </code><code>env</code><code>.hosts = [</code><code>'host1'</code><code>, </code><code>'host2'</code><code>]</code>
<code> </code><code>def mytask():</code>
fab set_hosts mytask 将先执行本地任务 set_hosts ,然后在两个主机上执行 mytask 。
6、local 执行本地shell命令。 run 执行远程命令;Fabric会自动处理错误,遇到错误时,默认和shell的行为相同。可以通过检查命令运行的结果来改变错误的处理方式;
本文转自Jx战壕 51CTO博客,原文链接:http://blog.51cto.com/xujpxm/1730780,如需转载请自行联系原作者