はじめに
Cloud 上にサーバをデプロイする際、当然ながら設定を入れる必要がある。数台なら別に手作業でもあまり問題にはならない。この台数が増えてくると、そうもいっていられなくなる。Ansible や Terra Form で流しこめば、と言っても Network 設定などの最初期設定は行われていることが前提となる。
こういった、「最初期の設定」を自動化する仕組みとして Cloud-Init というものが存在する。起動した VM へ何らかの方法で設定を渡し、最初期設定を行う。この仕組みはもともとCanonical が Amazon EC2 上でインスタンス起動時の初期設定を自動化するために開発されたもの。これが広まって様々なデータソースに対応、事実上のデファクトスタンダードになった。
この様々なデータソースのうち、比較的手軽な NoCloud の仕組みを利用して GNS3 上にデプロイする Ubuntu の初期設定を行う。動作確認とseed.iso作成はいずれも Ubuntu 24.04で実施。
Cloud-init の仕組み
「様々なデータソース」がどこで定義されているかというと、
shakapon@ubuntu:~/NoCloud/os-ctrl/cloudinit$ cat /etc/cloud/cloud.cfg.d/90_dpkg.cfg
# to update this file, run dpkg-reconfigure cloud-init
datasource_list: [ NoCloud, ConfigDrive, OpenNebula, DigitalOcean, Azure, AltCloud, OVF, MAAS, GCE, OpenStack, CloudSigma, SmartOS, Bigstep, Scaleway, AliYun, Ec2, CloudStack, Hetzner, IBMCloud, Oracle, Exoscale, RbxCloud, UpCloud, VMware, Vultr, LXD, NWCS, Akamai, WSL, None ]
のようになっている。このテーブルの前から検索されていき、条件を満たせばその設定が利用される。全部だめならNoneに落ちる。データソースの場所は様々。例えば OpenStack や Ec2 は169.254.169.254へアクセスするし、NoCloud であれば Localにマウントされた ISO ファイルが利用される。
Ubuntu を NoCloud で設定する。
Ubuntu を NoCloud で設定する場合、利用するファイルは以下の3つ。これらのファイルを作成後、seed-isoを作成、VMにCD-ROMとしてマウントして起動する。
| ファイル名 | 目的 | 形式 | コメント |
|---|---|---|---|
| meta-data | インスタンス識別・ホスト名 | yaml | インスタンスのメタ情報(固定ID, ホスト名など) |
| user-data | ユーザ作成、設定、スクリプトなど | yaml | クラウド構成指示(“cloud-config”本体) |
| network-config | ネットワーク設定 | yaml | NetPlanの中身。もともとはuser-dataに入れていたが、外だしが求められるようになった |
meta-data の例
instance-id: os-ctrl-001
local-hostname: os-ctrl.example.com
user-data の例
#cloud-config
hostname: os-ctrl.example.com
timezone: Asia/Tokyo
users:
- name: ubuntu01
gecos: Ubuntu User
groups: sudo
shell: /bin/bash
sudo: ALL=(ALL) NOPASSWD:ALL
plain_text_passwd: "ubuntu-password"
lock_passwd: false
write_files:
- path: /etc/hosts
permissions: '0644'
content: |
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.11.121 os-ctrl.example.com os-ctrl
192.168.11.122 os-com01.example.com os-com01
192.168.11.123 os-com02.example.com os-com02
192.168.11.124 os-com03.example.com os-com03
runcmd:
- echo "Cloud-init complete on $(date)" > /root/cloud-init.log
先頭行に#cloud-config と書く必要がある。これを書かずに作ってしまって少しハマってた。
サンプルでは簡単のためplain_text_password: を利用したが、本番ではmkpasswd でハッシュ化されたパスワードを作り、passwd:を使うことが望ましい。
mkpasswd --method=SHA-512 --rounds=4096
# パスワードを入力(例:ubuntu-password)
network-config の例
version: 2
renderer: networkd
ethernets:
ens3:
addresses:
- 192.168.11.121/24
nameservers:
addresses:
- 192.168.1.1
routes:
- to: default
via: 192.168.11.1
フォーマットは NetPlan の中身。NetPlan であればトップレベルキーとしてnetwork:が必要だが、NoCloud では不要。これはcloud-initが /etc/netplan/50-cloud-init.yaml を自動生成する際に自動でnetwork:を追加してくれるため。
文法チェック
user-data のみLint が用意されている。問題なければ Valid Schema、そうでなければInvalid user-data ... と具体的なキー/型エラーが出る。
shakapon@ubuntu:~$ sudo cloud-init schema --config-file ./user-data
Valid schema ./user-data
イメージファイルのビルド
genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data network-config
NoCloud で作るcidata タイプのデータの条件は3つ。
- ファイルシステムのラベルが
cidataとなっていること。 - ISO 9660 や FAT など、システムが理解できるファイルシステムであること
- トップディレクトリにmeta-dataとuser-data があること(network-config はなくても動いてはくれる)。
作ったファイルの正常性確認。
file コマンドで見てしまうのが一番面倒なさそう。
shakapon@ubuntu:~$ file seed.iso
seed.iso: ISO 9660 CD-ROM filesystem data 'cidata'
もう一つ、実際にマウントしてどう見えるか?
shakapon@ubuntu:~$ sudo mount -o loop seed.iso /mnt
shakapon@ubuntu:~$ ls -l /mnt
total 2
-rw-rw-r-- 1 shakapon shakapon 62 Oct 25 17:19 meta-data
-rw-rw-r-- 1 shakapon shakapon 215 Oct 25 17:46 network-config
-rw-rw-r-- 1 shakapon shakapon 1022 Oct 25 18:58 user-data
shakapon@ubuntu:~$ sudo umount /mnt
GNS3上で実際にBoot してみる
GNS3 上でUbuntu を配置、Configure→CD/DVD とし、先に作成したファイルを選択して起動。
ubuntu@os-ctrl:~$ sudo cloud-init status
status: done
ubuntu@os-ctrl:~$ sudo grep -i datasource /var/log/cloud-init.log|grep seed
(snip)
2025-10-25 09:59:37,869 - stages.py[INFO]: Loaded datasource DataSourceNoCloud - DataSourceNoCloud [seed=/dev/sr0]
(snip)
Statusがdone になっていること。
また、ここで DataSourceNoCloud でseed が/dev/sr0で起動されていることが確認できればOK。
Status: done であれば cloud-init が再度実行されることはない。
これから
NoCloud の手法、** ユーザがisoファイルをマウントできること ** が前提となっている。OpenStack など本格的な環境であれば Meta Data Serviceを利用することがより汎用性を高めてくれる。
GNS3 のラボ環境を使って OpenStack を検証していた。Ubuntu を壊しては再構築を繰り返していたため、簡単に行う手法として NoCloud を採用した。ConfigDrive も試みたのだが、いかなる理由かマウントさせられず、NoCloud を採用することに。OpenStack への展開を考えると ConfigDriveのほうがトータルの学習コスト下げられそうだったんだけれども。
