サーバ大量構築時のキモ ~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

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で実行するために少し変えている。

#!/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」の内容は以下。

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

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

#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」で試してみようかな。