0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ubuntu を NoCloud で設定する

Last updated at Posted at 2025-10-25

はじめに

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 とし、先に作成したファイルを選択して起動。

UbuntuNoCloud.png

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のほうがトータルの学習コスト下げられそうだったんだけれども。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?