今更ながらcloud-initでUbuntuのイメージを利用する。

投稿者: | 1月 18, 2025

教習所で免許を取っていたとき、ふと「俺は人生で何回、クラッチを踏むんだろうか」と考えたことがある。運転最初の頃、クラッチを踏んでギアを変えるというのがまどろっこしいな。しないとギアは入らないんだけどぉ。オートマでその問題は無くなったが、最初のころは、オートマで存在しないクラッチを踏む癖が抜けなかった。乗っていた車のサイドブレーキがフットペダルだから微妙に危なかった。

また、社会人になって、ふと「俺は人生で何回、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}
 
インポート時、Warningが出るが無視してよい。

ユーザデータとメタデータの作成

記載の詳細は、別途調べてほしいが、何となく見ればわかると思う。
 
# 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の設定

ユーザデータとメタデータをVMの設定に練り込む。gzipで圧縮しなくてもよかったんだが、一応しておく。
 
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である。

コメントを残す