でんかのブログ

テクニカル系ネタをメインに、つれづれなるままに書いていきます。

MCollectiveまとめ(セットアップ編)

MCollectiveとは

MCollective(正式名称はMarionette Collectiveのようです)はPuppet Labsが開発した複数のサーバに対してジョブを実行するための仕組みです。原文の説明では“統合的なサーバ構築のフレームワーク、もしくは並列ジョブ実行のためのシステムである”とされています。多くの方がサーバ管理タスクをまとめて、プログラムから実行するのに使っているようです。MCollectiveはApache 2ライセンスで配布されています。

MCollectiveの特徴

MCollectiveは多数のサーバ群で動作するのに都合がよい特徴を備えています。

  • ホストのリストを使わない

    代わりにPuppetDBのようなデータソースや、ネットワーク上でリアルタイムにホストを探す仕組みを持っています。

  • それぞれのホストが直接接続しない

    代わりにミドルウェアをホスト間のコミュニケーションの手段として用いています。

    またMCollectiveにより、以下のような事を実現できるとされています。

  • 小規模から大規模までサーバ群を制御

  • サーバ群に対するコマンドをブロードキャスト

    パラレルsshなどを使っても比較的難しい、全サーバ群に対して完全に同じタイミングでコマンドを投げるといった事ができます。また条件を指定し、マッチするサーバだけがコマンドを実行するといった事も可能です。そのためのデータベースも不要でネットワークだけがつながっていれば良いのです。

  • シンプルなコマンドラインツール

    制御するためのコマンドラインツールはとてもシンプルです。

  • 簡易なインベントリ管理

    各サーバに予めYAML形式で情報を記載しておけば簡易なインベントリレポート作成ツールとしても使えます。

  • SSLベースのセキュリティ

    利用するミドルウェアが持つセキュリティ機構を使えます。

MCollectiveのインストール

MCollectiveの仕組みですが、ざっと以下の図のようになります。

f:id:denkas:20150509183212j:plain

中心にActiveMQなどのメッセージを配信するミドルウェア(以下、本記事ではActiveMQ前提で書きます)が居ます。MCollectiveにコマンドを投げるクライアントはこのActiveMQに対してメッセージを投げ、MCollectiveによりコマンドを受けるサーバはActiveMQをポーリングし、メッセージが来たら受け取り解釈し、必要ならコマンドを実行して結果を返すというとてもシンプルな仕組みです。

前準備としてとしてhostsファイルに自身とActiveMQが動作するホストのホスト名が記載されている必要がありますので記述しておきます。Puppetのマニフェストだと以下のようになります。

    host {
        $::fqdn: ip=>$::ipaddress, ;
        [ActiveMQのホスト名]: ip=>[ActiveMQのIPアドレス],
    }

次にパッケージをインストールします。本記事ではCentOS6系について書きますので、他のディストリビュージョンについては以下のURLを参照してください。

MCollective » Deploy » Standard Deployment — Documentation — Puppet Labs

  • 共通作業

    MCollectiveのパッケージはPuppet LabsのYumリポジトリから取得しますので、以下のコマンドを実行してPuppet Lasのリポジトリを登録しておきます。

      rpm -ivh http://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm
    

    インターネットに接続できない環境の場合は、yumdownloaderなどを使ってダウンロードして配置しましょう。あとトラブルを避けるためにSELinuxiptablesは無効にしておきましょう。これらが有効になっていると間違いなく動きません。iptablesを使いたい場合でも一度無効の状態で動作確認してからルールを追加するようにしたほうが身のためです…。

  • ActiveMQ

    以下のコマンドラインでパッケージをインストールします。

      yum install activemq activemq-info-provider java-1.7.0-openjdk
    

    ここで注意が必要なのですが、RHEL6系でJDK8を使うとエラーが発生して上手く動作しない現象を確認しています。恐らくパッケージ間のバージョン依存の問題だとは思うのですが、結局解決できませんでしたのでJDK7の利用をお勧めします。ちなみにCentOS7で試した時にはJDK8でも問題なく動作したのですが…なぜなんでしょう。。。(´・ω・`)

  • MCollectiveクライアント(MCollectiveの操作をする端末)

    以下のコマンドラインでパッケージをインストールします。

      yum install mcollective mcollective-client mcollective-common rubygem-stomp
    

    次に追加するエージェントをインストールします。本来は必要なものを入れればよいのでしょうけど、面倒なので“全部入り”にしちゃいます。

      yum install mcollective-actionpolicy-auth mcollective-client mcollective-common mcollective-facter-facts mcollective-filemgr-agent mcollective-filemgr-client mcollective-filemgr-common mcollective-iptables-client mcollective-iptables-common mcollective-logstash-audit mcollective-nettest-client mcollective-nettest-common mcollective-nrpe-client mcollective-nrpe-common mcollective-package-client mcollective-package-common mcollective-puppet-client mcollective-puppet-common mcollective-service-client mcollective-service-common mcollective-sshkey-security mcollective-sysctl-data
    

    ちなみにパッケージ名は“○○○-common”が全共通、“○○○-client”がクライアント専用のパッケージ、“○○○-agent”がエージェント専用のパッケージという命名規則になっているそうです。

  • MCollectiveサーバ(MCollectiveにより操作されるサーバ)

    以下のコマンドラインでパッケージをインストールします。

      yum install mcollective mcollective-common rubygem-stomp
    

    次に必要なエージェントをインストールします。ここでも“全部入り”にしちゃいます。

      yum install mcollective-actionpolicy-auth mcollective-common mcollective-facter-facts mcollective-filemgr-agent mcollective-filemgr-common mcollective-iptables-agent mcollective-iptables-common mcollective-logstash-audit mcollective-nettest-agent mcollective-nettest-common mcollective-nrpe-agent mcollective-nrpe-common mcollective-package-agent  mcollective-package-common mcollective-puppet-agent mcollective-puppet-common mcollective-service-agent mcollective-service-common mcollective-sshkey-security mcollective-sysctl-data
    
  • 本記事の検証環境インストール

    面倒なのでVMを二つ用意して、一つをクライアント兼サーバ兼ActiveMQ、もう一つをサーバのみとしています。前者のインストールコマンドを以下のようになります。

      yum install mcollective mcollective-client mcollective-common rubygem-stomp
      yum install activemq activemq-info-provider java-1.7.0-openjdk
      yum install mcollective-actionpolicy-auth mcollective-client mcollective-common mcollective-facter-facts mcollective-filemgr-agent mcollective-filemgr-client mcollective-filemgr-common mcollective-iptables-agent mcollective-iptables-client mcollective-iptables-common mcollective-logstash-audit mcollective-nettest-agent mcollective-nettest-client mcollective-nettest-common mcollective-nrpe-agent mcollective-nrpe-client mcollective-nrpe-common mcollective-package-agent mcollective-package-client mcollective-package-common mcollective-puppet-agent mcollective-puppet-client mcollective-puppet-common mcollective-service-agent mcollective-service-client mcollective-service-common mcollective-sshkey-security mcollective-sysctl-data
    

    後者は以下のようになります。

      yum install mcollective mcollective-service-agent
      yum install mcollective-actionpolicy-auth mcollective-facter-facts mcollective-filemgr-agent mcollective-iptables-agent mcollective-logstash-audit mcollective-nettest-agent mcollective-nrpe-agent mc[f:id:denkas:20150506140245j:plain]ollective-package-agent mcollective-puppet-agent mcollective-sshkey-security mcollective-sysctl-data
    

設定

  • ActiveMQ

    MCollectiveはActiveMQが無いと使えません。というワケでまずはActiveMQの設定です。/etc/activemq/activemq.xmlに設定を追加します。場所は64行目辺りの以下のブロックの間に挿入します。

      <managementContext>
          <managementContext createConnector="false"/>
      </managementContext>
    
      !!!!!ここに追加!!!!!
    
      <!--
          Configure message persistence for the broker. The default persistence
          mechanism is the KahaDB store (identified by the kahaDB tag).
          For more information, see:
    
          http://activemq.apache.org/persistence.html
      -->
    

    追加するブロックは以下の内容です。

      <plugins>
        <statisticsBrokerPlugin/>
    
        <!--
          This configures the users and groups used by this broker. Groups
          are referenced below, in the write/read/admin attributes
          of each authorizationEntry element.
        -->
        <simpleAuthenticationPlugin>
          <users>
            <authenticationUser username="mcollective" password="marionette" groups="mcollective,everyone"/>
            <authenticationUser username="admin" password="secret" groups="mcollective,admins,everyone"/>
          </users>
        </simpleAuthenticationPlugin>
    
        <!--
          Configure which users are allowed to read and write where. Permissions
          are organized by group; groups are configured above, in the
          authentication plugin.
    
          With the rules below, both servers and admin users belong to group
          mcollective, which can both issue and respond to commands. For an
          example that splits permissions and doesn't allow servers to issue
          commands, see:
          http://docs.puppetlabs.com/mcollective/deploy/middleware/activemq.html#detailed-restrictions
        -->
        <authorizationPlugin>
          <map>
            <authorizationMap>
              <authorizationEntries>
                <authorizationEntry queue=">" write="admins" read="admins" admin="admins" />
                <authorizationEntry topic=">" write="admins" read="admins" admin="admins" />
                <authorizationEntry topic="mcollective.>" write="mcollective" read="mcollective" admin="mcollective" />
                <authorizationEntry queue="mcollective.>" write="mcollective" read="mcollective" admin="mcollective" />
                <!--
                  The advisory topics are part of ActiveMQ, and all users need access to them.
                  The "everyone" group is not special; you need to ensure every user is a member.
                -->
                <authorizationEntry topic="ActiveMQ.Advisory.>" read="everyone" write="everyone" admin="everyone"/>
              </authorizationEntries>
            </authorizationMap>
          </map>
        </authorizationPlugin>
      </plugins>
    

    ユーザ名やパスワードを変更したい場合はauthenticationUserの属性を適当に変更します。設定が完了したら以下のコマンドを実行してサービスを開始しましょう。

      chkconfig activemq on
      service activemq start
    

    netstat -lを実行してみて、61613番、61614番、61616番ポートをLISTENしていればOKです。LISTENしていない場合は/var/log/activemq/activemq.logを確認の上、設定を見直してください。

  • MCollectiveの設定

    設定ファイルはサーバが/etc/mcollective/server.cfg、クライアントが/etc/mcollective/client.cfgですが、基本的にそのままで問題ありません。ただしActiveMQのホスト名だけは適切に設定してください。plugin.activemq.pool.1.hostにActiveMQのホスト名を記述します。またもしActiveMQのユーザ名やパスワードを変更した場合は適切に変更してください。

    本記事ではSSLを使わない簡易な設定にしたのでこれだけで済みますが、もしActiveMQとの通信路をSSL暗号化するのであれば以下のURLを参考にしてください。その場合ポート番号が61614になるので注意してください。ちなみに僕は証明書の問題解決が難しすぎて挫折しましたが…。(´・ω・`)

    MCollective » Deploy » Standard Deployment — Documentation — Puppet Labs

MCollectiveの動作確認

お待ちかねMCollectiveの動作確認です。MCollectiveが動作する各ノードと疎通できるかはmco pingコマンドで確認できます。

# mco ping
vcol                                     time=21.90 ms
cent65                                   time=60.96 ms

---- ping statistics ----
2 replies max: 60.96 min: 21.90 avg: 41.43

このようになりましたか?ここではvcolがActiveMQ兼サーバ兼クライアント、cent65がサーバとしてセットアップしています。コマンドはクライアントがインストールされているvcolから実行しています。もし特定のホストが抜けているなどありましたら設定を見直してください。次はインベントリ情報を確認してみましょう。cent65のインベントリ情報を確認する場合は以下のように実行します。

# mco inventory cent65
Inventory for cent65:

   Server Statistics:
                      Version: 2.8.1
                   Start Time: Wed May 06 11:50:38 +0900 2015
                  Config File: /etc/mcollective/server.cfg
                  Collectives: mcollective
              Main Collective: mcollective
                   Process ID: 953
               Total Messages: 3
      Messages Passed Filters: 3
            Messages Filtered: 0
             Expired Messages: 0
                     Replies Sent: 2
         Total Processor Time: 13.25 seconds
                  System Time: 21.94 seconds

   Agents:
      discovery       filemgr         nrpe
      package         puppet          rpcutil
      service

   Data Plugins:
      agent           collective      fact
      fstat           nrpe            puppet
      resource        service         sysctl

   Configuration Management Classes:
    settings

   Facts:
      mcollective => 1

なんかいっぱい情報が出てきました。最初の“Server Statistics”はそのまんまの意味でサーバの統計情報です。“Agents”と“Data Plugins”はインストールされているエージェントやプラグインの情報です。

“Configuration Management Classes”はPuppetで適用したクラスの情報です。デフォルトでは/var/lib/puppet/classes.txtにファイルがあります。

“Facts”はPuppetのFacterみたいなものですが、facterの情報を取れる訳ではなく、/etc/mcollective/facts.yamlに記載された情報を出力しています。もしfacterの情報を出力したいのであれば、cronなどでfacterの出力をリダイレクトすれば実現できますが、一部フォーマットに互換性がありませんので若干の整形は必要です。ではちょっと実験してみます。cent65側の/etc/mcollective/facts.yamlに以下のように行を追加してみます。

---
mcollective: 1
test_flag: 1234
---

デフォルトではmcollectiveの行だけでしたが、test_flagの行を追加しました。mco inventory cent65を再実行してみましょう。結果は以下のようになりましたか。

Facts:
   mcollective => 1
   test_flag => 1234

これを使って後で紹介する“特定の条件に当てはまるサーバでだけ実行”のような際の条件としてこのFactsを使う事ができます。

長くなったのでここで一旦切ります。次回はMCollectiveのコマンドや便利な使い方を紹介します。(`・ω・´)