Gangliaでインベントリ管理をやってみた
製品版の運用管理製品には、インベントリ管理として、各ノードのIPアドレス、ホスト名やミドルウェアごとのバージョンを確認できる機能がついている。
同じことをFedora 付属のツールで行おうとしてみたのだが、手っ取り早いオプションとして、Ganglia のgmetric を使う方法を試してみた。
gmetric は既にプロセス監視のところでも出てきたのだが、主にcronで動かして、各サーバーで取れる値(プロセス数等) を転送する機能である。
このgmetric なのだが、実は数値だけでなくstringの型も送ることが出来、例えばuname などを定期的に実施しておけば、OSのバージョンをGanglia の管理用ノードに送ることができるのである。
この方法だと各ノードにcronを設定しなければならず面倒だが、puppet が合わせて導入してあれば、直接cronを更新することが出きるので、設定は楽になる。取れた値は、ganglia-webでいうと、各ノード別の"Host View" (Uptimeなどが書いてあるあたり)でみることができた。
実際にpuppetに登録したcron サービスは次のようになる。
class fedora11_ganglia_cron { cron { "fedora11_ganglia_httpd_version" : ensure => present, command => '/usr/bin/gmetric -t string -n httpd_version -v $(rpm -q httpd)', user => 'root', minute => '*/20', } cron { "fedora11_ganglia_fedora_release" : ensure => present, command => '/usr/bin/gmetric -t string -n fedora_release -v $(cat /etc/redhat-release)', user => 'root', minute => '*/20', } cron { "fedora11_ganglia_ipaddr" : ensure => present, command => '/usr/bin/gmetric -t string -n ipaddr -v "$(/sbin/ip addr show | grep "inet " | tr -d "\n" | tr " " "_" )" ', user => 'root', minute => '*/20', }
上から、httpdのバージョン、/etc/redhat-release の値、 ノードが所持するIPアドレスの順で指定している。上の例では20分ごとに更新しているが、どれも頻繁に変わる値では無いので、隔週などでも大丈夫だろう。
作業中、詰まったポイントとして、
・ puppet のcronで登録されたcrontabは、ensure => absent で明示的に指定しない限り、名前を変更しても削除されない
・ gmetricのstringは、スペースや改行がある際、後の項目を無視する
の2点があった。
1点目は、 "fedora11_ganglia_fedora_release" のコマンドを間違えて指定し修正した際、変更が反映されなかったことによる。旧登録も残っていたので、そちらの値が反映され、ganglia-web上で、値が変化しなかった。
2点目では、コマンドの中でも書き込んでいるのだが、trコマンドを使い、スペースや改行を取り除くことで対応した。
また、cronの設定時に、cronのエラーログがroot宛にメールで届くことを失念しており、デバッグに時間がかかったことも悩んだ点である。
ちなみに間違いの内容は、ipアドレスの取得の際、 /sbin にパスが通っておらず ip addr showが失敗したことだった。 (正しくは、 /sbin/ip addr show) orz