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