Linux集群和自动化维3.6.3 Fabric的核心API

3.6.3 Fabric的核心API

Fabric的核心API主要有7类:带颜色的输出类(color
output)、上下文管理类(context
managers)、装饰器类(decorators)、网络类(network)、操作类(operations)、任务类(tasks)、工具类(utils)。

Fabric提供了一组操作简单但功能强大的fabric.api命令集,简单地调用这些API就能完成大部分应用场景的需求,Fabric支持的常用命令及说明如下。

local:执行本地命令,如local ('uname -s')。

lcd:切换本地目录,如lcd ('/home')。

cd:切换远程目录,如cd ('/data/logs/')。

run:执行远程命令,如run ('free -m')。

sudo:以sudo方式执行远程命令,如sudo ('/etc/init.d/httpd start')。

put:上传本地文件到远程主机,如put ('/home/user.info','/data/user.info')。

get:从远程主机下载文件到本地,如get ('/home/user.info','/data/user.info')。

prompt:获得用户输入信息,如prompt ('please input user password:')。

confirm:获得提示信息确认,如confirm ('Test failed,Continue[Y/N]')。

reboot:重启远程主机,如reboot ()。

@task:函数修饰符。新版本的Fabric对面向对象的特性和命名空间有很好的支持。面向对象的继承和多态特性,对代码的复用极其重要。新版本的Fabric定义了常规的模块级别的函数,并带有装饰器@task,这会直接将该函数转化为task子类。该函数名会被作为任务名,后面会举例说明@task的用法。

@runs_once:函数修饰符。标识此修饰符的函数只会执行一次,不受多台主机影响。

下面来看看@task的用法,它可以为任务添加别名,命令如下:

from fabric.api
import task

@task(alias='dwm')

def
deploy_with_migrations():

    pass

用fab命令打印指定文件中存在的命令,如下:

fab -f
/home/yhc/test.py --list

命令显示结果如下所示:

Available
commands:

deploy_with_migrations

    dwm

还可以通过@task来设置默认的任务,比如deploy(部署)一个子模块,命令如下:

from fabric.api
import task

@task

def migrate():

    pass

@task

def push()

    pass

@task

def provision():

    pass

 

@task(default=True)

def
full_deploy():

    provision()

    push()

    migrate()

 

fab -f
/home/yhc/test.py --list

结果如下所示:

Available
commands:

    deploy

    deploy.full_deploy

    deploy.migrate

    deploy.provision

    deploy.push

也可以通过@task以类的形式定义任务,例如:

from fabric.api
import task

from fabric.tasks
import Task

class
MyTask(Task):

    name = "deploy"

    def run(self, environment,
domain="whatever.com"):

        run("git clone foo")

        sudo("service apache2
restart")

instance =
MyTask()

下面采用@task方式的代码跟上面的代码效果是一样的:

from fabric.api
import task

from
fabric.tasks import Task

@task

def
deploy(environment, domain="whatever.com"):

    run("git clone foo")

    sudo("service apache2 restart")

大家可以对比看看,是不是采用@task函数修饰器的方式更为简洁和直观呢?

关于@task修饰器的用法和其他fabric.api命令,请参考Fabric官方文档http://fabric-chs.readthedocs.org/zh_CN/chs/tutorial.html。

这里举个例子说明一下@runs_once用法,源码文件/home/yhc/test.py文件内容如下所示:

#!/usr/bin/python

# -*- coding:
utf-8 -*-

from fabric.api
import *

from
fabric.colors import *

 

env.user =
"root" #定义用户名,env对象的作用是定义Fabric指定文件的全局设定

env.password =
"redhat" #定义密码

env.hosts =
['192.168.1.204','192.168.1.205']

#定义目标主机

 

@runs_once

#当有多台主机时只执行一次

def
local_task(): #本地任务函数

    local("hostname")

    print red("hello,world")

    #打印红色字体的结果

def
remote_task(): #远程任务函数

    with cd("/usr/local/src"):

       run("ls -lF | grep /$")

#with是Python中更优雅的语法,可以很好地处理上下文环境产生的异常,这里用了with以后相当于实现了"cd /var/www/html && ls
-lsart"的效果。

通过fab命令调用local_task本地任务函数,命令如下:

fab -f test.py
local_task

结果如下所示:

[192.168.1.204]
Executing task 'local_task'

[localhost]
local: hostname

client.cn7788.com

My hostname is
client.cn7788.com

Hello,world!

Done.

上述命令显示的虽然不是本机的IP地址,但实际上并没有在主机192.168.1.204上面执行命令,而是在本地主机client.cn7788.com(IP为192.168.1.206的机器)上执行了命令,并以红色字体显示了
“hello,world”和“My hostname is client.cn7788.com”。

调用remote_task远程函数显示结果,分别在204和205的机器上打印/usr/local/src/下面存在的目录,结果如下:

[192.168.1.204]
Executing task 'remote_task'

[192.168.1.204]
run: ls -lF | grep /$

[192.168.1.204]
out: drwxr-xr-x. 2 root root    4096 Nov
22 00:01 download/

[192.168.1.204]
out: drwxr-xr-x. 9  501 games   4096 Nov 19 04:44 Fabric-1.3.0/

[192.168.1.204]
out: drwxr-xr-x. 2 root root    4096 Nov
22 00:01 object/

 

[192.168.1.205]
Executing task 'remote_task'

[192.168.1.205]
run: ls -lF | grep /$

[192.168.1.205]
out: drwxr-xr-x. 2 root root  4096 Nov 22
04:58 mysql/

[192.168.1.205]
out: drwxr-xr-x. 2 root root  4096 Nov 22
04:58 puppet/

[192.168.1.205]
out: drwxr-xr-x. 2 root root  4096 Nov 22
04:58 soft/

[192.168.1.205]
out: drwxr-xr-x. 2 root root  4096
Nov  3 07:56 test/

Done.

Disconnecting
from 192.168.1.204... done.

Disconnecting
from 192.168.1.205... done.

时间: 2017-05-02

Linux集群和自动化维3.6.3 Fabric的核心API的相关文章

Linux集群和自动化维导读

Preface  前言 为什么要写这本书 笔者从事系统运维和网站架构设计的工作已有10多年,现在在一家外企担任云平台架构师.云计算是现在的主流技术,未来也有很好的发展趋势,云计算的流行对于传统的运维知识体系来说,其实也造成了冲击,有很多读者经常向笔者咨询工作中的困惑,比如从事系统运维工作3-5年后就不知道该如何继续学习和规划自己的职业生涯了.因此笔者想通过此书,跟大家分享一下自己的工作经验和心得(包括传统运维和云平台运维工作的区别与对比),以期解决大家在工作中的困惑.本书提供了大量项目实践和线上

Linux集群和自动化维2.3 Shell中的控制流结构

2.3 Shell中的控制流结构 Shell中的控制流结构也比较清晰,如下所示: if ...then... else...fi语句 case语句 for循环 until循环 while循环 break控制 continue控制 工作中用得最多的就是if语句.for循环.while循环及case语句,大家可以以这几个为重点对象来学习. if语句语法如下: if 条件1 then   命令1 else   命令2 fi if语句的进阶用法: if 条件1 then     命令1       el

Linux集群和自动化维1.5.1 服务器物理硬件的优化

1.5.1 服务器物理硬件的优化  在对MySQL服务器进行硬件挑选时,应该从下面几个方面着重对MySQL服务器的硬件配置进行优化,也就是说将项目中的资金着重投入到如下几处: 磁盘寻道能力(磁盘I/O).笔者公司现在用的都是SAS15000转的硬盘,用6块这样的硬盘做RAID 10.MySQL数据库每一秒钟都在进行大量.复杂的查询操作,对磁盘的读写量可想而知,所以,通常认为磁盘I/O是制约MySQL性能的最大因素之一.对于日均访问量在1000万PV以上的Discuz论坛,如果磁盘I/O性能不好,

Linux集群和自动化运维

Linux/Unix技术丛书 Linux集群和自动化运维 余洪春 著 图书在版编目(CIP)数据 Linux集群和自动化运维/余洪春著. -北京:机械工业出版社,2016.8 (Linux/Unix技术丛书) ISBN 978-7-111-54438-8 I. L- II.余- III. Linux操作系统 IV. TP316.89 中国版本图书馆CIP数据核字(2016)第176055号 Linux集群和自动化运维 出版发行:机械工业出版社(北京市西城区百万庄大街22号 邮政编码:100037

云计算-关于集群的自动化配置部署和更新方案

问题描述 关于集群的自动化配置部署和更新方案 先花些时间唠叨下我做的<XX行业生产云>的需求,然后结合着这些需求请教各位专家一系列的问题. 功能需求: 生产企业内部有局域网,连接办公环境和相关的生产设备,并且有连接互联网的出口.生产过程由办公环境(B/S架构)向局域网内的设备发送生产指令,生产的运行状态实时可以回显给办公环境.局域网内满足该需求就需要部署一个常规的Web应用服务站点加关系型数据库(目前尚不需要实时数据库)就可以完成.云计算-关于集群的自动化配置部署和更新方案-集群自动化部署&q

Linux 集群大全

[From] http://www-128.ibm.com/developerworks/cn/linux/cluster/lw-clustering.html 级别: 初级 Rawn Shah, LinuxWorld 专栏作家 2000 年 5 月 01 日 Rawn Shah 作为专家,在 Linux 现有的开放源码和封闭源码集群解决方案方面为您指点迷津. 计算 Linux 中集群项目的数量就象计算硅谷中创业公司的数量一样.不象 Windows NT 已经受其自身的封闭环境阻碍,Linux

针对Linux集群技术的要点解析

  现在很多的企业,网站都在应用Linux操作系统,Linux的优点使人们舍弃了微软.今天就讲讲Linux集群技术,让你更一步了解Linux,知道Linux集群技术强大功能.给你挑选系统起到参考的作用. Linux竞争力很强的原因之一,是它可以运行于极为普及的PC机上,不需要购买昂贵的专用硬件设备.在几台运行Linux的PC机上,只要加入相应的集群软件,就可以组成具有超强可靠性.负载能力和计算能力的Linux集群.集群中的每台服务器称为一个节点. 按照侧重点的不同,可以把Linux集群分为三类.

Linux集群原理与安装配置介绍

  Linux集群原理 Linux集群系统包括集群节点和集群管理器两部分.集群节点有时简称为节点.服务器或服务器节点,是提供处理资源的系统,它进行集群的实际工作.一般来讲,它必须进行配置才能成为集群的一部分,也必须运行集群的应用软件.应用软件可以是专用于集群的软件,也可以是设计用于分布式系统的标准软件.Linux集群管理器则是将节点捆绑在一起,以构成单一系统外观的逻辑结构,它用于将任务分解到所有的节点. 集群因多种不同的原因而有着不同的类型,建立Linux集群的最直接原因是共享CPU资源,在多个

基于Linux集群技术的校园网络中心方案

随着网络技术的发展和网络应用的进一步深入,校园网络承担了越来越多的来自教学.科研及管理方面的应用.校园网络中心作为校内局域网络的数据存储发布.流量的管理控制.用户的管理以及内外网络转接控制中心,必须解决因流量增加所带来的一系列问题.传统的网络中心方案中,当流量增加后,一般是升级单一的服务器系统,这往往会造成过高的投入和维护成本,极大地降低了性能价格比.运用基于Linux集群技术设计的校园网络中心方案可以有效地解决这一问题. 校园网络中心体系结构 基于Linux集群技术的校园网络中心的体系结构是以

高性能的Linux集群监控之道

  监控是集群管理的核心任务.监控数据可用于调度任务.负载平衡.向管理员报告软硬件故障,并广泛地控制系统使用情况.监控信息必须在不影响集群性能的情况下获得.本文将讨论使用/proc文件系统和Java来获得监控数据的方法. Java在Linux集群中的应用 Java技术为集群管理开发者提供了许多解决问题的办法.Java是动态.灵活.可移植的,这些不寻常的特征使得它成为了在异构网络及平台上构造集群管理的理想基础. Java具有广泛的例程库,很容易处理IP协议,如TCP.UDP,并可在multi-ho