使用 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 下载 “Unix 发布” 最近的稳定版 tar 包。

  3. 安装 stomp gem :

    # gem install stomp
    
  4. 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

    有关 MCollective 的更多信息,请访问其主页: http://docs.puppetlabs.com/mcollective/