cloud-initはシステム起動時の初期設定を自動化する仕組みです。AWSやAzureなどのパブリッククラウドでの実績が有名ですが、実はオンプレミスの仮想マシンに対してもcloud-initを利用する事ができます。このページではcloud-initを利用して仮想マシンのIPアドレスやホスト名を設定する方法を説明します。
前提
参照資料
公式ドキュメントは以下の通りです。2次情報に当たるRedhat公式ドキュメントは、すでに一部設定がレガシー扱いになっている事に注意ください。
動作確認済環境
- vCenter 7.0U3f (7.0.3-20051473)
- ESXi 7.0U3f (7.0.3-20036589)
- Rocky Linux 8.6
cloud-initのインストール
cloud-initをインストールします。この操作によって、isoファイルなどで与えた初期設定を元に仮想マシンが起動するようになります。
dnf install cloud-init
それではcloud-initによってホスト名とIPアドレスを変更できるかどうかを確かめましょう。念の為、設定変更前のホスト名とIPアドレスをメモに控えます。
[root@linux060 ~]# hostname linux060.gokatei.go [root@linux060 ~]# ifconfig ens192 ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.20.60 netmask 255.255.255.0 broadcast 192.168.20.255 inet6 fe80::250:56ff:fe8f:220a prefixlen 64 scopeid 0x20<link> ether 00:50:56:8f:22:0a txqueuelen 1000 (Ethernet) RX packets 80 bytes 9119 (8.9 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 65 bytes 8555 (8.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@linux060 ~]#
ここまでの操作が完了したら、仮想マシンを停止します。
shutdown -h now
isoファイルの作成
network-config
cloud-initのネットワークの指定方法は以下の3通りがあります。
Redhat公式ドキュメント「3.9. cloud-init を使用した静的ネットワーク設定」で紹介されているのは「ENI(Legacy)」の手法です。このサイトでは「Networking Config Version 2」を紹介します。ですので、このサイトの紹介例はRedhatの例と大きく異なる事に注意ください。
「network-config」という名前のファイルを以下のように作成します。cloud-init公式資料「NoCloud」の説明の通り、任意のファイル名は許容されず、必ず「network-config」というファイル名を使用する必要があります。
「network-config」の記述方法は、Ubuntuなどのディストリビューションで広く使用されているnetplanと全く同じ書式を採用しています。
cat << EOF > network-config version: 2 ethernets: interface0: match: name: '*ens192*' set-name: ens192 dhcp4: no dhcp6: no addresses: - 192.168.20.70/24 - fc00:0:0:20::70/64 gateway4: 192.168.20.1 gateway6: fc00:0:0:20::1 EOF
user-data
user-dataには初期パスワードやsshdの設定などを記述します。他にも様々な設定が可能ですが、具体的なユースケースはRedhat公式ドキュメント「第3章 cloud-init の設定」が分かりやすいでしょう
cat << EOF > user-data #cloud-config password: P@ssw0rd chpasswd: {expire: False} ssh_pwauth: True ssh_authorized_keys: - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDbQpQXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXcVr xxxxxxxxxxxx@hotmail.co.jp - ssh-rsa AAAAB3NzXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX2nxivJc= yyyyyyyyyyyyyyy@hotmail.co.jp EOF
meta-data
meta-dataにはホスト名などを記述します。
「Network Configuration ENI (Legacy)」ではmeta-dataにIPv4アドレスなどのネットワーク設定を記述します。「Network Configuration ENI (Legacy)」と「Networking Config Version 2」は設定を記述するファイルが異なる事に注意ください。
cat << EOF > meta-data instance-id: id-ovf local-hostname: linux070.gokatei.go EOF
ISOファイルの作成
network-config, user-data, meta-dataの3ファイルの生成が完了したら、これら3ファイルを格納するISOファイルを作成します。ISOファイルの作成はgenisoimageというコマンドラインツールを使うのが便利でしょう。まずはgenisoimageをインストールします。
dnf install genisoimage
以下のような操作例でisoファイルを作成します。
genisoimage \ -output linux070.iso \ -volid cidata \ -joliet -rock user-data meta-data network-config
cloud-initの動作確認
ISOファイルをESXiホストへ転送し、仮想マシンに接続します。
ISOファイルが接続されている状態で、仮想マシンを起動します。
起動時のログを眺めると、cloud-initによるIPアドレス設定などを観察する事ができます。
想定通りのIPアドレスとホスト名が設定された事を確認します。