miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました

CentOS で最新の JDK を自動インストールする

CentOSJDKCUI でインストールする手順が紹介されていても「ブラウザで最新 URL を調べて RPMwget して〜」みたいなものが多くて。怠惰な私には耐えられなかったので、最新版のリンクを辿って取得するところも perl の WWW::Mechanize を使って自動化してみました。

CentOS 5.5 で動作確認しています。

(2011-05-24 追記)
JDK のダウンロードページの構成が変わっており、JavaScript が使われるようになっているので、この方法ではダウンロードできなくなっています。

Java のアンインストール

私は Desktop とか Server とかのオプションを外してインストールしたので特に必要なかったですが、

あたりを見ると、入っているケースもあるみたいですので、とりあえずやっておいたほうがいいかと。

yum erase java

WWW::Mechanize のインストール

WWW::Mechanize は RPMforge にあるので、リポジトリの設定を追加してインストールを行います。
最新版を入れてしまうと WWW::Mechanize を使った際に

LWP::UserAgent version 5.827 required--this is only version 2.033 at /usr/lib/perl5/vendor_perl/5.8.8/WWW/Mechanize.pm line 106.

のようなエラーが発生してしまうので、

を参考に 1.34 という古めのバージョンを入れています。

cat >/etc/yum.repos.d/rpmforge.repo <<\EOF
[rpmforge]
name = Red Hat Enterprise $releasever - RPMforge.net - dag
mirrorlist = http://apt.sw.be/redhat/el5/en/mirrors-rpmforge
enabled = 0
gpgcheck = 0
EOF

yum install -y perl-WWW-Mechanize-1.34 --enablerepo=rpmforge

RPMforge を普段から使いたい場合は enabled = 1 にしてください。
ヒアドキュメントで EOF を \EOF にするのは WEB+DB vol.50 の Git 特集を見て以来真似てるんですけど、 'EOF' にするのと同じ効果(変数の展開が行われない)があるみたいですね。

JDK のインストール

今のところこんな感じで動いています。サイトの構成が変わったら書き換えないといけませんけど、まあ仕方ないでしょう。

perl <<\EOF
use WWW::Mechanize;
use LWP::Simple;

my $platform = 'Linux';
#my $platform = 'Linux Intel Itanium'
#my $platform = 'Linux x64'
my $url = 'http://www.oracle.com/technetwork/java/javase/downloads/';

my $mech = WWW::Mechanize->new();
$mech->get($url);
$mech->follow_link(text => 'JDK');
$mech->submit_form(fields => { ($mech->find_all_inputs(id => "dnld_platform"))[0]->name => $platform });
my $link = $mech->find_link(text_regex => qr/jdk-.*-linux-.*-rpm.bin/);
getstore($link->url, $link->text);

system('/bin/sh', $link->text);
EOF

Itanium や x64 環境の場合は $platform 部分を適切なものに変えてから実行してください。

ちなみに

「こういう風に完全に自動化しておくと、Hudson PXE plugin で Hudson のスレーブを増やすのも完全に自動化できていいかな」という思惑もあったんですけど、Hudson PXE plugin で CentOS を入れる場合は Post-installation script が設定できないみたいなので、あまり意味なかったです。Ubuntu だとそういう設定があるんですけどね・・・。

他にいいやり方があったら教えてくださいませ。