DAS環境でもリモートからサーバを自動インストールしよう(基本編)

もはや、クラウドと騒がれている時代に、DASのサーバであっても現地に行ってサーバ構築するなんて時代遅れだ、といっても過言ではないだろう。同業他社に「サーバのインストールとかどうしてます?」と聞かれて、「現地でエンジニアが製造してます。」と答えると、「(何この会社時代遅れー)」と思われてしまうのは嫌である。また、こういったサーバの製造作業というのは、現地のデータセンターにこもって一日作業する必要があったりと、運用業務として非常にコストのかかる作業だと言える。

例えば、レンタルサーバで良くある製造の手順としては、

  1. データセンターに現地入り
  2. サーバの設置等のキッティング作業
  3. RAIDやBIOSの初期設定
  4. マスターデータのHDDコピー作業(データセンターでぼーっと待つ)
  5. HDDの挿入作業
  6. RAID再設定
  7. 起動
  8. IPやホスト名の固有設定変更
  9. RAIDのリビルドやバックアップ作成

いうように、時間の無駄な作業が多い。しかも、この間はエンジニアがデータセンターに付きっきりでいないといけないので、サーバの管理作業等ができない。とにかく、時間がもったいない。この時間をコーディングに費やせばどれほど生産性が高くなるだろうか。

そこで、少なくともサーバを設置したら、そのあとの作業は全てリモートでできるようにしたい。さらには、Linuxのfirstbootを利用して自動化したい、となる。

各社、様々な自動インストールを行っていると思うが、今回はこういう状況を踏まえて、DASのサーバをどうすればリモートから簡単にインストールできるのか、という観点で基本的な仕組みを説明したい。これらを理解することで、各処理で自動化できるところは自動化することで、完全な自動インストールも可能となるだろう。この点は最後に述べる。

まずは前提条件

  • IPMIが利用できること
  • IPMIでリモートから接続性があること(踏み台越しでも何でも良い)
  • DHCP、NFS、TFTPの機能を持ったサーバ(インストールシステムとする)が稼働していること
  • DHCPがL3をまたいでrelayできるスイッチであること(セグメント毎にDHCP増やしたくない)

これくらいの条件がそろっていれば、データセンターにはハードウェアだけ積んできてIPMIの設定だけをしておいて、後は後日に好きなタイミングでリモートから並列してインストール作業をしてやればよい。では、どういう仕組みを構築すればよいのかを説明する。

メモリ上で起動するOSを作る

え?いきなり面倒・・・と思うかもしれないが、これは今や結構簡単で、例えば以下のようなLiveCD用のイメージをどこかから拾ってこればよい。ここで一例あげておくと、このあたり「CentOSの最小構成ライブCDを作成しました」のisoファイルを拝借する。そして、このisoファイルを展開して、どこかのディレクトリ(/usr/local/src/os_data/)にコピーする。そうすると大体以下のような/からのファイル群や、CDboot用のカーネルイメージであるvmlinuzがある。

ls /usr/local/src/os_data
bin boot dev etc home init  lib media mnt opt proc root sbin selinux srv sys tmp usr var

そして、中に入れておきたいツールや設定をいれたら以下のコマンドでこのデータを固める。

cd /usr/local/src/os_dat/
find . -print | cpio -o --file=../initrd.dat --format=newc
gzip -c9 ../initrd.dat > ../initrd.img

これによって、initrd.imgというイメージファイルが生成される。こいつをメモリ上で展開し起動させればよい。

PXEbootを利用してインストールするサーバをディスクレスで起動

では、どのタイミングでどのようにメモリ上で起動させるか。今回はリモートでサーバをインストールするのが目的なので、やはりやるならネットブートが良いと思う。PXEbootでこのイメージを使って、インストール対象のサーバをメモリ上のOSを起動させる。PXEbootの設定の仕方は多くのサイトで紹介されているのでここでの説明は省略する。

PXEbootの環境をインストールシステムに設定すると、大体以下のような構成になっているだろう。

ls /tftpboot/auto_install/
images menu.c32 pxelinux.0 pxelinux.cfg

そして、例えば今回はboot設定のファイルを以下のように記述する。

cat /tftpboot/auto_install/pxelinux.cfg/default
DEFAULT menu
ONTIMEOUT localboot
PROMPT 1
MENU TITLE auto install
TIMEOUT 30
TOTALTIMEOUT 40

LABEL localboot
MENU DEFAULT
LOCALBOOT 0

LABEL server-automation
kernel /images/server-automation/vmlinuz
append initrd=/images/server-automation/initrd.img

ここで、先ほど作ったinitrd.imgを/tftboot/auto_install/images/sercer-automation/の中にコピーする。また、LiveCDを展開した際に、その中には起動用のカーネルイメージが大体入っているので、そのイメージであるvmlinuzを同様のディレクトリにコピーする。さらに、インストールシステムのdhcp.confに以下のような設定を書いておけば、インストール対象のサーバ側がBIOS設定でLANブートを先に見に行く設定をしていれば、PXEbootが可能になる。

ddns-update-style interim;
ignore client-updates;

allow booting;
allow bootp;

subnet 192.168.0.0 netmask 255.255.255.0 {
    option routers 192.168.0.254;
    option subnet-mask 255.255.255.0;
    option broadcast-address 192.168.0.255;
    range dynamic-bootp 192.168.0.200 192.168.0.210; # DHCPで使うIPレンジ
    filename "/auto_install/pxelinux.0";
    default-lease-time 60;
    next-server 192.168.0.2; # インストールシステム
}

以上でPXEbootのための環境ではできた。あとは、このインストールシステムに、NFSの機能も稼働させておく。そして、そのNFSの領域に、インストールしたいサーバのOSデータを置いておき、PXEbootによってメモリ上で起動させたサーバから、インストールシステムに対してNFSマウントをする。NFSの起動のオプションは以下ぐらいで良いと思う。

cat /etc/exports
/export    192.168.0.0/255.255.0.0(ro,no_all_squash,no_root_squash)

忘れずNFSを起動させておく。

リモートインストールphase

この状態で、IPMI経由からインストール対象のサーバを起動させる。すると、そのサーバはLANブートによって、DHCPからIP、PXE要求によってPXEbootイメージのファイルパスを受け取り、TFTPからそのファイルパスが指すNBPデータをダウンロードして起動する。この時、このOSは上述したようにメモリ上で起動するように作られているので、いわゆるディスクレス状態で起動している。

そして、起動後はそのサーバから上記で構築したインストールシステムに対してNFSマウントを行う。ここで一旦、メモリ上で起動しているサーバで、ディスクのフォーマットとパーティション設定を行う。その後、ディスクをマウントしてそのマウントした領域にNFSマウント先のOSデータをrsyncでコピーする。

  • NFSマウントコマンド例
mount -t nfs -o nolock,ro $NFS_IP:$NFS_MNT_POINT $INSTALL_DATA_PATH
  • rsync例
rsync -aSHz --numeric-ids --exclude '/proc' --exclude '/sys' $元データ/ $インストール先/

コピー後は、サーバを再起動してやれば、DHCPの起動はタイムアウト設定をしているので、タイムアウトになればディスクから起動して、サーバのリモートインストールが完了するわけだ。

これらを全て自動化

こういった基本的な仕組みを理解しておけば、例えば契約などを管理する業務システムから、契約が完了したらサーバの電源を入れる処理がIPMI経由から走る。すると電源が入ったサーバは、サーバをメモリ上で起動させ、自動でNFSマウントして、自動でデータコピーして、自動で再起動がかかって、自動インストールが完了する。

また、その時には前回の記事(PerlのZabbix API クライアントモジュールでZabbixを色々自動化)をさらに起動スクリプト上で実行することで、自動で監視も始まる、といった仕組みが実現できる。

是非、DASの環境であっても、自動化できるところは自動化、という気持ちで、サーバ管理者はもっと難しいことをやるべきだと思う。

「DAS環境でもリモートからサーバを自動インストールしよう(基本編)」への1件のフィードバック

コメントは受け付けていません。