続・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やっぱり便利そうだよ>昔の自分