MCollectiveまとめ(セットアップ編)
MCollectiveとは
MCollective(正式名称はMarionette Collectiveのようです)はPuppet Labsが開発した複数のサーバに対してジョブを実行するための仕組みです。原文の説明では“統合的なサーバ構築のフレームワーク、もしくは並列ジョブ実行のためのシステムである”とされています。多くの方がサーバ管理タスクをまとめて、プログラムから実行するのに使っているようです。MCollectiveはApache 2ライセンスで配布されています。
MCollectiveの特徴
MCollectiveは多数のサーバ群で動作するのに都合がよい特徴を備えています。
ホストのリストを使わない
代わりにPuppetDBのようなデータソースや、ネットワーク上でリアルタイムにホストを探す仕組みを持っています。
それぞれのホストが直接接続しない
代わりにミドルウェアをホスト間のコミュニケーションの手段として用いています。
またMCollectiveにより、以下のような事を実現できるとされています。
小規模から大規模までサーバ群を制御
サーバ群に対するコマンドをブロードキャスト
パラレルsshなどを使っても比較的難しい、全サーバ群に対して完全に同じタイミングでコマンドを投げるといった事ができます。また条件を指定し、マッチするサーバだけがコマンドを実行するといった事も可能です。そのためのデータベースも不要でネットワークだけがつながっていれば良いのです。
簡易なインベントリ管理
SSLベースのセキュリティ
利用するミドルウェアが持つセキュリティ機構を使えます。
MCollectiveのインストール
MCollectiveの仕組みですが、ざっと以下の図のようになります。
中心に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などを使ってダウンロードして配置しましょう。あとトラブルを避けるためにSELinuxとiptablesは無効にしておきましょう。これらが有効になっていると間違いなく動きません。iptablesを使いたい場合でも一度無効の状態で動作確認してからルールを追加するようにしたほうが身のためです…。
-
以下のコマンドラインでパッケージをインストールします。
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
設定
-
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のコマンドや便利な使い方を紹介します。(`・ω・´)