Puppetを導入してみました

仕事でサーバの初期構築や運用方法を見直す機会があったので、Puppetというシステム自動管理ツールを導入してみました。

これまでのシステム管理というと、初期構築時はサービス・サーバごとに構築用スクリプトを作成し、運用時に設定ファイルの変更があればexpectの使い捨てスクリプトで全サーバに設定を反映させていました。
この方法では初期構築スクリプトがサービスごとにばらばらで担当者が代わったときに解読が困難だったり、設定ファイルの変更を初期構築に反映していなかったりと、メンテナンスに難がありました。


Puppetを一ヶ月使用してみた感想を以下に箇条書きにしてみます。マニュアルを精読してないので、勘違いがたくさんありそうですが…

  • tagが便利
  • puppetrunが便利。
  • puppetdを特定のIPにbindできない?(0.0.0.0でListenしてしまう)
  • Componentsにエイリアスが使えないような気がする。
  • Componetnsに依存関係を持たせられないような気がする。
  • Rubyで書かれていることをよく耳にするけど、フレームワークを直接いじることがなければあまり関係ない。定義ファイル(Resource)はPuppet文法で記述する。facterを使うときはRubyで記述する。
  • Resourceのpackageを使ってrpmをインストールするとき依存関係がめんどくさい。いらないパッケージをアンインストールするときもめんどくさい。
  • Resourceのpackageでproviderにyumを指定してアンインストールするときに依存関係にあるパッケージをアンインストールしてくれない。(おそらく意図しないパッケージをアンインストールしないためにこう実装されているのだと思うが初期構築するときにめんどくさいので、結局execに頼ってしまう)
  • 確かにひとつひとつのResourceは簡潔にかけるが、定義ファイルの依存関係が複雑化していってしまう。ドキュメントは必要そう。

つらつらと不満点も書きましたが、タグ機能は非常に便利なので活用しています。
タグは主に初期構築用のsetupと運用用maintenanceの2種類を用意して、運用上変更が生じそうなResourceにはこれら2種類のタグをつけています。実際に変更することになったら、maintenanceのタグを使ってpuppetrunします。このResourceにはsetupタグもついていますので、初期構築にも反映されます。これで「設定変更を初期構築スクリプトに反映してなかったので、今運用しているサーバとは設定が異なるサーバができちゃったよ!」ということはなくなると思います。


Puppetについての情報は以下のサイトにまとまっています。

http://gihyo.jp/admin/serial/01/puppet/0001
http://trac.mizzy.org/puppet