Pocket

前にCentOSで動作するIPアドレス、ホスト名を各筐体ごとに自動設定するスクリプトを作成したので、今回はそのUbuntu版(多分Debianでも動くと思うけど)。
基本的には、以前書いたスクリプトをUbuntu用に焼き直しただけだ。
今回の検証では、Ubuntu 14.04 LTS(Desktop及びServer Edition)を使用している。

まずはホスト名やIPアドレスを記述した外部ファイル。 こちらはそのまま流用する。

●host.list

hostname,serialno,defaultgw,nic0,nic1
Test-UbuntuOS001,564D33C9F632AB40148800E9CA90D059,192.168.0.1,192.168.0.31/24,172.26.0.31/24
Test-UbuntuOS002,564DAB560AE59CD285EDCFE97F5A9E64,192.168.0.1,192.168.0.32/24,172.26.0.32/24
Test-UbuntuOS003,564DF163D810265B56707D081C45716F,192.168.0.1,192.168.0.33/24,172.26.0.33/24
Test-UbuntuOS004,564DE8B12B9FFE98E364AA9375CDB04A,192.168.0.1,192.168.0.34/24,172.26.0.34/24

次はスクリプト。 ネットワークの設定周りを変えている。
UbuntuはCentOSと違い、ネットワークアドレスやブロードキャストアドレスも手動で入力する必要がある。そのため、こちらの関数を使用して、IPアドレスとマスクビットからそれらを計算させることにした。作者さん、感謝。
また、Ubuntuの仕様なのか分からないが、再起動を行わないとネットワークの変更がうまく適用されないようなので、最後に再起動を実行させている。

Sponsored Links

実行の際には、以下のようにコマンドを打ってもらいたい。

sudo bash setip.sh

●setip.sh

#!/bin/sh

function get_network()
{
	local NETWORK=""
	local BROADCAST=""
	local NETMASK=""

	local IPADDR="$1"
	local MASKBIT="$2"

	local ip_array=(`echo "$IPADDR" | sed -e "s/\./ /g"`)
	local ip_index=0

	while [ $ip_index -lt 4 ]
	do
		if [ "$MASKBIT" -lt 8 ]
		then
			MASK=$((256-2**$((8-MASKBIT))))
			MASK_REV=$((~MASK%256+256))
			MASKBIT=0
		else
			MASK=255
			MASK_REV=0
			MASKBIT=$((MASKBIT - 8))
		fi

		NETWORK="${NETWORK}.$((ip_array[ip_index] & MASK))"
		BROADCAST="${BROADCAST}.$((ip_array[ip_index] | MASK_REV))"
		NETMASK="${NETMASK}.$MASK"

		ip_index=$((ip_index + 1))
	done

	NETWORK=`echo $NETWORK | sed -e "s/^\.//"`
	BROADCAST=`echo $BROADCAST | sed -e "s/^\.//"`
	NETMASK=`echo $NETMASK | sed -e "s/^\.//"`

	echo "$NETWORK $BROADCAST $NETMASK"
}

LIST="./host.list"
NIC0="eth0"
NIC1="eth1"

SCRIPT_DIR=`dirname $0`
cd $SCRIPT_DIR

MYSERIAL_CD=`dmidecode | grep UUID | awk 'BEGIN { FS=": "; } { 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 -e HWaddr -e ハードウェアアドレス | awk '{print $5}'`

NIC0_NEINFO=(`get_network "$NIC0_IPADDR" "$NIC0_PREFIX"`)
NIC0_NEADDR=${NIC0_NEINFO[0]}
NIC0_BRADDR=${NIC0_NEINFO[1]}
NIC0_PRMASK=${NIC0_NEINFO[2]}

#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 -e ハードウェアアドレス | awk '{print $5}'`

NIC1_NEINFO=(`get_network "$NIC1_IPADDR" "$NIC1_PREFIX"`)
NIC1_NEADDR=${NIC1_NEINFO[0]}
NIC1_BRADDR=${NIC1_NEINFO[1]}
NIC1_PRMASK=${NIC1_NEINFO[2]}

#create ifcfg-*
cd /etc/network/

echo "# The loopback network interface" >  interfaces
echo "auto lo" 							>> interfaces
echo "iface lo inet loopback" 			>> interfaces
echo ""									>> interfaces

#ifcfg-NIC0
echo "# The primary network interface"  >> interfaces
echo "auto $NIC0"						>> interfaces
echo "iface $NIC0 inet static"			>> interfaces
echo "address $NIC0_IPADDR"				>> interfaces
echo "network $NIC0_NEADDR"				>> interfaces
echo "netmask $NIC0_PRMASK"				>> interfaces
echo "broadcast $NIC0_BRADDR"			>> interfaces
echo "gateway $GATEWAY"					>> interfaces
echo ""									>> interfaces

#ifcfg-NIC1
echo "# The secondery network interface" >> interfaces
echo "auto $NIC1"						>> interfaces
echo "iface $NIC1 inet static"			>> interfaces
echo "address $NIC1_IPADDR"				>> interfaces
echo "network $NIC1_NEADDR"				>> interfaces
echo "netmask $NIC1_PRMASK"				>> interfaces
echo "broadcast $NIC1_BRADDR"			>> interfaces
echo "gateway $GATEWAY"					>> interfaces
echo ""									>> interfaces

#set hostname
echo "$HOSTNAME"						>  /etc/hostname
sed -i -e "/^127.0.1.1/c\127.0.1.1       $HOSTNAME" /etc/hosts

#Network Restart
service network-manager stop
service network-manager start

#Reboot
reboot

 

Pocket

Written by blacknon

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

This article has 1 comments

  1. Pingback: サーバ大量構築時のキモ ~ipmitool経由でサーバのUUID(GUID)を取得~ | 俺的備忘録 〜なんかいろいろ〜

Leave a Comment

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