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.

时间: 2024-09-15 05:08:49

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

Linux集群和自动化维导读

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

Linux集群和自动化维1.3 如何根据服务器应用选购服务器

1.3 如何根据服务器应用选购服务器   无论物理服务器是选用IDC托管还是AWS EC2云主机(以下为了简略说明,将它们统称为服务器),我们都要面临一个问题,那就是选择服务器的硬件配置,选购硬件配置时要根据服务器的应用需求而定.因为只通过一台服务器是无法满足所有的需求,并解决所有的问题的.在设计网站的系统架构之前,应该从以下方面考虑如何选购服务器: 服务器要运行什么应用. 需要支持多少用户访问. 需要多大空间来存储数据. 业务有多重要. 服务器网卡方面的考虑. 安全方面的考虑. 机架安排是否合

Linux集群和自动化维3.7.2 线上环境中的Fabric应用实例

3.7.2 线上环境中的Fabric应用实例 笔者线上的核心业务机器统一都是AWS EC2主机,机器数量较多,每个数据中心都部署了Fabric跳板机(物理拓扑图可参考图3-3),系统为Amazon Linux,内核版本为3.14.34-27.48.amzn1.x86_64,Python版本为Python 2.6.9. 如果公司项目组核心开发人员离职,线上机器就都要更改密钥,由于密钥一般是以组的形式存在的,再加上机器数量繁多,因此单纯通过技术人员手工操作,基本上是一项不可能完成的任务,但若是通过F

Linux集群和自动化维1.4.4 Linux下CPU使用率与机器负载的关系与区别

1.4.4 Linux下CPU使用率与机器负载的关系与区别  笔者的线上竞标业务机器,在业务最繁忙的一段周期内,发现Nginx单机并发活动的连接数超过了2.6万,机器负载(基本上不到4,Nagios监控系统并没有发送报警邮件和短信)和Nginx+Lua服务都是正常的,网卡流量并没有打满,但流量就是怎么也打不进去.经过深入观察,发现这段时期内每台机器的CPU利用率都已经很高了,基本都维持在99%-100%左右,这种情况应该是CPU资源耗尽了,导致不能再继续提供服务,所以这里有必要研究下CPU负载和

Linux集群和自动化维3.6 轻量级自动化运维工具Fabric介绍

3.6 轻量级自动化运维工具Fabric介绍 笔者公司目前的数据中心采用的是分布式部署方案,在全球多地都有数据中心.数据中心采用的是AWS EC2机器,在核心的数据中心里,EC2机器的数量比较多,基本上每个数据中心都在运行着几百台AWS EC2机器,而且业务繁忙的时候,会通过AWS AMI(Amazon系统映像)直接上线几十台相同业务的EC2机器,它们的机器类型.系统应用和配置文件基本上都是一模一样的,很多时候需要修改相同的配置文件和执行相同的操作,这个时候为了避免重复性的劳动就需要用到自动化运

Linux集群和自动化维2.6 生产环境下的Shell和Python脚本分类

2.6 生产环境下的Shell和Python脚本分类 生产环境下的Shell和Python脚本的作用还是挺多的,这里根据2.1节所介绍的日常工作中Shell脚本的作用,将生产环境下的Shell脚本分为备份类.监控类.统计类.运维开发类和自动化运维类.前面3类从字面意义上看比较容易理解,后面的两类需要稍微解释一下,运维开发类脚本是利用Shell或Python实现一些非系统类的管理工作,比如SVN的发布程序等:而自动化运维类脚本则是利用Shell或Python来自动替我们做一些烦琐的工作,比如自动生

Linux集群和自动化维2.1 Shell和Python语言的简单介绍

第2章 生产环境下的Shell和Python脚本 接触Linux系统十多年了,Shell和Python脚本都已经完全融入笔者的生活中了.虽然Shell脚本只是一个简单的解释型语言,不受开发人员的重视,但对于系统运维工程师来说,它的作用举足轻重,它就像我们的瑞士军刀一样,可以帮助我们简化日常的工作并减少工作量.在系统维护工作中,Shell脚本常常能比用C或C++语言编写的程序更快地解决相同的问题,此外,Shell脚本具有很好的可移植性,有时跨越Unix与POSIX兼容的系统,只须略作修改即可,甚至

Linux集群和自动化维3.1 Python语言的应用领域

第3章 轻量级自动化运维工具Fabric详解 近期公司的业务系统代码发布频繁,笔者同时在几个项目组里面穿插工作,发现发布和运维的工作都相当机械,加上频率比较高,导致时间的浪费也比较多.很多测试工作,例如通过SSH登录到测试环境,推送代码,然后修改Bug进行测试,这些操作都是非常机械并且具有重复性的.更让人郁闷的是,每次的操作都是相同的,命令基本上都是一样的,并且是在多台机器上执行,很难在本机上以一个脚本来搞定,主要时间都浪费在使用SSH登录和输入命令上了.这个时候需要一个轻量级的自动化运维工具,

Linux集群和自动化维2.2.3 变量和运算

2.2.3 变量和运算 变量是放置在内存中的某个存储单元,这个存储单元里存放的是这个单元的值,这个值是可以改变的,我们称之为变量. 其中,本地变量是在用户现有的Shell生命周期的脚本中使用的,用户退出后变量就不存在了,该变量只用于该用户. 下面都是跟变量相关的命令,这里只是大致地说明下,后面的内容里会有详细的说明,如下所示: 变量名="变量" readonly 变量名="变量"表示设置该变量为只读变量,这个变量不能被改变. echo $变量名 set  显示本地所