サーバ大量構築時のキモ ~Redhat系Linuxへの静的IPアドレス設定スクリプト~
Pocket

サーバを構築する際に、大量のLinuxやUNIXに静的IPアドレスを設定する事がある。
これを楽にするために、対象のホスト名を引数に指定してやることでIPアドレスを自動指定してやるスクリプト。環境に応じて変更を行う事を想定し、必要最低限と思われる箇所だけピックアップして書いてみた。

なお記述に使用したのはRedhat系というかCentOSなので、Debian系の場合は別途書き換える必要がある。

考え方としては、ホスト名と対応するIPアドレスの一覧ファイルを個別に用意して、それをスクリプト側に読み込ませるというもの。

イメージとしては以下。SSLクライアントでサーバに接続し、手動で引数としてホスト名を指定。で、各ホスト名に対応しているIPアドレスのリスト「host.list」を「setip.sh」に読み込ませる事でIPアドレスを設定させるというもの。

一覧ファイルは後日記述するWindows用の設定スクリプトと共通にすることでIPアドレスに変更が起きた時でも対応できるようになる。

Sponsored Links

まずは一覧ファイルから。

●host.list

HostName,DefaultGateWay,NIC0,NIC1
Server0,192.168.0.1,192.168.0.100/24,172.26.0.100/24
Server1,192.168.0.1,192.168.0.101/24,172.26.0.101/24
Server2,192.168.0.1,192.168.0.102/24,172.26.0.102/24
Server3,192.168.0.1,192.168.0.103/24,172.26.0.103/24
Server4,192.168.0.1,192.168.0.104/24,172.26.0.104/24
Server5,192.168.0.1,192.168.0.105/24,172.26.0.105/24
Server6,192.168.0.1,192.168.0.106/24,172.26.0.106/24
Server7,192.168.0.1,192.168.0.107/24,172.26.0.107/24
Server8,192.168.0.1,192.168.0.108/24,172.26.0.108/24
Server9,192.168.0.1,192.168.0.109/24,172.26.0.109/24

左列にホスト名を記述し、右にデフォルトゲートウェイ、各NICに割り当てるIPアドレス/サブネットマスクを記述する。

●setip.sh

#!/bin/sh
LIST="~/host.list"
NIC0="eth0"
NIC1="eth1"

IFCFG-NIC1="ifcfg-${NIC1}"
  
if [ $# -ne 1 ]; then
    echo "Please input 'setip.sh HOSTNAME'"
    echo ""
    exit 1
fi
 
if [ -z `cat $LIST | grep $1` ]; then
    echo "It did not exist in [$ LIST] within [$ 1]"
    echo ""
    exit 1
fi
 
#Host Name
HOSTNAME=`cat $LIST | grep $1 | awk 'BEGIN {FS=","} { print $1 }'`
 
#Default Gateway
GATEWAY=`cat $LIST | grep $1 | awk 'BEGIN {FS=","} { print $2 }' | awk 'BEGIN {FS="/"} {print $1}'`
 
#NIC0
NIC0_IPADDR=`cat $LIST | grep $1 | awk 'BEGIN {FS=","} { print $3 }' | awk 'BEGIN {FS="/"} {print $1}'`
NIC0_PREFIX=`cat $LIST | grep $1 | awk 'BEGIN {FS=","} { print $3 }' | awk 'BEGIN {FS="/"} {print $2}'`
NIC0_HWADDR=`ifconfig $NIC0 | grep HWaddr | awk '{print $5}'`
 
#NIC1
NIC1_IPADDR=`cat $LIST | grep $1 | awk 'BEGIN {FS=","} { print $4 }' | awk 'BEGIN {FS="/"} {print $1}'`
NIC1_PREFIX=`cat $LIST | grep $1 | awk 'BEGIN {FS=","} { print $4 }' | awk 'BEGIN {FS="/"} {print $2}'`
NIC1_HWADDR=`ifconfig $NIC1 | grep HWaddr | awk '{print $5}'`
 
#create ifcfg-*
cd /etc/sysconfig/network-scripts
 
#ifcfg-NIC0
IFCFGNIC0="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
IFCFGNIC1="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
/etc/init.d/network restart
 
 
cd /etc/sysconfig
echo "NETWORKING=yes" > network
echo "HOSTNAME=$HOSTNAME" >> network
echo "GATEWAY=$GATEWAY" >> network

あくまでも最低限の機能のみ設定している。
このホスト名の引数入力すら面倒な場合は、事前に物理サーバの確認が必要になるがサーバのシリアルコードを利用する方法がある。

工場か実機に記述されているシリアルコードを事前に調べておき、「host.list」に追記。
で、「dmidecode」コマンドでシリアルコードを調べ、対応させればいい。

とりあえず以上。

Pocket

Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。