メインの開発環境を CentOS 5 にして随分経つが、故あって CentOS 3 で自作 Web アプリケーションの動作検証をする必要が生じたため、CentOS 3.x 系の最新バージョン 3.9 の環境を仮想マシンで構築した。Wikipedia の記事によると、CentOS 3 の初リリースは 2004年 3月で、メンテナンス更新期限は 2010年 10月までとなっている。これだけ長期に渡ってメンテナンスが継続されるのは、エンタープライズ向けディストリビューションの利点だ。
さて、CentOS 3 で具体的に何をするかはどうでもいいとして、我が家では UNIX 系 OS の管理を Puppet で極力自動化することにしている。しかし初期設定が終わった CentOS 3.9 にも Puppet をインストールしようとしたところで、問題が発生した。Puppet のソース RPM は DAG リポジトリで提供されているものの、CentOS 3 標準の Ruby が 1.6.8 と古く、Puppet の動作条件 "Ruby >= 1.8.1" に引っかかるのだ。
CentOS 4 以降なら (DAG がリポジトリに登録してあれば) yum で一発だし、Debian GNU/Linux 5.0 でも aptitude に登録されているので簡単だが、古い CentOS 3 ではそう単純には片付かない。仕方がないので、CentOS 3 用に Puppet と関連パッケージの RPM を作成することにした。まったく、古いディストリビューションは手間がかかる。
まず、各種パッケージのソース RPM を入手する。今回利用するファイルは、以下の通り。本エントリーのリンクは理研サイトだが、ミラーサイトで同じファイルがあれば、どこから入手しても OK。
- Puppet: puppet-0.22.4-1.rf.src.rpm
- Ruby: ruby-1.8.1-7.el4_7.2.src.rpm
- Facter: facter-1.3.7-1.rf.src.rpm
各パッケージは、我が家で現在 Puppet サーバーとして稼働している CentOS 5.4 と同じか、なるべく近いバージョンにした。Ruby 以外は CentOS 5.4 と同じバージョンだが、CentOS 5.4 に含まれる Ruby 1.8.5 のビルドには、libX11-devel が必要になる。CentOS 3 にはこのパッケージが存在せず、ゴリ押しも面倒くさそうなので、Ruby は libX11-devel が不要な CentOS 4.8 のバージョン 1.8.1 を採用した。いずれも最新版と比較すると少々古いが、安定動作を重視した。
ソース RPM をインストールすると、/usr/src/redhat/SPEC/ 以下に spec ファイルが生成される。すかさずビルドしても構わないが、素の状態で生成される RPM のファイル名 (とインストール後のパッケージ名) からは、CentOS 3 用にビルドされたパッケージであることが分からない。これでは管理上具合が悪いので、僕は spec ファイルを修正して、パッケージのバージョンや RPM のファイル名に ".el3" と言う文字が入るようにした。ほんの些細な修正だが、一応各 spec の差分ファイルを用意しておく。
- puppet.spec.patch (PATCH / 472bytes)
- ruby.spec.patch (PATCH / 433bytes)
- facter.spec.patch (PATCH / 492bytes)
各パッケージのビルド~インストールは Ruby、Facter、Puppet の順で行い、それぞれの作業手順は以下の通り。ここでは上記の spec 差分ファイルを /usr/src/redhat/SPEC/ にコピーし、サーバーのアーキテクチャーを x86 と仮定しているが、spec 差分ファイルを利用しない場合やアーキテクチャーが異なる場合は、適宜該当箇所を読み替え、または省略していただきたい。
■ 1. Ruby のビルドとインストール
# rpm -ivh ruby-1.8.1-7.el4_7.2.src.rpm ← SRPM をインストール
# cd /usr/src/redhat/SPEC/ ← SPEC ディレクトリに移動
# ls ruby.spec* ← spec ファイルを確認
ruby.spec
ruby.spec.patch
# patch < ruby.spec.patch ← patch を適用
# rpmbuild -ba ruby.spec ← ビルド
# cd ../RPMS/ ← RPM ディレクトリに移動
# find . -type f -name "*1.8.1-7*.rpm" | sort ← 生成 RPM を確認
./i386/irb-1.8.1-7.el3_7.2.i386.rpm
./i386/ruby-1.8.1-7.el3_7.2.i386.rpm
./i386/ruby-debuginfo-1.8.1-7.el3_7.2.i386.rpm
./i386/ruby-devel-1.8.1-7.el3_7.2.i386.rpm
./i386/ruby-docs-1.8.1-7.el3_7.2.i386.rpm
./i386/ruby-libs-1.8.1-7.el3_7.2.i386.rpm
./i386/ruby-mode-1.8.1-7.el3_7.2.i386.rpm
./i386/ruby-tcltk-1.8.1-7.el3_7.2.i386.rpm
# cd i386/
# rpm -ivh ruby-1.8.1-7.el3_7.2.i386.rpm ruby-devel-1.8.1-7.el3_7.2.i386.rpm ruby-libs-1.8.1-7.el3_7.2.i386.rpm ← 必要なパッケージのみインストール (3個)
■ 2. Facter のビルドとインストール
# cd /usr/src/redhat/SPEC/ ← SPEC ディレクトリに移動
# ls facter.spec* ← spec ファイルを確認
facter.spec
facter.spec.patch
# patch < facter.spec.patch ← patch を適用
# rpmbuild -ba facter.spec ← ビルド
# cd ../RPMS/ ← RPM ディレクトリに移動
# find . -type f -name "facter*.rpm" | sort ← 生成 RPM を確認
./i386/facter-1.3.7-1.el3.rf.i386.rpm
./i386/facter-debuginfo-1.3.7-1.el3.rf.i386.rpm
# cd i386/
# rpm -ivh facter-1.3.7-1.el3.rf.i386.rpm ← 必要なパッケージのみインストール
■ 3. Puppet のビルドとインストール
# cd /usr/src/redhat/SPEC/ ← SPEC ディレクトリに移動
# ls puppet.spec* ← spec ファイルを確認
puppet.spec
puppet.spec.patch
# patch < puppet.spec.patch ← patch を適用
# rpmbuild -ba puppet.spec ← ビルド
# cd ../RPMS/ ← RPM ディレクトリに移動
# find . -type f -name "puppet*.rpm" | sort ← 生成 RPM を確認
./i386/puppet-0.22.4-1.el3.rf.i386.rpm
./i386/puppet-debuginfo-0.22.4-1.el3.rf.i386.rpm
./i386/puppet-server-0.22.4-1.el3.rf.i386.rpm
# cd i386/
# rpm -ivh puppet-0.22.4-1.el3.rf.i386.rpm ← 必要なパッケージのみインストール
# grep ^PUPPET_SERVER /etc/sysconfig/puppet ← 設定ファイルを適宜修正
PUPPET_SERVER=puppet.example.com
# /etc/init.d/puppet start ← Puppet を起動
# ps aux | grep -v grep | grep puppetd ← プロセスを確認
# tail -f /var/log/messages | grep puppetd ← ログを確認
# chkconfig puppet on ← 正常動作を確認後、自動起動設定
各パッケージをビルドする際、依存関係にあるパッケージがインストールされていない場合は rpmbuild がエラーメッセージを吐いて止まるので、メッセージを確認して足りないパッケージを yum でインストールし、改めてビルドする。
今回の CentOS 3 マシンは Puppet クライアントとして動作させるので puppet-server パッケージは不要だが、必要な場合は忘れずにインストールする。またいずれの場合も、Puppet の通信 (デフォルトでは TCP/8140) をファイアウォールで止めてしまわないように注意。
最後に yum.conf の [main] セクションで exclude 行を追加もしくは修正して、標準パッケージに含まれる Ruby が yum update 等で上書きされてしまわないよう、更新チェック対象から除外しておく。
exclude=ruby*
これで Puppet のインストールは完了。あとは Puppet サーバー側でマニフェストを適切に設定すれば、めでたく CentOS 3 が Puppet の管理下に入る。今後 CentOS 3 マシンが増えたり (多分これ以上増えないと思うが)、OS の再インストールをするようなことになっても、今回の RPM を使えば楽だ。
その後 Facter を 1.5.7 にバージョンアップ。
→ http://www.natzworks.com/digital/entries/2010/000247.html