Execution Mode 2013-03-16

执行模式--Execution Mode

之前定义了主机列表和任务列表,fabric根据主机列表和任务列表就可以执行任务,下面就是分析其执行策略及其他相关细节。由fab传入相应的参数就可以实现之前的多个主机执行多个任务的目标。现在先来看默认执行策略是什么样的。


执行策略

fabric函数默认是单个、顺序执行方式,当然它也提供并行执行。默认执行行为:

1.创建一个任务列表,这些任务就是fab命令的参数,并且保持fab传参的顺序

2.对于每个任务,会通过特定方式创建特定主机列表

Use Fabric Library 2013-03-16

使用类库--Library Use

Fabric最基本的用法是通过fabfiles和fab工具,而且这几乎占据整个官方文档内容。正如在开始简介中所介绍,fabric自身就是一个python类库,在文档中有一小部分也介绍了当fabric作为类库的使用。这部分就像官方文档所介绍一样,只是一个草稿,它主要讨论了fabric建立连接和断开连接的原理,对如何作为类库来使用,以及使用举例几乎没有谈到。更多的是建议直接阅读fabric源码中的main.py从使用fab来找到使用方式。

那么在python程序中如何使用fabric API呢.


Fab + Fabfile + OS

最容易想到的方式就是使用fabfile和fab工具,然后结合python的OS模块执行命令,用popen或subprocess来执行fab命令,但这显得很笨拙和混乱。


For + With + Env.host_string

MCollective With Puppet 2013-03-16

MCollective结合Puppet

Puppet给MCollective带来了什么

增强Puppet与MCollective联系,可以使MCollective更好利用Puppet资源来加快自己发展,并尽可能在将来将MCollective项目集成到Puppet平台。

目前能看见的应用就是Puppet资源作为Facts,Puppet Class作为过滤器。


MCollective给Puppet带来了什么

MCollective为采用Puppet模型驱动框架来进行系统管理的数千企业带来了多主机、多数据中心编排服务。结合MCollective,Puppet增加了重要的时间元素来进行系统管理。它同时也提高了Puppet管理现有系统上的应用程序的执行策略。MCollective的实时发现性能加上Puppet Dashboard,简化了用户使用Puppet平台数据来进行复杂队列活动的调度。这同时将消息队列与实时发现复杂网络资源相联系。

Fabfile and Fabricrc 2013-03-16

两个文件--Fabfile & Fabricrc

Fabfile

之前已经说过很多次fabfile, 也提到过这是一个python模块,但是也不去对。这需要知道fabric执行原理。fabric能够加载python模块(如fabfile.py)或者包(比如fabfile/目录下包含init.py)。默认情况下,它会寻找名叫fabfile或fabfile.py的东西。

Fabfile的搜索算法是需找用户当前活动目录,或者它的父目录。因此一般在一个项目中,把fabfile放在该项目源代码的根路径则在程序中任何地方都能使用fab命令。

Fabric现在是纯python,所以可以随时可以以任何方式import它的组件,为了封装与方便,现在所有7类核心API都被包括在模块fabril.api下。所有只需在fabfile开头中:

from fabric.api import *

Task List 2013-03-16

任务列表--Task List

有了主机列表,我们能指定任务执行的主机,下面就是对需要执行的任务的定义。在当前版本(1.1之后)fabric引进两种不同的任务定义方法。现在分别称之为新风格和经典风格。它们在判断fabfile中什么对象才是fabric的任务时(task)方式不同:

新风格认为Task的实例或者它的子类为任务,以及import的模块,而且允许创建嵌套的命名空间。

经典风格认为所有public的可调用对象(包括functions,classes等等),而且仅仅认为是fabfile中的对象才行而没有递归import的模块。

注意:这两种定义方式是相互排斥的,如果fabric发现任何新风格的任务对象在fabfile或它import的模块中时,它就会认为你已经使用这种新风格的任务声明,而不会考虑任何没有Task声明的对象。如果没有新风格任务发现,它会使用默认经典风格。可以通过命令fab --list查看可用任务名及说明。


新风格任务

Fab CLI 2013-03-16

工具命令--Fab Command Line

使用fabric最通用的方式是利用它的命令行工具--fab,安装fabric时这个需要添加到shell可执行路径下(一般默认pip install或easy_install都会)。fab同其他unix citizen一样,使用标准风格命令行切换,帮助输出等等。

在大多数情况下,fab可以直接调用而没有options,跟随一个或多个参数,这些是任务名(task name)。正如我们在前面所看到的,fab会在当前路径寻找fabfile,然后执行其中的task1和task2。

$ fab task1 task2

fab有很多命令行参数和选项供我们选择,而且很灵活。

Introduction To SimpleRPC 2013-03-16

SimpleRPC简介

MCollective是一个编写所有代理(agents)和客户端(clients)功能的框架,它提供了一个丰富的系统来实现这些。

虽然MCollective原生的客户很低级,就像TCP/IP之于HTTP,TCP/IP原生客户端也没有提供任何验证、授权等等。

MCollective Simple RPC是一个在标准客户端之上的框架,抽象了复杂性并提供了许多规则和标准。这有点像HTTP在TCP/IP之上创建REST服务。

SimpleRPC框架提供如下(分别针对客户端及代理):

提供编写代理(agents)和客户端(clients)的简单规则,有利于自定义设计。
很容易编写代理包括输入验证和错误时的合理反馈机制。
提供调用代理的审计日志记录能力
提供调用代理及动作的细粒度授权能力
拥有数据描述语言(DDL)用于描述代理和自动生成用户接口时给出提示
提供通用调用工具能够和大多数代理兼容
仍可以自定义客户端,简单易行
提供合理输出,DDL提供标准one-size-fits-all函数
标准客户端所有性能
核心格式(core format)之上的标准消息格式

Manage Output 2013-03-16

管理输出--Manage Output

Fab工具默认输出很详细,包括:远端的stderr和stdout输出,被执行的命令内容等等。这在很多情况下能够让我们知道到底发生了什么。Fab工具输出最大的特点是分层次,根据需求来获取不同的部分。


输出层次

为了组织任务输出,Fabric输出被分成了不重叠的层次或者组,每一部分可以被单独开启或关闭。这为向用户提供输出提供了很多便捷性。

标准输出层次

status:状态消息,fabric运行时没有,如果用户使用keyboard interrupt,或者主机断开连接会输出相关消息。这些详细总是相关的,很少冗长。

MCollective/Fabric Exec Commands 2013-03-16

MCollective/Fabric执行任务比较

定义主机

发现主机 MCollective有丰富的策略来发现主机,目前支持的有通过主机标识(identity,一般为主名)、puppet class、facts、安装的插件以及自定义数据源和自定义发现策略,很灵活。

Fabric仅仅使用主机名来定义主机,使用传统的SSH循环,关于这点比较在最开始已经提到过。

关键一点:MCollective对于需要执行任务的主机采用的主动发现的方式,而Fabric则是“被动”指出。

SSH behavior 2013-03-16

SSH行为--SSH behavior

Fabric现在是利用pure-python SSH重新实现连接管理,这意味着有些时候fabric也会受到这个库的局限。fabric既利用了很多SSH的特性,在有些地方同SSH命令行程序相比也不尽相同或者说灵活。


利用原生SSH配置文件

Fabric的实现允许加载用户SSH配置文件中的部分选项,这个行为默认是未被启用的。如果启用,设置env.usesshconfig = True,此时下面的这些SSH配置会被Fabric加载和使用:

[1]User和Port将会被作为合适的连接参数被使用,如果Fabric没有专门指定。这是User/Port选择规则是:

如果这些env变量未被指定,全局指定User/Port会替代当前默认(本地用户名和22)