### 使用 MCollective
**Marionette Collective**(简称为 **MCollective**)是一个系统管理工具。 MCollective 可以在大量服务器上并行运行命令,它采用广播架构, 所以,你可以使用它管理一个大型网络而不需要一个中央主服务器或资产数据库。
每台服务器都运行一个 MCollective 守护进程监听请求,并在本地执行命令或返回有关服务器的信息。 这也可以用来过滤目标服务器列表。 例如,你可以使用 MCollective 在符合特定条件的所有服务器上执行给定的命令。
你可以考虑将 MCollective 作为 Puppet 的一个补充(尽管它也可以与 Chef 或其他配置管理系统协同工作)。 例如,你配置一个新节点的过程可能需要改变其他机器上的防火墙配置,对数据库服务器授予适当的权限,等等。 这仅使用 Puppet 是不太容易做到的。虽然你可以使用 Shell 脚本和 SSH 自动化执行特定的工作, 但是 MCollective 提供了解决这个普遍问题的强大而灵活的方式。
#### 准备工作
1. MCollective 使用 ActiveMQ 消息代理框架(实际上,可以使用任何 STOMPcompliant 中间件, 但 ActiveMQ 是一个受欢迎的选择), ActiveMQ 需要 Java 运行环境, 如果你的系统还没有安装 Java,先安装它:
```
# apt-get install gcj-4.4-jre-headless
```
2. 到 ActiveMQ 下载页面 [http://activemq.apache.org/download.html](http://activemq.apache.org/download.html) 下载 “Unix 发布” 最近的稳定版 tar 包。
3. 安装 stomp gem :
```
# gem install stomp
```
4. 到 [http://www.puppetlabs.com/misc/download-options/](http://www.puppetlabs.com/misc/download-options/) 下载 MCollective 最近的稳定版 .deb 包。
5. 安装已下载的 .deb 包:
```
# dpkg -i mcollective_1.0.1-1_all.deb mcollective-client_1.0.1-1_
all.deb mcollective-common_1.0.1-1_all.deb
```
6. 从 MCollective 的下载页面下载与 .deb 版本相同的 tar 包 (因为其中包含了 ActiveMQ 配置文件样例)。
7. 编辑 MCollective 的 server.cfg 文件:
```
# vi /etc/mcollective/server.cfg
```
8. 将参数 plugin.stomp.host 设置为你的服务器名(即你运行 ActiveMQ 的服务器):
```
plugin.stomp.host = cookbook.bitfieldconsulting.com
```
9. 对 MCollective 的 client.cfg 文件做同样的设置:
```
# vi /etc/mcollective/client.cfg
```
10. 解压缩 MCollective 的 tar 包并复制 ActiveMQ 的配置文件样例到 /etc/mcollective:
```
# tar xvzf mcollective-1.0.1.tgz
# cp mcollective-1.0.1/ext/activemq/examples/single-broker/activemq.xml \
/etc/mcollective
```
11. 编辑这个配置文件设置 mcollective 用户的口令与 server.cfg 中的相同:
```
# vi /etc/mcollective/activemq.xml
```
12. 解压缩 ActiveMQ 的 tar 包,用指定的配置文件启动 ActiveMQ 的服务:
```
# tar xvzf apache-activemq-5.4.2-bin.tar.gz
# apache-activemq-5.4.2/bin/activemq start xbean:/etc/mcollective/
activemq.xml
INFO: Using default configuration
(you can configure options in one of these file: /etc/default/
activemq /root/.activemqrc)
INFO: Invoke the following command to create a configuration file
bin/activemq setup [ /etc/default/activemq | /root/.activemqrc ]
INFO: Using java '/usr/bin/java'
INFO: Starting - inspect logfiles specified in logging.properties
and log4j.properties to get details
INFO: pidfile created : '/root/apache-activemq-5.4.2/data/
activemq.pid' (pid '3322')
```
13. 启动 MCollective 的服务:
```
# service mcollective start
Starting mcollective: *
```
#### 操作步骤
1. 使用如下命令检查 MCollective 和 ActiveMQ 是否启动且正常运行:
```
# mc-ping
cookbook time=68.82 ms
---- ping statistics ----
1 replies max: 68.82 min: 68.82 avg: 68.82
```
2. 如果未看到任何结果输出,检查 mcollectived 守护进程是否已运行,并检查用于 ActiveMQ 的 Java 进程是否已运行。
3. 针对你的机器运行 mc-inventory 查看 MCollective 知道的关于 cookbook 机器的信息:
```
# mc-inventory cookbook
Inventory for cookbook:
Server Statistics:
Version: 1.0.1
Start Time: Mon Mar 07 11:44:53 -0700 2011
Config File: /etc/mcollective/server.cfg
Process ID: 4220
Total Messages: 14
Messages Passed Filters: 6
Messages Filtered: 5
Replies Sent: 5
Total Processor Time: 0.8 seconds
System Time: 0.47 seconds
Agents:
discovery rpcutil
Configuration Management Classes:
Facts:
mcollective => 1
```
4. 通过在 /etc/mcollective/facts.yaml 中添加如下的代码片段为服务器创建一个新的自定义 fact:
```
purpose: webserver
```
5. 现在使用 MCollective 查找所有匹配这个 fact 的机器:
```
# mc-find-hosts --with-fact purpose=webserver
cookbook
```
#### 工作原理
**MCollective** 是一个广播框架;当你发出一个像 mc-find-hosts 这样的请求时, MCollective 就为所有请求的客户端发送消息:“有没有客户匹配这个过滤器呀?” 所有匹配过滤器的客户端都会发送一个回复,MCollective 会将这些回复收集到一起并为你输出这些信息。
你可以为特定的任务安装大量的插件和代理(例如,运行 Puppet)。 这些插件和代理都是安装在客户端上的,MCollective 处理发送命令到所有匹配机器所涉及的通信, 并整理勘校其任何结果。
#### 更多用法
尽管我们只涉及了使用 MCollective 的一些基本步骤,但是它显然是一个功能强大的工具, 它既可以收集有关服务器的信息,也可以通过选择 fact 针对一个服务器列表执行命令。 例如,你可以获得一个过去 24 小时没有运行 Puppet 的机器列表。 又如,你可以对所有 Web 服务器或所有 x86_64 架构的机器执行一系列动作。
MCollective 本身只为这类应用提供了一个框架。对于不同的应用有各种各样的插件可用, 而且编写自己的插件也是很容易的。在下面的例子中,我们将使用 package 插件,此插件允许你查询和操作包。
##### 安装 MCollective 插件
1. 从 GitHub 克隆 MCollective 插件仓库:
```
# git clone https://github.com/puppetlabs/mcollective-plugins.git
```
2. 复制插件文件到适当的目录:
```
# cd mcollective-plugins
# cp agent/package/mc-package /usr/bin
# cp agent/package/puppet-package.rb \
/usr/share/mcollective/plugins/mcollective/agent/package.rb
# cp agent/package/package.ddl \
/usr/share/mcollective/plugins/mcollective/agent
```
3. 重新启动 MCollective:
```
# service mcollective restart
```
4. 运行 mc-inventory 检查该插件是否出现在 Agents 列表中:
```
# mc-inventory cookbook
Inventory for cookbook:
Server Statistics:
Version: 1.0.1
Start Time: Tue Mar 08 08:28:29 -0700 2011
Config File: /etc/mcollective/server.cfg
Process ID: 6047
Total Messages: 1
Messages Passed Filters: 1
Messages Filtered: 0
Replies Sent: 0
Total Processor Time: 0.04 seconds
System Time: 0.02 seconds
Agents:
discovery package rpcutil
Configuration Management Classes:
Facts:
mcollective => 1
purpose => webserver
```
5. 试着执行 mc-package 命令检验如下命令是否正常工作:
```
# mc-package status apache2
Do you really want to operate on packages unfiltered? (y/n): y
* [ =========================================================> ] 1 / 1
cookbook version = apache2-2.2.14-5ubuntu8.4
---- package agent summary ----
Nodes: 1 / 1
Versions: 1 * 2.2.14-5ubuntu8.4
Elapsed Time: 0.58 s
```
package 代理提供了一个强大的方法用于在你的整个网络(或特定的机器) 上检查包版本、安装或更新所需的软件包。 有关此插件和其他 MCollective 插件的更多细节,请查看 wiki 页面: [http://projects.puppetlabs.com/projects/mcollective-plugins/wiki](http://projects.puppetlabs.com/projects/mcollective-plugins/wiki) 。
有关 MCollective 的更多信息,请访问其主页: [http://docs.puppetlabs.com/mcollective/](http://docs.puppetlabs.com/mcollective/) 。
- Puppet 2.7 Cookbook 中文版
- 中文翻译版
- 译者序
- 项目缘起
- 翻译方法
- 社区链接
- 社区建议
- 贡献者
- 原书版权页
- 关于作者
- 前言
- 本书内容
- 阅读前提
- 适用读者
- 格式约定
- 读者反馈
- 客户支持
- 下载案例代码
- 勘误表
- Puppet 基础设施
- 使用版本控制
- 使用提交钩子
- 使用 Rake 部署变更
- 配置 Puppet 的文件服务器
- 从 cron 运行 Puppet
- 使用自动签名
- 预签名证书
- 从 Puppet 的 filebucket 检索文件
- 使用 Passenger 扩展 Puppet 的部署规模
- 创建去中心化的分布式 Puppet 架构
- 监控、报告和排错
- 生成报告
- 通过 Email 发送包含特定标签的日志信息
- 创建图形化报告
- 自动生成 HTML 文档
- 绘制依赖关系图
- 测试你的 Puppet 配置清单
- 执行模拟运行
- 检测编译错误
- 理解 Puppet 的错误信息
- 显示命令的输出结果
- 输出调试信息
- 检查配置设置
- 使用标签
- 使用运行阶段
- 使用不同的环境
- Puppet 语言及其写作风格
- 使用 Puppet 社区规范
- 使用模块
- 使用标准的命名规范
- 使用嵌入式 Ruby 代码
- 使用纯 Ruby 代码书写配置清单
- 遍历多个项目
- 书写强大的条件语句
- 在 if 语句中使用正则表达式
- 使用选择器和 case 语句
- 检测字符串中是否包含指定的值
- 使用正则表达式替换
- 书写更优质的配置清单
- 使用资源的数组
- 使用 define 资源
- 指定资源的依赖关系
- 使用节点继承
- 使用类的继承和重载
- 给类传递参数
- 书写可重用的跨平台配置清单
- 获得系统的环境信息
- 导入动态信息
- 从 CSV 文件导入数据
- 给 Shell 命令传递参数
- 使用文件和软件包
- 为配置文件添加配置行
- 使用 Augeas 自动修改配置文件
- 使用配置片段构建配置文件
- 使用 ERB 模板
- 在模板中遍历数组
- 从第三方仓库安装软件包
- 配置 APT 软件仓库
- 配置 GEM 仓库
- 从源码包自动构建软件
- 比较软件包的版本
- 用户和虚拟资源
- 使用虚拟资源
- 使用虚拟资源管理用户
- 管理用户基于密钥的 SSH 访问
- 管理用户的自定义文件
- 有效地分发 cron 任务
- 当文件更新时运行命令
- 使用主机资源
- 为文件资源指定多个源
- 使用文件资源递归地分发整个目录树
- 清理过期的旧文件
- 使用日程表资源
- 资源的审计
- 临时禁用资源
- 管理时区
- 应用程序
- 管理 Apache 服务
- 创建 Apache 虚拟主机
- 创建 Nginx 虚拟主机
- 创建 MySQL 数据库及用户
- 管理 Drupal 站点
- 管理 Rails 应用程序
- 服务器和云基础设施
- 部署 Nagios 监控服务器
- 使用 Heartbeat 构建高可用服务
- 管理 NFS 服务和文件共享
- 使用 HAProxy 为多个 web 服务器实现负载均衡
- 使用 iptables 管理防火墙
- 管理 Amazon 的 EC2 实例
- 使用 Vagrant 管理虚拟机
- 外部工具和 Puppet 生态环境
- 创建 Facter 的自定义 fact
- 在运行 Puppet 之前和之后执行命令
- 从 Shell 会话生成 Puppet 配置清单
- 从运行的系统上生成 Puppet 配置清单
- 使用 Puppet Dashboard
- 使用 Foreman
- 使用 MCollective
- 使用公共模块
- 使用外部节点分类器
- 创建自定义的资源类型
- 创建自定义的提供者