メインの開発環境を 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。

  1. Puppet: puppet-0.22.4-1.rf.src.rpm
  2. Ruby: ruby-1.8.1-7.el4_7.2.src.rpm
  3. 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 の差分ファイルを用意しておく。

  1. puppet.spec.patch (PATCH / 472bytes)
  2. ruby.spec.patch (PATCH / 433bytes)
  3. facter.spec.patch (PATCH / 492bytes)

各パッケージのビルド~インストールは Ruby、Facter、Puppet の順で行い、それぞれの作業手順は以下の通り。ここでは上記の spec 差分ファイルを /usr/src/redhat/SPEC/ にコピーし、サーバーのアーキテクチャーを x86 と仮定しているが、spec 差分ファイルを利用しない場合やアーキテクチャーが異なる場合は、適宜該当箇所を読み替え、または省略していただきたい。

■ 1. Ruby のビルドとインストール

# yum remove ruby ruby-devel ruby-libs ← 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 のビルドとインストール

# rpm -ivh facter-1.3.7-1.rf.src.rpm ← SRPM をインストール

# 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 のビルドとインストール

# rpm -ivh puppet-0.22.4-1.rf.src.rpm ← SRPM をインストール

# 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 等で上書きされてしまわないよう、更新チェック対象から除外しておく。

# grep ^exclude /etc/yum.conf
exclude=ruby*

これで Puppet のインストールは完了。あとは Puppet サーバー側でマニフェストを適切に設定すれば、めでたく CentOS 3 が Puppet の管理下に入る。今後 CentOS 3 マシンが増えたり (多分これ以上増えないと思うが)、OS の再インストールをするようなことになっても、今回の RPM を使えば楽だ。

One Response to this entry.