1、什么是fabrichtml
Fabric是一个Python(2.5-2.7)库,用于简化使用SSH的应用程序部署或系统管理任务的命令行工具。它提供的操做包括:执行本地或远程shell命令,上传/下载文件,以及其余辅助功能,如提示用户输入、停止执行等操做。python
简单来讲,它能够经过SSH在多个host上批量执行任务。你能够编写任务脚本,而后经过Fabric在本地就能够使用SSH在大量远程服务器上自动运行。这些功能很是适合应用的自动化部署,或者执行系统管理任务。web
2、先看一个例子,用fabric实现批量修改机器密码:shell
编写一个名字为fabfile.py的脚本:vim
$ vim fabfile.pyapi
#!/usr/bin/env python # _*_ coding:utf-8 _*_ from fabric.api import run from fabric.context_managers import env #指定须要修改密码的host env.hosts = ['10.13.25.2','10.13.25.3','10.13.25.4'] env.user = 'root' env.password = 'mypassword' env.parallel = True def chpasswd(): #用chpasswd修改用户密码 run("echo 'root:newpassword'| chpasswd")
执行:$fab chpasswd安全
会看到如下返回结果,执行完成修改为功:bash
$ fab sysbench服务器 [10.13.25.2] Executing task 'sysbench'ide [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 的方式来批量执行主机。
3、安装
fabric的安装很简单,能够直接用镜像源中自带的包;
E.g.:
$sudo apt-get install fabric
官方的建议用pip或者easy_install(老版本,尤可用),须要先装python-pip;你也能够直接下载源码;
E.g.:
$sudo apt-get install python-pip $sudo pip install fabric
4、fabric的使用
一、Fabric有默认的执行文件名"fabfile.py",也能够用-f参数指定;
E.g.:
fab -f chpasswd.py chpasswd
二、Fabric区分远程目录和本地目录,fabric提供的对远端和本地目录的操做分别是cd和lcd,咱们能够用普通用户登录上去pwd测试一下;
E.g.:$ vim fabfile.py
#!/usr/bin/env python from fabric.api import run from fabric.context_managers import env from fabric.context_managers import cd env.hosts = ['10.13.25.2','10.13.25.3','10.13.25.4'] env.user = 'xjx' env.password = 'xjx123' env.parallel = True def pwdtest(): run('pwd')
$ 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: Done. |
能够看到默认登录上去的路径是home目录,很容易被忽略这一点;若是想要切换目录引入'cd'命令,以下使用;
E.g切换到/usr/local目录:
with cd('/usr/local')
三、Fabric里的任务就是一个python函数,既然是python函数,那么对函数的一些用法也适用于任务函数。好比传递参数、互相调用、返回值等等;
def hello(name="world"): print("Hello %s!" % name)
在执行任务的时候,能够经过fab的命令行参数为任务函数传递参数:
$ fab hello:name=XJX
Hello XJX
四、环境字典
Fabric中经过一个Python字典的子类来设置环境,它是一个全局的单例 fabric.state.env ,包含在 fabric.api中。Fabric的大部分行为能够经过修改 env 变量来控制。若是不但愿全局生效,能够经过 settings 上下文管理器来改变代码块的环境设置。env 能够像字典那样使用,同时也支持按属性方式访问。env 变量的完整列表见官方文档 Full list of env vars ,推荐使用 settings 和 cd 这样的上下文管理器来修改它们。
五、定义主机列表
主机字符串就是 user@host:port 形式的字符串, user 和/或 port 能够省略。 hosts 变量定义主机列表,还能够用roledefs 分组定义主机。
from fabric.api import env env.roledefs = { 'web': ['www1', 'www2', 'www3'], 'dns': ['ns1', 'ns2'], }
构造主机列表有多种方式:
a.能够经过命令行以全局的方式,使用 --hosts/-H 和 --roles/-R 参数。
from fabric.api import env, run env.hosts.extend(['host3', 'host4']) def mytask(): run('ls /var/www')
fab -H host1,host2 mytask 将在 host1 、 host2 、 host3 、 host4 上执行 mytask 。
b.能够经过全局 env 。
from fabric.api import env, run env.hosts = ['host1', 'host2'] def mytask(): run('ls /var/www')
fab mytask 将在 host1 和 host2 上执行 mytask 。
c.
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 ,而后在两个主机上执行 mytask 。
六、local 执行本地shell命令。 run 执行远程命令;Fabric会自动处理错误,遇到错误时,默认和shell的行为相同。能够经过检查命令运行的结果来改变错误的处理方式;