miauのブログ

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

CentOS で Hudson PXE plugin を動かしてみる

Hudson PXE plugin が Windows で動かなかったことは前にちらっと書きましたが。とりあえず PXE サーバが立てたかったので VMware 上の CentOS 5.5 に Hudson を入れて動かしてみました。

結構色々ハマったので、まずは PXE サーバを起動するまでのところを書いておきます。

Hudson 1.384、Hudson PXE netboot plugin 1.5 で検証してます。

動機

社内のサーバをもろもろ整理中なんですが、状況としては、

インストールには通常メディアの入ったCD-ROMが必要ですし、PC側にはドライブも必要です(そして、なぜか使い古しのPCはCD-ROMドライブが不安定なものが多いのです。)そして、往々にして、CDはどこかのドライブに入れ忘れたまま、ということになります。

まさにこんな感じで。DVD ドライブがついてないサーバがあったり、「CentOS 5.5 の CD 誰か持ってない?」みたいに探しまわったりで結構大変なので、これを解決するために PXE サーバを立てたいわけです。

私は社内のシステム管理者じゃないのでおおっぴらに PXE サーバを立てたりはできないんですが、Hudson PXE Plugin は DHCP サーバともかち合わないのでベストな感じです。

Hudson を動かすまで

jdk のインストール

前に書いた

この手順でやりました。

ただ、Hudson PXE Plugin で Auto Install した CentOS には GCJ がインストールされているので、Java のプロジェクトじゃなければコンパイラにこだわらなくても大丈夫なのかもしれません。

hudson のインストール

インターネットに接続できない環境を前提に(or Hudson RPM for RedHat Linux の手順に従って?)rpm を使ってる人が多い気がしますけど、

に書いてある手順どおり、yum で入れたほうが楽な気がします。

sudo wget -O /etc/yum.repos.d/hudson.repo http://pkg.hudson-labs.org/redhat/hudson.repo
sudo rpm --import http://pkg.hudson-labs.org/redhat/hudson-labs.org.key
yum -y install hudson

hudson.war は /usr/lib/hudson/hudson.war あたりにインストールされます。

ついでに Hudson の自動起動設定もやっておきます。

chkconfig hudson on
設定変更&Hudson の起動

サービスの起動ポートや起動ユーザを変更する場合は /etc/sysconfig/hudson を編集します。
詳しい解説がありましたのでとりあえずリンク。

私は今回とにかく PXE plugin を動かしたいだけなので、設定は変更していません。

設定が完了したら、Hudson を起動します。

service hudson start

PXE plugin のインストール

プラグインのインストール

「Hudsonの管理」→「プラグインの管理」→「利用可能」で「Hudson PXE netboot plugin」を選択して「インストール」するだけです。

インストール後再起動すると、「Hudsonの管理」の下に「Network Slave Installation Management」の項目が増えてますので、これを開きます。

Hudson の URL 指定

Hudson の URL 指定を行ってない場合はこの画面に「Hudson Root URL is not cofigured.」とメッセージが出力されるので、「Hudsonの管理」→「システムの設定」で「Hudson URL」を設定しておきます。

今回の環境では、最初から設定画面に URL が正しく表示されていたので大丈夫だと思ってたんですが、デフォルト値として表示されているだけなのか、一度「保存」する必要がありました。

ターミナルなしでのログインを可能にする

この状態だと PXE サーバはうまく起動してくれません。なにか設定を行うとその後に再起動しようとするので、このタイミングで

ここと同じエラーが発生します。(Root URL をちゃんと設定しても同じです。)

「Network Slave Installation Management」→「Console」を開くと、

$ sudo -S /usr/java/jdk1.6.0_22/jre/bin/java -jar /var/lib/hudson/war/WEB-INF/lib/remoting-1.384.jar
sudo: sorry, you must have a tty to run sudo

というエラーになっていることがわかります。sudo しようとしているけど、tty(ターミナル)がないと sudo できない設定になっていると。(ちなみに、Windows では Console に何も出てくれないので解決の糸口がつかめていません・・・。)

ssh コマンドであれば -t オプションをつけることでターミナルを作れますが、今回は(たぶん)そういうことはできないので /etc/sudoers 側の設定変更が必要になります。

このファイルは visudo コマンドで編集できますので、

/usr/sbin/visudo

を実行し、

Defaults    requiretty

の行をコメントアウトすれば OK です。

もっとまじめに「hudson ユーザだけ端末なしで sudo できる」ように設定するには

Defaults:hudson !requiretty

と設定すればいいそうです。(参考: Studio ODIN - blog風小ネタ集 > sudo: sorry, you must have a tty to run sudo

hudson ユーザでの sudo を可能に

この状態で再度 Console を開くと、

$ sudo -S /usr/java/jdk1.6.0_22/jre/bin/java -jar /var/lib/hudson/war/WEB-INF/lib/remoting-1.384.jar
[sudo] password for hudson: Sorry, try again.
[sudo] password for hudson: Sorry, try again.
[sudo] password for hudson: Sorry, try again.
sudo: 3 incorrect password attempts

というエラーになっています。sudo する際は実行ユーザのパスワードが聞かれますが、rpm のインストール時に作られた hudson ユーザはパスワードが設定されていない(/etc/shadow で「!!」に設定されている)ので、実行に失敗すると。

たぶん 3 種類くらいやり方があって。一長一短ありますが、とりあえず私は 2. のやり方で回避しました。

1. hudson ユーザにパスワードを設定して sudo する
  • 「passwd centos」等で hudson ユーザのパスワードを設定する
  • 「Configure」画面で「Root Username」に「root」を指定する
    • 「If your system has another user that acts as root, specify that user name.」と書いてありますが、ソース読む限り Linux だと Root Username は使われていない気がするので、別ユーザは指定しないほうがよさげ?
  • 「Root Password」に hudson ユーザのパスワードを指定する

hudson はサービス起動用のユーザ、という位置づけなので、パスワードを設定するのも少し変な気がします。あと「Root Password」と言いつつ hudson ユーザのパスワードが指定されているのがちょっと気持ち悪いかもしれません。

2. /etc/sudoers で hudson ユーザがパスワードなしで sudo できるようにする

visudo コマンドで

 ## Same thing without a password
 # %wheel       ALL=(ALL)       NOPASSWD: ALL
+hudson ALL=(ALL)       NOPASSWD: ALL

 ## Allows members of the users group to mount and unmount the
 ## cdrom as root

のような行を追加します。(ユーザでなくグループを指定するなら hudson の部分を %hudson に変更すればよいです。)

パスワードなしで sudo できるところがちょっと気持ち悪いです。

3. sudo で root のパスワードが使われるようにする

man sudoers すると

       targetpw    このフラグを設定すると、sudo は起動したユーザのパスワードでは
                   なく、 -u フラグで指定されたユーザ (デフォルトでは root) のパ
                   スワードを要求する。このフラグはデフォルトでは off である。

というのがあるみたいなので、これを使う方法です。

visudo コマンドで

Defaults    requiretty, targetpw

のように変更するということですね。画面で設定した「Root Password」が root のパスワードとして使われるところはすっきりしますが、sudo の利点である「root のパスワードを使わなくていい」というのが削られるので、これはこれでよくない気がします。

.iso ファイルの取得&設定

ここまでの手順でサーバ自体は起動するはずですので、各 OS のブート設定を行います。

PXE Plugin - hudson - Hudson Wiki に各 OS のイメージ取得方法が載っていますので、それに従って .iso ファイルを取得します。(一部この Wiki には載っておらず、Config 画面のヘルプを読んだほうがいい部分もあります。)

ファイルを取得する際の注意点は以下のような感じです。(※あくまでも認識させるための注意点で、うまくブートできなかったものもあります。詳しくは別アイテムで。)

  • Parted Magic は .iso ではなく .zip ファイル(例: pmagic-pxe-5.7.zip)を取得する必要あり
  • Ubuntu は Server のみの対応
    • Desktop を指定すると「〜 doesn't have the network boot installer in it. Perhaps it's a desktop CD?」と言われる
  • VMware ESXi は各サーバ用(例:「〜 with Dell Customization」があるが、これは認識してくれない(「〜 doesn't look like an ESXi CD image」というエラーになる)ので普通のものを使う
  • OpenSolaris は 0906-110 または 0906-111 を使う
  • VMware ESXi は 4.0.0 または 4.0.0 Update01 を使う

あとは「Network Slave Installation Management」→「Config」で「Add Boot Configuration」ボタンをクリックし、目的の OS を選択→.iso(.zip)ファイルのフルパスを指定するだけです。

うまく認識されると「CentOS 5.5 (i386)」のようにバージョンやプラットフォームの情報も表示されるようになっていますが、VMware ESXi だけはバージョン情報が取得されないようです。バージョンによって VM イメージの互換性の問題があったりするので、できれば複数バージョンに対応してほしいところではありますね・・・。

トラブルシューティング

PXE plugin をインストールした直後は大丈夫なんですが、それ以降再起動等に失敗すると「Network Slave Installation Management」のメニューが出なくなることがあります。この場合は $HUDSON_HOME(/var/lib/hudson とか)直下の pxe.xml を削除して再起動すればメニューが再度表示されるようです。

それでもダメなら plugins/pxe* も削除して Hudson 再起動→プラグインの再インストールで最初の状態には戻ります。

ということで

いろいろ入れてみました。(VMware 上で動かしているので上下に変なノイズが表示されていますが、実機ではきれいに表示されます。)

でも、実際に PXE サーバからブートしようとするとうまくいかないものもあったりして・・・別アイテムに続きます。