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

puppet 2.6 インストール(アップグレード)&ファーストインプレッション

前に @mikeda さんがこう言ってたので、とりあえず自宅環境の0.25を2.6にアップグレードしてみることにしました。

アップグレード

あらかじめ CentOS 5.5 x86_64 で puppet 0.25.5 が稼働している環境になります。新規にインストールする場合はもう少し手順が多いかもしれません。0.25 自体は epel リポジトリから入れてるので、epel が入っていれば、必要なパッケージは全部入ると思います。

puppet 2.6系のyumリポジトリ登録

sudo wget http://tmz.fedorapeople.org/repo/puppet/epel/puppet.repo -P /etc/yum.repos.d

インストール

sudo yum install puppet puppet-server

簡単。今日時点でバージョンは 2.6.3 でした。

puppet.conf修正

そのままpuppetmasterdを起動しなおして、puppetdで接続も出来たんですが、以下のWarningが出ます。

warning: You have configuration parameter $factsync specified in [puppetd], which is a deprecated section. I'm assuming you meant [agent]
warning: You have configuration parameter $ssldir specified in [puppetd], which is a deprecated section. I'm assuming you meant [agent]
warning: You have configuration parameter $factsource specified in [puppetd], which is a deprecated section. I'm assuming you meant [agent]
warning: You have configuration parameter $templatedir specified in [puppetmasterd], which is a deprecated section. I'm assuming you meant [master]
warning: You have configuration parameter $ssldir specified in [puppetmasterd], which is a deprecated section. I'm assuming you meant [master]
warning: You have configuration parameter $modulepath specified in [puppetmasterd], which is a deprecated section. I'm assuming you meant [master]
warning: You have configuration parameter $manifestdir specified in [puppetmasterd], which is a deprecated section. I'm assuming you meant [master]
warning: Fact syncing is deprecated as of 0.25 -- use 'pluginsync' instead

エラーにはなりませんでした。/etc/puppet/puppet.conf で [puppetmasterd] となってる記述を [master] に、 [puppetd] となってる記述を [agent] にしてやると大分 Warning が減ります。長い記載が短くなっていいですね。
facterの部分は公式のWiki見ても、最下部にpluginアプローチに変わると記載があります。pluginってあまり使ったことないなー。。今回はスルー。

puppet実行スタイル

2.6のリリースノート見ると、沢山名前あって分かりにくかった実行バイナリが puppet コマンドを起点にシンプルで分かりやすくなっています。

  • puppetmasterd -> puppet master
  • puppetd -> puppet agent puppet -> puppet apply
  • puppetca -> puppet cert
  • ralsh -> puppet resource
  • puppetrun -> puppet kick
  • puppetqd -> puppet queue
  • filebucket -> puppet filebucket
  • puppetdoc -> puppet doc
  • pi –> puppet

もちろん、0.25 以前と同じ名前のバイナリもそのまま使えるので、以前のスタイルに慣れてる場合はそのままで、2.6から使い始める場合は新しいスタイルで覚えるといいんじゃないかなと思いました。
たとえば、puppet のクライアントで一度きりサーバーに接続して変更を適用するコマンドで下記があったとき

sudo puppetd --server manage01.tnmt.local -v -l console --onetime --ignorecache

2.6 以降はこうでもOKになります。

sudo puppet agent puppet  --no-daemonize --server manage01.tnmt.local -v -l console --onetime --ignorecache

まとめと所感

  • バージョンアップの手間はそれほど無い

yum 一発なんでお手軽でした。ただ、puppet サーバー、クライアントともにバージョンは両方一緒にあげた方がいいとは思います。0.24 〜 0.25 にあげたときにハマりました。俺じゃないけど。
既存の環境へのインパクトは少ないです。依存でrubyあげろとか言われたらrails使ってる環境なんかだとキツいなーとは思ってました。

  • 前のバージョンとの互換性はほぼ問題なさそう

設定ファイルは大きな変更なく使い回し出来ました、変更もWarningレベル。自宅の環境はそれほどmanifestが沢山あったりするわけでもないですが、ここもエラーは出てないです。

  • アップグレード後の期待とか

2.6からの一番の目玉はmanifestなどをPure Ruby DSLで書けるようになるというところだと思います。2.6のリリースノートにもあるとおり、旧来のDSLはターゲットはシステム管理者に学習コスト少なく運用出来るように、制約は多いですが割とシンプルではありました。今回の機能追加はRubyを知っているエンジニア向けに提供される選択肢として、今後サーバーエンジニアとアプリエンジニアが協業してメンテしていくなんてことも出来やすくなるかと思います。これってある意味DevOps!!
実際は今はノウハウとかmanifest資産もたまってきてるし、現行のDSLで特に不満も無いので、便利な書き方があったら取り入れてくのが一番効果が上がるかなと感じました。
自由度高くなる→黒魔術的な記法が増える→見通し悪くてメンテしづらくなる。なんてのには気をつけたいですね。