Tags

By year

  1. 2014 (28)

EC2 インスタンスに Puppet で Sensu Server をセットアップする

AWS Sensu Puppet Chef Serverspec RabbitMQ

Posted on May 3


はじめに

  • 自分自身 Sensu の環境を RPM パッケージからインストールした事は何度かあったが ChefPuppet を利用してのインストールはほぼ皆無なので試してみた
  • Chef での導入については下記の参考サイトにて詳しく解説されている
  • ということで Puppet を使って導入を試みてみる


参考

Chef でのセットアップ


Puppet まわり

andytinycat/puppet-omnibus は今回は触れていないが、既に稼働している Ruby の環境で Puppet の動作に必要な Ruby の関連パッケージをビルドしてくれるっぽい。機会があったら試してみたい。



設定

環境

  • t1.micro
  • Market PlaceCentOSami-eb6b0182

Amazon Linux ではなく CentOS を選んだ理由は以下の「困った点」に書いた。


Puppet を動かすまで

結局、Puppet で全部は出来ないので手動で以下の手順を行う。

yum -y update openssl
yum -y update
yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison iconv-devel curl wget vim
/etc/init.d/iptables stop
chkconfig iptables off
rpm --import https://yum.puppetlabs.com/RPM-GPG-KEY-puppetlabs
wget https://yum.puppetlabs.com/el/6/products/x86_64/puppetlabs-release-6-10.noarch.rpm
rpm -ivh puppetlabs-release-6-10.noarch.rpm
yum install puppet

ここまでの手順で AMI 化しておくと良いかも。


Sensu のセットアップに必要な Puppet モジュールのインストール

Chef で言うところの Community Cookbook にあたる(?)モジュールを幾つか以下のようにインストールしておく。

sudo puppet module install example42/redis
sudo puppet module install puppetlabs/rabbitmq
sudo puppet module install sensu/sensu

上記の操作で以下のモジュールをインストールすることになる。

このようなモジュールは Puppet Forge と呼ばれるサイトにて管理されている。


Sensu のセットアップ

ここまで問題無く準備が整えば後は簡単。以下のマニフェスト(Chef で言うとこのレシピ)を /etc/puppet/manifests/site.pp として保存する。

尚、${your_password} については環境に応じて適宜設定すること。保存したら以下のように puppet apply を利用してマニフェストを適用する。

cd /etc/puppet
puppey apply manifests/site.pp

暫くすると以下のように Puppet によるプロビジョニングが完了する。途中、ところどころで WarningError が出てしまっているが静観。

詳細な動作ログについては以下の通り。

プロビジョニングは成功するものの Sensu 関連が全く起動していない模様。

一応、/var/log/sensu/ 以下に sensu-client.log が出力されていたので見てみると…

{"timestamp":"2014-05-04T00:50:43.590293+0000","level":"error","message":"[amqp] Detected TCP connection failure"}
{"timestamp":"2014-05-04T00:50:43.590639+0000","level":"fatal","message":"rabbitmq connection error","error":"failed to connect"}

むむ。どうやら RabbitMQ への接続に失敗しているようだ。今回は特に SSL の設定をいれていないので証明書や鍵ファイルの置き場については特に気にしなくてよさそうなのでおそらく RabbitMQSensu 用の設定が入っていないと思われる。

curl -u guest:guest localhost:15672/api/vhosts

RabbitMQVirtual Host の一覧を取得出来るので確認すると…

[{"name":"/","tracing":false}]

ああ、なるほど。ということで、もう一度マニフェストを適用してみると…

cd /etc/puppet
puppet apply manifests/site.pp

以下のようなログが出力された。

ついでに RabbitMQVirtual Host も…

[{"name":"/","tracing":false},{"recv_oct":759,"recv_oct_details":{"rate":0.0},"send_oct":1113,"send_oct_details":{"rate":0.0},"name":"/sensu","tracing":false}]

ちゃんと追加されているが…なぜか Sensu Server 等のプロセスが上がらないので、もう一度マニフェストを適用すると無事に Sensu Server 等のプロセスが起動した。

設定の確認とダッシュボードへのアクセス

ちゃんとマニフェストが適用されているかは Serverspec を使って確認したいので以下のように serverspec をインストールする。

sudo gem install serverspec --no-ri --no-rdoc -V

今回は localhostServerspec を動かす為、初期設定の sercespec-init では localhost を選択して準備して以下のような spec を書いた。

rspec を走らせると…

グッジョブ!

そして、ブラウザで Sensu Server ホストの 8080 にアクセスしてみると…(認証情報はデフォルト)

おお、やっと拝めた。

ということで、Puppet を使って Sensu Server を構築してみたが、構築してみて幾つか困った(困るであろう)点があったので以下に纏めた。



困った点

何が困ったのか?

  • 素の状態から Puppetyum でインストールしようとすると Ruby 1.8.7 がインストールされてしまう…(原因は以下の「Ruby 1.8.7 に依存したパッケージ」に書いた)
  • ちょっと回避させて Puppet パッケージの導入は成功するものの結局は上手く動かない
  • sensu 自体は組み込みの Ruby で動くので問題ない
  • でも、Puppet が動いている環境で最新の Ruby を動かすことが容易に出来ない…ということになる
  • Amazon Linux は起動直後は既に ruby 2.0.0p451 がインストールされている状態で結果として色々と面倒だったので CentOSAMI を利用した

インストールされる Ruby 関連のパッケージ

CentOS にて Puppet をパッケージからインストールした場合に以下のような Ruby 関連のパッケージが一緒にインストールされる。

Chef のように Chef に同梱されている組み込みの Ruby というのが存在しないのは若干、残念。


Ruby 1.8.7 に依存したパッケージ

以下のリンクによると…

以下のパッケージが Ruby 1.8.7 に依存したライブラリでコンパイルされているとのこと。

  • ruby-augeas
  • ruby-shadow

ガビーンである。対策としては上記のパッケージを環境に応じた Ruby でコンパイルし直せとのこと…ちょっとハードルが上がる。



最後に

  • Puppet を使ってチョーシンプルな Sensu Server を構築してみた
  • 当初は Amazon Linux で頑張っていたけど挫折して CentOSAMI を利用した
  • 以前にも Docker コンテナを使って同じことをやってみたがその時に比べるとちょっとスマートに出来た
  • 但し、SSL の設定は行っていない
  • そして、一番の懸念点が Puppet が古い Ruby に依存しているところ…こちらの回避策らしいプロジェクトがあるようなのでそちらを試してみたいかな…



2014 かっぱのほげふが