サーバ大量構築時のキモ ~Kickstart によるLinux 自動インストール時のネットワーク設定~

Kickstartを用いて、Linuxを自動インストールする際の更なる自動化が出来ないかと考えた。
で、筐体に合わせて、固定IPアドレスの割り振りを自動化させる事が出来たので記述する。

1.実現するには

実現には、まずサーバ筐体のシリアルコードが必要だ。
これは、可能であれば発注元からリストを貰えないか交渉することを推奨する。
もし貰えない場合は…まぁ、通常の1Uや2Uラックのサーバであればどこかに書いてあるので、それを頑張ってメモしてもらうしか無い…かなぁ。

2014/06/28 追記
マネジメントポート(IPMI)から、対象のマザーボードが保有するUUIDを取得するスクリプトを作った。
サーバ大量構築時のキモ ~ipmitool経由でサーバのUUID(GUID)を取得 外部ファイル取込型スクリプト~

もしESXi上の仮想マシンなのであれば、以前コチラに仮想マシンのシリアルコードを一括で取得するスクリプトを作成したので、それを使ってみてもらいたい。

そして、シリアルコードからホスト名、IPアドレスを設定するスクリプトが必要になる。
こちらも以前書いたものがあるので、それをベースに作成していこう。

2.スクリプト作成

さて、それではまずシリアルコードと紐付けてホスト名、IPアドレスを設定させるスクリプトを作成する。
といっても、以前書いたものの焼き直しだけど…

まずは、ホスト名やIPアドレスとシリアルコードを紐付けた外部ファイル、「host.list」を作成する。

host.list

properties
hostname,serialno,defaultgw,nic0,nic1 Test-CentOS001,564D33C9F632AB40148800E9CA90D059,192.168.0.1,192.168.0.31/24,172.26.0.31/24 Test-CentOS002,564DAB560AE59CD285EDCFE97F5A9E64,192.168.0.1,192.168.0.32/24,172.26.0.32/24 Test-CentOS003,564DF163D810265B56707D081C45716F,192.168.0.1,192.168.0.33/24,172.26.0.33/24

次にスクリプト。以前書いたものと違い、Kickstartで実行するために少し変えている。

bash
#!/bin/sh LIST="./host.list" NIC0="eth0" NIC1="eth1" SCRIPT_DIR=`dirname $0` cd $SCRIPT_DIR MYSERIAL_CD=`dmidecode | grep UUID | awk 'BEGIN { FS=<span style="color: #666666;">"</span>: "; } { print $2; }' | sed -e "s/-//g"` IFCFGNIC0="ifcfg-${NIC0}"; IFCFGNIC1="ifcfg-${NIC1}"; if [ -z `cat $LIST | grep $MYSERIAL_CD` ]; then echo "It did not exist in [$ LIST] within [$ MYSERIAL_CD]" echo "" exit 1 fi #Host Name HOSTNAME=`cat $LIST | grep $MYSERIAL_CD | awk 'BEGIN {FS=","} { print $1 }'` #Default Gateway GATEWAY=`cat $LIST | grep $MYSERIAL_CD | awk 'BEGIN {FS=","} { print $3 }' | awk 'BEGIN {FS="/"} {print $1}'` #NIC0 NIC0_IPADDR=`cat $LIST | grep $MYSERIAL_CD | awk 'BEGIN {FS=","} { print $4 }' | awk 'BEGIN {FS="/"} {print $1}'` NIC0_PREFIX=`cat $LIST | grep $MYSERIAL_CD | awk 'BEGIN {FS=","} { print $4 }' | awk 'BEGIN {FS="/"} {print $2}'` NIC0_HWADDR=`ifconfig $NIC0 | grep HWaddr | awk '{print $5}'` #NIC1 NIC1_IPADDR=`cat $LIST | grep $MYSERIAL_CD | awk 'BEGIN {FS=","} { print $5 }' | awk 'BEGIN {FS="/"} {print $1}'` NIC1_PREFIX=`cat $LIST | grep $MYSERIAL_CD | awk 'BEGIN {FS=","} { print $5 }' | awk 'BEGIN {FS="/"} {print $2}'` NIC1_HWADDR=`ifconfig $NIC1 | grep HWaddr | awk '{print $5}'` #create ifcfg-* cd /mnt/sysimage/etc/sysconfig/network-scripts #ifcfg-NIC0 echo "DEVICE=$NIC0" > $IFCFGNIC0 echo "TYPE=Ethernet" >> $IFCFGNIC0 echo "ONBOOT=yes" >> $IFCFGNIC0 echo "NM_CONTROLLED=yes" >> $IFCFGNIC0 echo "BOOTPROTO=none" >> $IFCFGNIC0 echo "IPADDR=$NIC0_IPADDR" >> $IFCFGNIC0 echo "PREFIX=$NIC0_PREFIX" >> $IFCFGNIC0 echo "GATEWAY=$GATEWAY" >> $IFCFGNIC0 echo "DEFROUTE=yes" >> $IFCFGNIC0 echo "IPV4_FAILURE_FATAL=yes" >> $IFCFGNIC0 echo "IPV6INIT=no" >> $IFCFGNIC0 echo "NAME=\"System $NIC0\"" >> $IFCFGNIC0 echo "HWADDR=$NIC0_HWADDR" >> $IFCFGNIC0 #ifcfg-NIC1 echo "DEVICE=$NIC1" > $IFCFGNIC1 echo "TYPE=Ethernet" >> $IFCFGNIC1 echo "ONBOOT=yes" >> $IFCFGNIC1 echo "NM_CONTROLLED=yes" >> $IFCFGNIC1 echo "BOOTPROTO=none" >> $IFCFGNIC1 echo "IPADDR=$NIC1_IPADDR" >> $IFCFGNIC1 echo "PREFIX=$NIC1_PREFIX" >> $IFCFGNIC1 echo "DEFROUTE=yes" >> $IFCFGNIC1 echo "IPV4_FAILURE_FATAL=yes" >> $IFCFGNIC1 echo "IPV6INIT=no" >> $IFCFGNIC1 echo "NAME=\"System $NIC1\"" >> $IFCFGNIC1 echo "HWADDR=$NIC1_HWADDR" >> $IFCFGNIC1 #Network Restart /mnt/sysimage/etc/init.d/network restart cd /mnt/sysimage/etc/sysconfig echo "NETWORKING=yes" > network echo "HOSTNAME=$HOSTNAME" >> network echo "GATEWAY=$GATEWAY" >> network

3.スクリプトファイルの設置

自動インストールディスクからみて、「/work」の下に上記2ファイルを設置する。

4.kickstart configファイル作成

次は、kickstartのconfigファイル「ks.cfg」を作成する。
「%post」の内容は以下。

bash
mkdir /mnt/sysimage/tmp/work cp -R /mnt/source/work/ /mnt/sysimage/tmp/ sh /mnt/sysimage/tmp/work/ipset.sh

実際の「ks.cfg」の内容は以下。

properties
#platform=x86, AMD64, 又は Intel EM64T #version=DEVEL # Firewall configuration firewall --disabled # Install OS instead of upgrade install # Use CDROM installation media cdrom # Root password rootpw --iscrypted $1$F3O.1DJZ$uuErHjcd.UCbs4SGswt9L. # System authorization information auth --useshadow --passalgo=sha512 # Use graphical install graphical firstboot --disable # System keyboard keyboard us # System language lang ja_JP # SELinux configuration selinux --disabled # Installation logging level logging --level=info # System timezone timezone Asia/Tokyo # Network information network --bootproto=dhcp --device=eth0 --onboot=on # System bootloader configuration bootloader --location=mbr # Clear the Master Boot Record zerombr # Partition clearing information clearpart --all --initlabel # Disk partitioning information part / --fstype="ext4" --grow --size=1 %post --nochroot mkdir /mnt/sysimage/tmp/work cp -R /mnt/source/work/ /mnt/sysimage/tmp/ sh /mnt/sysimage/tmp/work/ipset.sh %end %packages @basic-desktop @desktop-debugging @desktop-platform @directory-server @fonts @general-desktop @graphical-admin-tools @input-methods @kde-desktop @legacy-x @network-server @postgresql @postgresql-client @remote-desktop-clients @scalable-file-systems @server-platform @storage-server @system-admin-tools @virtualization @virtualization-client @virtualization-platform @virtualization-tools @web-server @web-servlet @x11 crypto-utils %end

後は、以前記述した自動インストールディスクの作成のようにISO(もしくは、PXEブート用のソース)を作成し、対象サーバで起動させるだけだ。

今度はDebian系で存在している同様のツール「Preseed」で試してみようかな。