使用 MCollective
Marionette Collective(简称为 MCollective)是一个系统管理工具。 MCollective 可以在大量服务器上并行运行命令,它采用广播架构, 所以,你可以使用它管理一个大型网络而不需要一个中央主服务器或资产数据库。
每台服务器都运行一个 MCollective 守护进程监听请求,并在本地执行命令或返回有关服务器的信息。 这也可以用来过滤目标服务器列表。 例如,你可以使用 MCollective 在符合特定条件的所有服务器上执行给定的命令。
你可以考虑将 MCollective 作为 Puppet 的一个补充(尽管它也可以与 Chef 或其他配置管理系统协同工作)。 例如,你配置一个新节点的过程可能需要改变其他机器上的防火墙配置,对数据库服务器授予适当的权限,等等。 这仅使用 Puppet 是不太容易做到的。虽然你可以使用 Shell 脚本和 SSH 自动化执行特定的工作, 但是 MCollective 提供了解决这个普遍问题的强大而灵活的方式。
准备工作
MCollective 使用 ActiveMQ 消息代理框架(实际上,可以使用任何 STOMPcompliant 中间件, 但 ActiveMQ 是一个受欢迎的选择), ActiveMQ 需要 Java 运行环境, 如果你的系统还没有安装 Java,先安装它:
# apt-get install gcj-4.4-jre-headless
到 ActiveMQ 下载页面 http://activemq.apache.org/download.html 下载 “Unix 发布” 最近的稳定版 tar 包。
安装 stomp gem :
# gem install stomp
到 http://www.puppetlabs.com/misc/download-options/ 下载 MCollective 最近的稳定版 .deb 包。
安装已下载的 .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
从 MCollective 的下载页面下载与 .deb 版本相同的 tar 包 (因为其中包含了 ActiveMQ 配置文件样例)。
编辑 MCollective 的 server.cfg 文件:
# vi /etc/mcollective/server.cfg
将参数 plugin.stomp.host 设置为你的服务器名(即你运行 ActiveMQ 的服务器):
plugin.stomp.host = cookbook.bitfieldconsulting.com
对 MCollective 的 client.cfg 文件做同样的设置:
# vi /etc/mcollective/client.cfg
解压缩 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
编辑这个配置文件设置 mcollective 用户的口令与 server.cfg 中的相同:
# vi /etc/mcollective/activemq.xml
解压缩 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')
启动 MCollective 的服务:
# service mcollective start Starting mcollective: *
操作步骤
使用如下命令检查 MCollective 和 ActiveMQ 是否启动且正常运行:
# mc-ping cookbook time=68.82 ms ---- ping statistics ---- 1 replies max: 68.82 min: 68.82 avg: 68.82
如果未看到任何结果输出,检查 mcollectived 守护进程是否已运行,并检查用于 ActiveMQ 的 Java 进程是否已运行。
针对你的机器运行 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
通过在 /etc/mcollective/facts.yaml 中添加如下的代码片段为服务器创建一个新的自定义 fact:
purpose: webserver
现在使用 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 插件
从 GitHub 克隆 MCollective 插件仓库:
# git clone https://github.com/puppetlabs/mcollective-plugins.git
复制插件文件到适当的目录:
# 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
重新启动 MCollective:
# service mcollective restart
运行 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
试着执行 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 。
有关 MCollective 的更多信息,请访问其主页: http://docs.puppetlabs.com/mcollective/ 。