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.

相关文章
|
6月前
|
弹性计算 JSON Shell
基于Web API的自动化信息收集和整理
【4月更文挑战第30天】
80 0
|
3月前
|
运维 负载均衡 监控
"Linux高可用集群背后的神秘力量:揭秘心跳机制,如何确保服务永不掉线?"
【8月更文挑战第21天】今天探讨Linux高可用集群中的心跳机制——节点间定期发送信号以确认彼此状态的关键技术。它主要用于故障检测、负载均衡及资源接管。示例代码展示如何使用Corosync+Pacemaker配置心跳,确保服务连续性与可靠性。正确配置心跳机制能够显著提升系统的稳定性。
49 1
|
3月前
|
存储 Linux API
Linux源码阅读笔记08-进程调度API系统调用案例分析
Linux源码阅读笔记08-进程调度API系统调用案例分析
|
3月前
|
Linux API
Linux源码阅读笔记07-进程管理4大常用API函数
Linux源码阅读笔记07-进程管理4大常用API函数
|
3月前
|
存储 分布式计算 负载均衡
在Linux中,什么是集群,并且列出常见的集群技术。
在Linux中,什么是集群,并且列出常见的集群技术。
|
3月前
|
负载均衡 监控 算法
在Linux中,如何配置和管理LVS集群?
在Linux中,如何配置和管理LVS集群?
|
3月前
|
存储 运维 监控
在Linux中,心跳机制在Linux高可用集群中作用是什么?
在Linux中,心跳机制在Linux高可用集群中作用是什么?
|
3月前
|
开发框架 Unix Linux
LangChain 构建问题之在Unix/Linux系统上设置OpenAI API密钥如何解决
LangChain 构建问题之在Unix/Linux系统上设置OpenAI API密钥如何解决
48 0
|
3月前
|
消息中间件 Java Kafka
Linux——Kafka集群搭建
Linux——Kafka集群搭建
46 0
|
5月前
|
Linux 数据安全/隐私保护
HTCondor下多台Linux计算集群的搭建
HTCondor下多台Linux计算集群的搭建
HTCondor下多台Linux计算集群的搭建