続・MCollectiveのインストールと動作確認

ずっと前に一度書いたMCollective、#devopsdaysで出てて、チラホラとブクマがついたりしてたのですが、いかんせん情報が古いし、インストールしてただけだしなので再度まとめてみます。

あとOrchestration的なものでいうと、自分の周りの今の状況は

  • Aサービスは管理サーバ全台でのコマンド実行兼デプロイツールを自作している
  • Bサービスはpssh使ってちょっと楽になった
  • Cサービスは未だにsshでログインして頑張ってる

みたいに結構バラバラで、じゃあCapistranoとかに一個決めてゴリゴリ頑張るかーというと何かちょっとそういう時代は一旦過ぎてダルくて、もう少しオペレーションフレンドリでいい感じのが無いかを模索していたところ、ちょっと見えてきた感があるのでそれも兼ねて。

特徴とかは以前のエントリに書いたから割愛。

テスト用の構成は

  • mcollective-client, activemq
    • manage01.tnmt.local
  • mcollective
    • test01.tnmt.local
    • test02.tnmt.local

いずれも CentOS 6.4 64bit です

共通 @ manage01, test01, test02

puppetlabsからリポジトリが提供されています

sudo rpm -ivh http://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-7.noarch.rpm

mcollective @ test001, test002

インストール

sudo yum install mcollective

設定

/etc/mcollective/server.cfg

  • plugin.stomp.host に activemq が動いてるサーバー
  • パスワードはあとでactivemqの設定にも関わる
--- /etc/mcollective/server.cfg.dist    2013-10-11 00:11:23.460791785 -0400
+++ /etc/mcollective/server.cfg 2013-10-11 00:12:03.895789609 -0400
@@ -11,10 +11,10 @@
 plugin.psk = unset

 connector = stomp
-plugin.stomp.host = localhost
+plugin.stomp.host = manage01.tnmt.local
 plugin.stomp.port = 61613
 plugin.stomp.user = mcollective
-plugin.stomp.password = secret
+plugin.stomp.password = XXXXXXXXXXXXXXXX

 # Facts
 factsource = yaml

サービススタート

sudo chkconfig mcollective on
sudo service mcollective start

mcollective-client @ manage01

インストール

sudo yum install mcollective-client

設定

/etc/mcollective/client.cfg

  • test01, test02のmcollectiveの設定と同様
--- /etc/mcollective/client.cfg.dist    2013-10-11 13:19:42.433764937 +0900
+++ /etc/mcollective/client.cfg 2013-10-11 14:10:07.740602159 +0900
@@ -10,10 +10,10 @@
 plugin.psk = unset

 connector = stomp
-plugin.stomp.host = localhost
+plugin.stomp.host = manage02.tnmt.local
 plugin.stomp.port = 61613
 plugin.stomp.user = mcollective
-plugin.stomp.password = secret
+plugin.stomp.password = XXXXXXXXXXXXXXXX

 # Facts
 factsource = yaml

activemq @ manage01

インストール

sudo yum install activemq activemq-info-provide

設定

/etc/activemq/active.xml

--- /etc/activemq/activemq.xml.dist  2013-10-11 00:30:03.212731536 -0400
+++ /etc/activemq/activemq.xml       2013-10-11 00:30:20.720730594 -0400
@@ -56,7 +56,7 @@
           -->
           <simpleAuthenticationPlugin>
             <users>
-              <authenticationUser username="mcollective" password="marionette" groups="mcollective,everyone"/>
+              <authenticationUser username="mcollective" password="XXXXXXXXXXXXXXXX" groups="mcollective,everyone"/>
               <authenticationUser username="admin" password="secret" groups="mcollective,admins,everyone"/>
             </users>
           </simpleAuthenticationPlugin>

サービススタート

sudo chkconfig activemq on
sudo service activemq start

動作確認

mco ping

mco ping
test01                                   time=140.58 ms
test02                                   time=151.34 ms


---- ping statistics ----
2 replies max: 151.34 min: 140.58 avg: 145.96

mco inventory

mco inventory test01
Inventory for test01:

   Server Statistics:
                      Version: 2.2.4
                   Start Time: Fri Oct 11 13:55:03 +0900 2013
                  Config File: /etc/mcollective/server.cfg
                  Collectives: mcollective
              Main Collective: mcollective
                   Process ID: 15492
               Total Messages: 191
      Messages Passed Filters: 9
            Messages Filtered: 2
             Expired Messages: 0
                 Replies Sent: 8
         Total Processor Time: 17.76 seconds
                  System Time: 9.03 seconds

   Agents:
      discovery       rpcutil

   Data Plugins:
      agent           fstat

   Configuration Management Classes:
      No classes applied

   Facts:
      mcollective => 1

mco rpc

Using MCollective Command Line Applicationsにある通りですが、RPCにてAgentに任意のオペレーションを実行することが出来ます。またこれらのAgent、オペレーションはプラグイン機構にて拡張が可能です。

service

test01, test02 でエージェントをインストール

sudo yum install mcollective-service-agent
sudo service mcollective restart 

manage01 でクライアントをインストール

クライアントをインストール

sudo yum install mcollective-service-client

pluginに追加される

mco plugin doc
Please specify a plugin. Available plugins are:

Agents:
  rpcutil                   General helpful actions that expose stats and internals to SimpleRPC clients
  service                   Start and stop system services

rpcにてオペレーションが行える。例えば全Agentでntpdの再起動をしたり。

mco rpc service restart service=ntpd
Discovering hosts using the mc method for 2 second(s) .... 2

 * [ ============================================================> ] 2 / 2



Summary of Service Status:

   running = 2


Finished processing 2 / 2 hosts in 976.89 ms

package

test01, test02 でエージェントをインストール

sudo yum install mcollective-package-agent
sudo service mcollective restart 

manage01 でクライアントをインストール

sudo yum install mcollective-package-client

pluginに追加される

mco plugin doc
Please specify a plugin. Available plugins are:

Agents:
  package                   Install and uninstall software packages
  rpcutil                   General helpful actions that expose stats and internals to SimpleRPC clients
  service                   Start and stop system services

rpcにてオペレーションが行える。mcollectiveパッケージの状況について

mco rpc package status package=mcollective
Discovering hosts using the mc method for 2 second(s) .... 2

 * [ ============================================================> ] 2 / 2


test02
          Arch: noarch
   description: Application Server for hosting Ruby code on any capable middleware
        Ensure: 2.2.4-1.el6
         Epoch: 0
          Name: 'mcollective
        Output: nil
      Provider: :yum
       Release: 1.el6
       Version: 2.2.4

test01
          Arch: noarch
   description: Application Server for hosting Ruby code on any capable middleware
        Ensure: 2.2.4-1.el6
         Epoch: 0
          Name: 'mcollective
        Output: nil
      Provider: :yum
       Release: 1.el6
       Version: 2.2.4


Summary of Arch:

   noarch = 2

Summary of Ensure:

   2.2.4-1.el6 = 2


Finished processing 2 / 2 hosts in 1863.58 ms

ドキュメントでは

mco rpc package status package=mcollective -j| jgrep "data.properties.ensure=2.0.0-6.el6" | mco rpc puppetd runonce

と特定バージョンのmcollectiveがインストールされているAgentに対してpuppetを一度実行するというワンライナーがありました。JSON形式で結果取得とかも出来るんですね。jgrepでパース。

Selecting Request Targets Using Filters

mcoコマンド単体だと全Agentが対象になりますが、--with-agent, --with-factで対象の絞り込みが出来ます。

FilteringとPuppetとの連携

これはPuppetを利用していてMaster,Agent型を取っているとさらに便利な機構なんですが、Agentで適用されているClassでのフィルタリングも--with-classで指定出来ます。

Master,Agent型を取っているのはもう少し細かく言うと

  • puppet agent 時にデフォルトで /var/lib/puppet/state/classes.txt に適用されたクラス一覧が記録される
  • mcollective が該当ファイルを読み込む

ことで協調して動くという具合です。

mco inventory test01
Inventory for test01:

   Server Statistics:
                      Version: 2.2.4
                   Start Time: Fri Oct 11 00:47:50 +0900 2013
                  Config File: /etc/mcollective/server.cfg
                  Collectives: mcollective
              Main Collective: mcollective
                   Process ID: 13349
               Total Messages: 31
      Messages Passed Filters: 31
            Messages Filtered: 0
             Expired Messages: 0
                 Replies Sent: 30
         Total Processor Time: 0.32 seconds
                  System Time: 0.11 seconds

   Agents:
      discovery       package         puppet
      rpcutil         service

   Data Plugins:
      agent           fstat           puppet
      resource        service

   Configuration Management Classes:
      app                            app::deploy
      app::package                   app::unicorn
      base                           base::file
      base::iptables                 base::munin
      base::nrpe                     base::package
      base::perl                     base::puppet
      base::service                  base::ssh
      base::users_and_groups         monit
      monit::config                  monit::install
      monit::service                 munin::node
      munin::node::config            munin::node::install
      munin::node::service           newrelic
      newrelic::config               newrelic::install
      newrelic::service              newrelic::yumrepository
      openssh-server                 openssh-server::config
      openssh-server::install        openssh-server::service
      puppet::config                 puppet::install
      puppet::service                puppet::yumrepo
      rbenv                          rbenv::config
      rbenv::install                 settings
      tcp_wrapper                    tcp_wrapper::config

   Facts:
         mcollective => 1

unicoronが動くように構築してたサーバ全台でnginxをリスタートしたいぜーといった場合に

mco rpc --with-class app::unicorn service restart service=nginx

などなど

その他

Puppetでも puppet apply でマスターレスな運用が流行ってきている今日このごろですが、puppet apply は classfile を書き出さないので連携が出来ないというのが現状のようで。
こはいくつか議論があるようです

私見としては

  • ローカル環境ややCI環境ではpuppet applyによる単独実行
  • プロダクション環境ではpuppet agentmcoによるオペレーション

がいいとこどりで良さそうかなと。

複数サービスがある場合でも一箇所による集中管理が出来そうだし(ActiveMQ周りでの権限管理も結構細かく制御出来そう)、サービスごとにセットたてても良いと思います。

て書いてたけどMCollectiveやっぱり便利そうだよ>昔の自分

MCollectiveのインストールと動作確認

MCollective - Marionette Collective AKA MCollective - が気になったので試してみました。

mcollectiveはPuppet を作っているpuppet labs のプロダクトです。ruby製。

日本語で紹介されているこちらのエントリでは、以下のように分かりやすく解説がされていました。

一言で言うと、"定例作業を効率的に行うのがpuppet/chefの役割"で、"MCollectiveは非定例作業を効率的に行う"ことのできるツールです。

本家のサイトの紹介を見ると、"複数のサーバー群に対して任意のオペレーションを並列実行するためのフレームワーク"とされています。同じような作業を行う為のフレームワーク・ツールとしては他にもFunc, Capistrano, Fabricが同じく紹介されています。(最後の知らない。)Capistranoはデプロイツールとして有名ですね。

他のツールと比べて、MCollectiveのポイントは以下の2つだと感じました。

  • サーバー群に対して設置場所(たとえばDCや、国とかも)を意識せず
  • シンプル且つスピーディーにオペレーションを行う

あるクライアントから複数サーバー群に対して任意の作業を行うときに、普通であれば

  • クライアント -> サーバー群で 1:m

であったのが、MCollectiveは

  • クライアント -> 作業を管理する並列キューシステム -> サーバー群で 1:n:m

と一枚噛んでます。この真ん中の並列キューシステムが上記の2つのポイントの肝になっているという感じでしょうか。
より詳細なアーキテクチャの解説がされている、本家のスライドはこちら

何はともあれ動かしてみたいと思います。

各要素に必要なパッケージは以下のようになっています。

  • クライアント: mcollective-client
  • 作業を管理するキューシステム: activemq
  • サーバー群: mcollective

今回は以下のホスト構成にイントールしました。
全台 CentOS 5.5 x86_64, ほか依存するとこだとrubyだけど、ruby-1.8.5-5.el5_4.8, rubygems-1.3.1-1.el5, あとついでに facter-1.5.8-1.el5

  • collective-client, activemq
    • manage01.tnmt.local
  • collective
    • test01.tnmt.local
    • test02.tnmt.local

共通 @ manage01, test01, test02

事前に必要なツールのインストール。

mcollectiveがrubyのメッセージキュークライアントを使ってるのでそちらを

sudo yum -y --enablerepo=epel install rubygem-stomp rubygems

mcollectiveの共通コンポーネント

wget  http://puppetlabs.com/downloads/mcollective/mcollective-common-1.0.0-2.el5.noarch.rpm</kbd>
sudo rpm -Uvh mcollective-common-1.0.0-2.el5.noarch.rpm

mcollective @ test001, test002

mcollective インストール

wget  http://puppetlabs.com/downloads/mcollective/mcollective-1.0.0-2.el5.noarch.rpm</kbd>
sudo rpm -Uvh mcollective-1.0.0-2.el5.noarch.rpm

設定

/etc/mcollective/server.cfg が設定ファイルになります。 plugin.stomp.host に activemq が動いてるサーバーを指定ですね。パスワードは伏せてありますが変更してあります、あとでactivemqの設定にも関わってきます。

--- /etc/mcollective/server.cfg.dist    2010-12-12 02:01:11.000000000 +0900
+++ /etc/mcollective/server.cfg 2011-02-26 14:14:10.000000000 +0900
@@ -9,10 +9,10 @@
 plugin.psk = unset

 connector = stomp
-plugin.stomp.host = stomp.example.com
+plugin.stomp.host = manage01.tnmt.local
 plugin.stomp.port = 6163
 plugin.stomp.user = mcollective
-plugin.stomp.password = marionette
+plugin.stomp.password = XXXXXXXXXXXXXXXX

 # Facts
 factsource = yaml

サービススタート

sudo /etc/init.d/mcollective start

mcollective-client @ manage01

インストール

wget  http://puppetlabs.com/downloads/mcollective/mcollective-client-1.0.0-2.el5.noarch.rpm
sudo rpm -Uvh mcollective-client-1.0.0-2.el5.noarch.rpm

設定

/etc/mcollective/client.cfg を編集。箇所は先ほどと同じく activemq が動くホストを指定。

--- /etc/mcollective/client.cfg.dist    2010-12-12 02:01:11.000000000 +0900
+++ /etc/mcollective/client.cfg 2011-02-26 14:12:06.000000000 +0900
@@ -8,10 +8,10 @@
 plugin.psk = unset

 connector = stomp
-plugin.stomp.host = stomp.example.com
+plugin.stomp.host = manage01.tnmt.local
 plugin.stomp.port = 6163
 plugin.stomp.user = mcollective
-plugin.stomp.password = marionette
+plugin.stomp.password = XXXXXXXXXXXXXXXX

 # Facts
 factsource = yaml

activemq @ manage01

ActiveMQはJMS実装のプロダクトです。こいつがmcollective, mcollective-client双方のメッセージのやりとりを介してくれます。JMSの名の通り中身はJava

インストール

Javaインストール

sudo yum -y install java-1.6.0-openjdk

puppetlabsから提供されてるパッケージをまとめてインストール

for package in tanukiwrapper-3.2.3-1jpp.x86_64.rpm  activemq-5.4.0-2.el5.noarch.rpm activemq-info-provider-5.4.0-2.el5.noarch.rpm
do 
sudo rpm -Uvh http://puppetlabs.com/downloads/mcollective/$package
done

設定

mcollective用の設定を読むように /etc/activemq/activemq-wrapper.conf 編集

--- /etc/activemq/activemq-wrapper.conf.dist    2010-08-18 05:48:16.000000000 +0900
+++ /etc/activemq/activemq-wrapper.conf 2011-01-26 13:23:01.000000000 +0900
@@ -82,7 +82,7 @@
 # Application parameters. activemq.xml will be loaded from the config directory
 wrapper.app.parameter.1=org.apache.activemq.console.Main
 wrapper.app.parameter.2=start
-wrapper.app.parameter.3-xbean:activemq.xml
+wrapper.app.parameter.3=xbean:mcollective.xml

 #********************************************************************
 # Wrapper Logging Properties

mcollective用の設定 /etc/activemq/mcollective.xml 作成。simpleAuthenticationPluginのauthenticationUserという項目がありますが、ここには mcollective, mcollective-client の設定で変更したパスワードが入ります。

<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:amq="http://activemq.apache.org/schema/core"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd
    http://activemq.apache.org/camel/schema/spring http://activemq.apache.org/camel/schema/spring/camel-spring.xsd">
 
    <broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" useJmx="true">
        <plugins>
            <authorizationPlugin>
                <map>
                    <authorizationMap>
                        <authorizationEntries>
                            <authorizationEntry topic="<span id="searchword">mcollective</span>.>" write="systemusers" read="systemusers" admin="systemusers" />
                            <authorizationEntry topic="ActiveMQ.Advisory.>" read="everyone,all" write="everyone,all" admin="everyone,all"/>
                        </authorizationEntries>
                    </authorizationMap>
                </map>
            </authorizationPlugin>
 
            <simpleAuthenticationPlugin>
                <users>
                    <authenticationUser username="mcollective" password="XXXXXXXXXXXXXXXX" groups="systemusers,everyone"/>
                </users>
            </simpleAuthenticationPlugin>
        </plugins>
 
        <transportConnectors>
            <transportConnector name="openwire" uri="tcp://0.0.0.0:6166" />
            <transportConnector name="stomp"   uri="stomp://0.0.0.0:6163" />
        </transportConnectors>
    </broker>
</beans>

サービススタート

sudo /etc/init.d/activemq start

起動したかどうか、/var/log/activemq/activemq.logあたり見るとよいかと思います。
これで試す準備ができました。

動作確認

ひとまず動作確認ということで、mcollectiveがインストールされてホストをリストしてみます。

mc-find-hosts
test01.tnmt.local
test02.tnmt.local

続いて全台にping打ってみる

mc-ping
test01.tnmt.local                        time=63.35 ms
test02.tnmt.local                        time=101.06 ms

---- ping statistics ----
2 replies max: 101.06 min: 63.35 avg: 82.21

返ってきますね。対象のホストの状況を確認してみる。

mc-inventory test01.tnmt.local
Inventory for test01.tnmt.local:

   Server Statistics:
                      Version: 1.0.0
                   Start Time: Sat Feb 26 13:38:54 +0900 2011
                  Config File: /etc/mcollective/server.cfg
                   Process ID: 24564
               Total Messages: 3
      Messages Passed Filters: 3
            Messages Filtered: 0
                 Replies Sent: 2
         Total Processor Time: 0.06 seconds
                  System Time: 0.19 seconds

   Agents:
      discovery       rpcutil

   Configuration Management Classes:
      base                           test01.tnmt.local


   Facts:
      mcollective => 1

インストールは完了したので、もう少し色々と触ってみます。

  • プラグイン機構で行えるオペレーション追加
  • puppetのfacterを共有して特定条件ホストでのオペレーション

等々