CentOS で採用されるパッケージは、安定度重視の枯れたバージョンであることが多い。システム管理自動化ツール Puppet で利用する Ruby ライブラリ の Facter も、現時点での最新版 1.5.7 に対し、CentOS 5.4 のデフォルト・パッケージは 1.3.7 だ。

Facter 1.3.7 でも Puppet は問題なく動くが、1.5.7 では 1.3.7 にはない Facter 変数、例えばディストリビューションのメジャーバージョンを表す lsbmajdistrelease や、仮想化環境を表す virtual 等が追加されている (1.5.7 での Facter 関数一覧は、このサイトが参考になる)。Puppet のマニフェスト管理効率化はもちろん、自作スクリプト等でも参照可能な変数は多いほど便利なので、CentOS 5.4 の Facter を 1.5.7 に入れ替えることにした。

Facter 1.5.7 の RPM は検索すればいくつか見つかるが、せっかくソースの tar ボールに Red Hat 用の spec ファイルが含まれているので、自作する。

まず現時点の最新版、1.5.7 の tar ボールをここからダウンロード。展開後、デフォルトでバージョンが "1.5.5" となっているのを修正したり、生成されるパッケージ名をわかりやすくするため、spec ファイルの一部を編集する。

  1. facter.spec.patch-1.5.7 (PATCH / 435bytes)

RPM のビルド手順は以下の通り。ここでは上記の spec 差分ファイルを /usr/src/redhat/SPEC/ にコピーし、サーバーのアーキテクチャーを x86 と仮定しているが、spec 差分ファイルを利用せずに手動編集したりする場合やアーキテクチャーが異なる場合は、適宜該当箇所を読み替え、または省略していただきたい。

# tar xfz facter-1.5.7.tar.gz ← tar ボール展開

# cp facter-1.5.7/conf/redhat/facter.spec /usr/src/redhat/SPEC/ ← spec ファイルをコピー

# cp facter-1.5.7.tar.gz /usr/src/redhat/SOURCE/ ← tar ボールをコピー

# cd /usr/src/redhat/SPEC/ ← SPEC ディレクトリに移動

# ls facter.spec* ← spec ファイルを確認
facter.spec
facter.spec.patch-1.5.7

# patch < facter.spec.patch-1.5.7 ← patch を適用

# rpmbuild -ba facter.spec ← ビルド

# cd ../

# find . -type f -name "facter*.rpm" | sort ← 生成 RPM を確認
./RPMS/i386/facter-1.5.7-1.el5.i386.rpm
./RPMS/i386/facter-debuginfo-1.5.7-1.el5.i386.rpm
./SRPMS/facter-1.5.7-1.el5.src.rpm

# cd RPMS/i386/

# /etc/init.d/puppet stop ← Puppet を停止

# rpm -q facter ← Facter のバージョンを確認
facter-1.3.7-1.el5.rf

# rpm -e facter --nodeps ← 依存関係を無視して Facter をアンインストール

# rpm -ivh facter-1.5.7-1.el5.i386.rpm ← 新しい Facter をインストール

# rpm -q facter ← Facter のバージョンを確認
facter-1.5.7-1.el5

# /etc/init.d/puppet start ← Puppet を起動

デフォルトの Facter パッケージをアンインストールする際に yum remove を実行すると、依存関係にある Puppet も一緒にアンインストールされてしまう。Facter アップグレード後に改めて Puppet をインストールし直すのも面倒なので、Facter のアンインストールには、 rpm で依存関係無視オプションを使用した。

また上記作業によって Facter が標準ではなくなるので、yum.conf で exclude して、アップデート対象から除外しておく。

# vi /etc/yum.conf
exclude=facter-*

最後に、取得可能な Facter 変数を確認する。実行する環境によって取得可能な変数の値や数に違いがあるが、我が家の VMware ESXi で稼働する VM の 1台では、以下のようになった。1.3.7 との比較で、太字は追加された変数、赤字は扱う値が変わった変数を表す。

# facter
architecture => i386
domain => **********
facterversion => 1.5.7
fqdn => **********
hardwareisa => i686
hardwaremodel => i686
hostname => **********
id => root
interfaces => eth0,sit0
ipaddress => ***.***.***.***
ipaddress_eth0 => ***.***.***.***
is_virtual => true
kernel => Linux
kernelmajversion => 2.6
kernelrelease => 2.6.18-164.11.1.el5
kernelversion => 2.6.18
lsbdistcodename => Final
lsbdistdescription => CentOS release 5.4 (Final)
lsbdistid => CentOS
lsbdistrelease => 5.4
lsbmajdistrelease => 5
lsbrelease => :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
macaddress => **:**:**:**:**:**
macaddress_eth0 => **:**:**:**:**:**
manufacturer => VMware, Inc.
memoryfree => 323.76 MB
memorysize => 503.25 MB
netmask => 255.255.255.0
netmask_eth0 => 255.255.255.0
network_eth0 => ***.***.***.0
operatingsystem => CentOS
operatingsystemrelease => 5.4
path => **********
physicalprocessorcount => 0
processor0 => Intel(R) Pentium(R) D CPU 3.00GHz
processorcount => 1
productname => VMware Virtual Platform
ps => ps -ef
puppetversion => 0.22.4
rubysitedir => /usr/lib/ruby/site_ruby/1.8
rubyversion => 1.8.5
selinux => false
serialnumber => VMware-**********
sshdsakey => **********
sshrsakey => **********
swapfree => 1005.88 MB
swapsize => 1023.99 MB
timezone => JST
type => Other
uniqueid => **********
uptime => 5 days
uptime_days => 5
uptime_hours => 132
uptime_seconds => 478117
virtual => vmware

以下は Facter 1.3.7 で取得できていた変数。1.5.7 では、変数が大幅に増えていることが分かる。

# facter
architecture => i386
domain => **********
facterversion => 1.3.7
fqdn => **********
hardwareisa => i686
hardwaremodel => i686
hostname => **********
id => root
ipaddress => ***.***.***.***
kernel => Linux
kernelrelease => 2.6.18-164.11.1.el5
lsbdistcodename => Final
lsbdistdescription => CentOS release 5.4 (Final)
lsbdistid => CentOS
lsbdistrelease => 5.4
lsbrelease => :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
macaddress => **:**:**:**:**:**
memoryfree => 323.76 MB
memorysize => 503.25 MB
operatingsystem => CentOS
operatingsystemrelease => 2.6.18-164.11.1.el5
processor0 => Intel(R) Pentium(R) D CPU 3.00GHz
processorcount => 1
ps => ps -ef
puppetversion => 0.22.4
rubysitedir => /usr/lib/ruby/site_ruby/1.8
rubyversion => 1.8.5
sshdsakey => **********
sshrsakey => **********
swapfree => 1005.88 MB
swapsize => 1023.99 MB
uniqueid => **********

operatingsystemrelease の値が変わっているので、この変数を既にマニフェストやスクリプト等で使用している場合は要注意。1.5.7 では、同じ値が kernelrelease (と lsbmajdistrelease) に格納されている。

以前に書いたエントリー 「CentOS 3.9 に Puppet 0.22.4 をインストール」 では、CentOS 5.4 のデフォルトに合わせて Facter 1.3.7 を利用したが、同様の手順で、最新の 1.5.7 に入れ替えられる。近いうちに、CentOS 4 以前の Facter も新しくしてしまおう。

Comments are closed.