教習所で免許を取っていたとき、ふと「俺は人生で何回、クラッチを踏むんだろうか」と考えたことがある。運転最初の頃、クラッチを踏んでギアを変えるというのがまどろっこしいな。しないとギアは入らないんだけどぉ。オートマでその問題は無くなったが、最初のころは、オートマで存在しないクラッチを踏む癖が抜けなかった。乗っていた車のサイドブレーキがフットペダルだから微妙に危なかった。
また、社会人になって、ふと「俺は人生で何回、CTRL+ALT+DELを押すんだろうか」と考えたことがある。これもまどろっこしい。まぁ、CTRL+ALT+DELは、レジストリ1発で回避できるので、その問題は無くなったが。
今は、Ubuntuのテンプレートを作る時、ふと「人生で何回OSから入れ直したテンプレートを作る必要があるんだろうか」と考えている。クラウドならOSを入れ直す必要もないし、新しいイメージを使えば、OSのアップデートが当たっているし。
閑話休題
cloud-initを使ってOSの構築を自動化してみる。EC2などのUser Dataである。vSphereでも使える。(実は、オンプレミスの環境、クラウド、色々なところで使える。)
例えば、vSphere環境上でAmazon Linuxの環境を立ち上げる場合、cloud-initを利用する必要がある。metadataとuserdataが入っているISOイメージをマウントして起動する必要があるが、実はそんなことをしなくてもvSphereのパラメータでも渡せる。
以下から、Ubuntu 24.04のイメージ (ova)を拾ってくる。
- govcが使えるように設定されていること
- ovftoolが利用できるようになっていること。
- sshのキー運用ができていること。(SSHのキーペアがあること)
環境変数
CLOUD_INIT_BASE_DIR=/PATH/cloud-init #作業ディレクトリ
VM_NAME=ubuntu2404 #作成するVM名
DISKSIZE=50GB #ディスクサイズ
CONNECT_NETWORK="VM Network" #接続するネットワーク
DS=ds1 #インポート先のデータストア
ESX_HOST=esxhost1 #インポート先のESX
ESX_PASS=VMware1! #ESXのrootパスワード
ovftoolでのインポート
ここは、vSphere Clientでやっても構わない。ただ、vSphere Clientからのインポートは、手数が多いのと、時間がかかるので注意。というか、vSphere Clientでインポートをするのはやめた方がいい。ふと「自分は、人生でどれだけvSphere Clientのインポート待ちの時間で時間を無駄にするのだろうか」なので。
ovftool \
--X:logFile=ovftool.log \
--acceptAllEulas \
--allowAllExtraConfig \
--allowExtraConfig \
--noSSLVerify \
--name=${VM_NAME} \
--datastore=${DS} \
--diskMode=thin \
--prop:instance-id="id-ovf" \
--prop:hostname="ubuntuguest" \
--net:"VM Network=${CONNECT_NETWORK}" \
${CLOUD_INIT_BASE_DIR}/ubuntu-24.04-server-cloudimg-amd64.ova \
vi://root:"${ESX_PASS}"@${ESX_HOST}/
govc vm.disk.change -vm $VM_NAME -disk.label "Hard disk 1" -size ${DISKSIZE}
ユーザデータとメタデータの作成
# user data
DEFAULT_PASSWORD="Password"
SSHKEY=$(cat ~/.ssh/id_rsa.pub)
HASHED_PASSWORD=$(openssl passwd -6 "${DEFAULT_PASSWORD}")
cat > ${CLOUD_INIT_BASE_DIR}/ubuntu-user-data <<EOF
#cloud-config
users:
- name: ubuntu
gecos: Ubuntu
sudo: ALL=(ALL) NOPASSWD:ALL
groups: sudo
shell: /bin/bash
lock_passwd: False
passwd: ${HASHED_PASSWORD}
ssh_authorized_keys:
- "${SSHKEY}"
ssh_pwauth: True
chpasswd:
expire: False
EOF
# meta data
cat > ${CLOUD_INIT_BASE_DIR}/ubuntu-meta-data <<EOF
local-hostname: ubuntu2404-amd64
EOF
VMの設定
USERDATA_FILE="ubuntu-user-data"
METADATA_FILE="ubuntu-meta-data"
userdata=$(gzip -c "$USERDATA_FILE" | base64 -w0)
govc vm.change -vm "$VM_NAME" \
-e guestinfo.userdata="$userdata" \
-e guestinfo.userdata.encoding="gzip+base64"
metadata=$(gzip -c "$METADATA_FILE" | base64 -w0)
govc vm.change -vm "$VM_NAME" \
-e guestinfo.metadata="$metadata" \
-e guestinfo.metadata.encoding="gzip+base64"
VMのパワーオン
govc vm.power -on ${VM_NAME}
govc vm.ip "$VM_NAME"
ちなみに、ISOイメージでユーザデータとメタデータを渡したい場合は以下ユーザデータ、メタデータを作ったあと、ISOイメージを作って、VMにマウントして起動をする。
apt -y install cloud-image-utils
cloud-localds ${CLOUD_INIT_BASE_DIR}/ubuntu-cloud-init.iso ${CLOUD_INIT_BASE_DIR}/ubuntu-user-data ${CLOUD_INIT_BASE_DIR}/ubuntu-meta-data
CDROM_DEVICE=$(govc device.ls -vm ${VM_NAME} | grep cdrom- | awk '{print $1}')
govc device.cdrom.insert -vm ${VM_NAME} -device "$CDROM_DEVICE" "[データストア名] パス/ubuntu-cloud-init.iso"
govc device.connect -vm ${VM_NAME} "$CDROM_DEVICE"
govc vm.power -on ${VM_NAME}
govc vm.ip "$VM_NAME"
コンソールからはパスワードログイン、SSHでも証明書認証でログインができるようになった。
これでOSをインストールをすることなく、OSイメージがすぐに利用できるようになった。ただし、このUbuntuのイメージでできるVMのHWバージョン10 (ESXi5.5)で作成されるファイルシステムは、ext4である。