大规模服务器管理利器 Fabric

Fabric 是什么

Fabric 是对服务器进行系统管理、应用部署的自动化脚本工具,特点是可以便捷的支持多台服务器

在一个脚本文件中就可以对多台服务器执行相同或不同的任务

Fabric基于Python,提供了一套简洁的命令集,可以执行常规任务,例如:在本机或者远程服务器执行shell命令、上传/下载文件、提示用户输入进行交互操作等

还有很多高级功能,例如:对服务器进行分组、并行执行任务、对执行错误进行处理等

应用案例

Instagram 是 Facebook 旗下的一个大型图片社交应用,有上千台服务器

Instagram 的持续部署系统每天需要进行30次以上的代码部署

在使用 Facebook 的分布式部署系统之前,Instagram 就是使用 Fabric 进行超大规模的服务器管理和应用部署

可见 Fabric 功能的强大

使用示例

通过几个简单的示例了解一下Fabric的使用方式

(1) Hello World

新建脚本: fabfile.py

def hello():

print("Hello world!")

命令行执行:

$ fab hello

fabfile.py 是默认执行的文件名,也可以使用其他名字,在执行时需要指定文件

$ mv fabfile.py hello.py

$ fab -f hello.py hello

(2)传入参数

def hello(name, val):

print("%s %s!" % (name, val))

执行

$ fab hello:name=hi,val=world

(3)执行本机命令

from fabric.api import local, lcd

def ls():

with lcd('~'):

local('ls')

lcd - local cd 命令

local - 在本机执行指定命令

(4)混合执行本地和远程服务器命令

from fabric.api import local,cd,run, env

env.hosts=['root@11.28.10.31:28',]

env.password = 'password'

def do_local():

local('echo "in local"')

def do_remote():

print "in remote"

with cd('~'):

run('ls -l')

def opt():

do_local()

do_remote()

执行结果

env.hostsenv.password 定义了远程服务器访问信息

然后定义了3个任务,do_local 执行本地任务,do_remote 执行远程任务,opt 调用了前面两个任务

cd、run 都是在远程服务器执行命令,对应的 lcd、local 是在本地执行命令

(5)不同服务器上执行不同的任务

#!/usr/bin/env python

# encoding: utf-8

from fabric.api import *

env.roledefs = {

'testserver': ['root@11.28.10.31:28'],

'realserver': ['root@41.12.56.19:22', ]

}

env.passwords = {

'root@11.28.10.31:28': "password",

'root@41.12.56.19:22': "password",

}

@roles('testserver')

def task1():

run('ls /home')

@roles('realserver')

def task2():

run('ls /home')

def dotask():

execute(task1)

execute(task2)

执行结果

env.roledefs 为服务器组定义了角色

@roles 指定任务在哪个角色的服务器上执行

重要特性:任务的并行执行

并行执行非常强大,尤其在服务器数量非常多时,让服务器间并行执行任务将会节省大量时间

默认情况下,任务都是顺序执行的,例如定义两个任务

from fabric.api import *

def update():

# 任务逻辑

def reload():

# 任务逻辑

在3个服务器中执行这两个任务

$ fab -H web1,web2,web3 update reload

执行结果是这样的:

update on web1

update on web2

update on web3

reload on web1

reload on web2

reload on web3

通过 -P 参数,可以开启并行执行功能

$ fab -H web1,web2,web3 -P update reload

执行结果就会是这样:

update on web1, web2, and web3

reload on web1, web2, and web3

还可以通过任务注解来声明是并行还是顺序执行,例如

from fabric.api import *

@parallel

def runs_in_parallel():

# ...

@serial

def runs_serially():

# ...

执行任务

$ fab -H host1,host2,host3 runs_in_parallel runs_serially

执行结果

runs_in_parallel on host1, host2, and host3

runs_serially on host1

runs_serially on host2

runs_serially on host3

安装

Fabric 是基于 python 的,先装好 python 环境

然后通过系统的包管理器来安装

ubuntu

$ sudo apt-get install fabric

centos

$ yum install fabric

Fabric官网 http://www.fabfile.org

原文发布于微信公众号 - 性能与架构(yogoup)

原文发表时间:2016-05-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏丑胖侠

Zookeeper开源客户端Curator之基本功能讲解

简介 Curator是Netflix公司开源的一套Zookeeper客户端框架。了解过Zookeeper原生API都会清楚其复杂度。Curator帮助我们在其基...

3605
来自专栏北京马哥教育

精通Linux常用的100+命令大全万字详解长文(珍藏版)

运维行业正在变革?推荐阅读:30万年薪Linux运维工程师成长魔法 Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作、文件存取、目录操作、...

58910
来自专栏后端技术探索

nginx入门到入门

用户访问反向代理服务器。但是用户不知道访问的是反向代理服务器多个站点中的哪一个站点。对服务器服务。

942
来自专栏java一日一条

Java Web应用中调优线程池的重要性

不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求。线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要了解的。本文主要介绍...

991
来自专栏张善友的专栏

Service Fabric 与 Ocelot 集成

云应用程序通常都需要使用前端网关,为用户、设备或其他应用程序提供同一个入口点。 在 Service Fabric 中,网关可以是任意无状态服务(如 ASP.NE...

2473
来自专栏北京马哥教育

Linux 中断处理浅析

最近在研究异步消息处理, 突然想起linux内核的中断处理, 里面由始至终都贯穿着”重要的事马上做, 不重要的事推后做”的异步处理思想. 于是整理一下~ ? 第...

6118
来自专栏数据和云

故障诊断 | 系统级追踪诊断方法及案例分享

所谓操作系统,是应用程序与服务器硬件进行沟通的中间层。应用程序的所有操作,都是和操作系统进行沟通交互。操作系统负责将所有交互转化为设备语言,进行硬件交互。 我们...

3513
来自专栏芋道源码1024

注册中心 Eureka 源码解析 —— 任务批处理

本文主要分享 任务批处理。Eureka-Server 集群通过任务批处理同步应用实例注册实例,所以本文也是为 Eureka-Server 集群同步的分享做铺垫。

1140
来自专栏行者悟空

CentOS Linux安装nginx及负载均衡的配置

1293
来自专栏农夫安全

浅谈XXE攻击

前言 现在越来越多主要的web程序被发现和报告存在XXE(XML External Entity attack)漏洞,比如说facebook、paypal等等。...

3546

扫码关注云+社区

领取腾讯云代金券