facter はサーバのホスト名、IP アドレス、OS、ハードウェアなど様々な情報を収集するためのツールです。RPM では「facter」というパッケージ名で提供されており 「yum install facter」 でインストールが可能です。インストール後はターミナルから 「facter」 というコマンド(※2) を実施するだけでサーバの色々な情報を一度に取得することができます。
$ facter (... snip ...) architecture => x86_64 domain => local.hoge.bar.net (... snip ...) ipaddress_eth0 => 10.x.y.z processor0 => Intel(R) Xeon(R) CPU E5504 @ 2.00GHz memorysize => 8.04 GB (... snip ...)
facter を rpm でインストールすると ruby 用のインターフェイスとして Facter というモジュールが /usr/lib/ruby/site_ruby/
■facter を rpm でインストールすると Ruby 用に Facter module がインストールされる
$ rpm -ql facter | grep rb$ /usr/lib/ruby/site_ruby/1.8/facter.rb (... snip ...) $ grep -r Facter /usr/lib/ruby/site_ruby/1.8 | grep module /usr/lib/ruby/site_ruby/1.8/facter.rb:module Facter
■基本的なサーバを表すクラスとして「BaseServer」クラスを作成する
require 'facter' class BaseServer include Facter attr_accessor :name, :role, :ipaddress def initialize(*) @name = Facter.value(:fqdn) @role = self.class.name @ipaddress = Facter.value(:ipaddress) end def getKernel return Facter.value(:kernelrelease) end def getUptime return Facter.value(:uptime) end end
■ Web サーバクラスを「BaseServer」のサブクラスとして作成する
require 'BaseServer' class BaseServer::HttpdServer < BaseServer def getApacheStatus (... snip ...) end end
■ Mysqld サーバクラスを「BaseServer」のサブクラスとして作成する(※別途 ruby-mysql を使用し、専用のインスタンス変数を準備する)
require 'BaseServer' require 'mysql' class BaseServer::MysqldServer < BaseServer attr_accessor :host, :user, :pass, :database def initialize(host, user, pass, database) super @host = host @user = user @pass = pass @database = database end def countTable(table) my = Mysql::new(host, user, pass, database) res = my.query("select count(*) from #{table}") return res end end
以上、サーバ情報収集ツールを Ruby で書いている方の参考になれば幸いです。
(※1) サーバ管理ツール Puppet も内部的に facter を使用しています。
(※2) 「要素」という意味を表す英単語としては「facter」という単語はミススペルのようです。正しくは「factor」ですが既に coreutils パッケージに因数分解をする同名のコマンドが含まれているため、故意に facter という名前にしたのではと思われます。数学に興味がある方は古い方の「factor」を使用して「seq 1 100 | factor」(=1 から 100 までを素因数分解する)、「seq 1 100 | factor | awk 'NF == 2 { print $NF }'」(=1 から 100 までの素数を抽出する) などの使い方を試してみると面白いかもしれません。