乐趣区

自动化运维工具fabric的总结

fabric 使用总结

Fabric 和 Fabric2 在 Pypi 中就是同一个东西,fabric2 只是 Fabric 的替代名称,为了便于使用备用名称进行安装。Fabric2 和之前的 Fabric1 相比,完全重写了,接口和功能都有很大改动,官网也不建议继续用 Fabric1,建议升级到 Fabric2。而最新版也早就支持 Python 3.4+,和之前的 Python2.7。

但目前各个社区对 fabric2 的介绍很少,基本都是 fabric1,fabric2 与 fabric1 的接口基本是完全不同,因此目前使用的是 fabric1

  • 安装 fabric1 的方法:
pip install 'fabric <2.0'

由于 fabric 不只是一个 Python 模块,fabric 还是一个命令行工具,可以通过 fab - h 进行命令的了解

  • 使用方式

  • 新建 fable.py 文件:
from fabric.api import *
from fabric.colors import *

#env.parallel = True 这个参数的含义是,对于批量机器的某个任务,所有机器并行执行;#默认是根据机器列表一个机器一个机器执行;env.warn_only=True
#可以把退出换为警告,以提供更灵活的错误处理。#如果设置为 False,则一条命令运行失败会就会退出,不再执行后面的命令。#自动登录机器的用户名和密码
#env: 保存用户配置的字典
#( 保存了相关的配置,比如登录用户名 env.user,密码 env.password,端口 env.port  等,
#如果没有指定用户名那么默认使用当前用户,端口使用 22)

env.user = "username"
env.password = "password"

#以组为单位管理机器
env.roledefs = {
          'group1':
          [
              'p1.test.cn',
              'p2.test.cn',
              'p3.test.cn',
              'p4.test.cn',
              'p5.test.cn',
              'p6.test.cn',
              'p7.test.cn',
              'p8.test.cn',
              'p9.test.cn',
              'p10.test.cn',
          ],
          'log':
          [
              'log1.test.cn',
              'log2.test.cn',
          ],
          }
#以上定义了两个组,一个组叫 group1,包含了十台机器,一个组叫 log,包含了两台机器;@roles("group1")
def check_ps():
    run("ps -ef | grep demo") #直接在远程机器上以登录账户 username 的权限执行指令
    
    put("./start.sh", "/home/wangzijie") #将本地当前目录下的 start.sh 文件复制到远程机器的 /home/wangzijie 目录下
    
    put("./update.sh", "/etc/init.d/update.sh", use_sudo = True) #将本地当前目录下的 start.sh 文件复制到远程机器的 /etc/init.d 目录下;#由于这个目录只有 root 有写权限,因此 use_sudo = True 可以以 sudo 的权限来写,但需要有这台机器的 sudo 权限才可以
    
    sudo("/etc/init.d/update.sh start") #以 root 的角色来执行 update.sh 脚本
    
    sudo("/home/wangzijie/start.sh", user = "cloud") #以特定组 cloud 的角色来执行命令,需要在目标机器有 cloud 的权限
    
  • 执行脚本
fab check_ps

该命令需要在 fable.py 所在目录下执行,会对所有的 group1 机器运行 check_ps 方法中的所有命令,按照 list 的顺序执行,若需要所有机器并行执行,添加 env.parallel = True 即可

fab 命令执行时,默认引用一个名为 fabfile.py 的文件,我们也可以通过 -f 来进行指定。

  • 参数传递

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

执行时:

fab hello:name=Year,value=2016
退出移动版