Ubuntuのサーバー版イメージには最初からcloud-initがインストールされています。このcloud-initはクラウド上のインスタンスを立ち上げる際、
cloud-initの位置づけ
まずはcloud-initの位置づけから説明します。cloud-initそのものを知っている・
今世紀に入って
ただし、
従来、
「自動化できるものは自動化する」
Description: Init scripts for EC2 instances
 EC2 instances need special scripts to run during initialisation
 to get hold of ssh keys and to let the user run various scripts.EC2には
- メタデータのpublic-keysを「 /root/」.ssh/ authorized_ keys に追加し、 インスタンスが起動したらrootでsshログインできるようにする [2]。 
- ユーザーデータをそのまま「 /tmp」以下にコピーして実行する。 
その後、
当初はAmazon EC2専用のツールでしたが、
サーバーの構成管理と言えばAnsibleが定番です。cloud-initのできることはAnsibleとかぶる部分もあるものの、
VagrantfileやDockerfileも機能的に近い存在です。設定済みのイメージファイルを作りたいならVagrantfile/
cloud-initの仕組み
cloud-initは
「何らかの方法」
cloud-initはデータの取得方法をサービスごとの
メタデータについては大抵の場合クラウドサービスが自動的に付加します。cloud-initはメタデータ内部の情報
cloud-initの本体はユーザーデータになります。cloud-initは#cloud-config」
cloud-utilsでデータストア作成
さて、
まず最初に
- SMBIOS(System Management BIOS) 上のシリアル番号 
- カーネルのコマンドラインパラメーター
- ラベル「 cidata」が付けられたファイルシステム 
複数指定された場合、
SMBIOSはマシン固有のデータをOSなどのソフトウェアに渡す仕組みです。Linuxであれば/sys/」
仮想マシンなどで使われているQEMUには、
$ sudo cat /sys/class/dmi/id/product_serial ds=nocloud-net;seedfrom=http://10.0.0.1:8000/
上記の例なら、
カーネルのコマンドラインパラメーターは、
ファイルシステムのラベルとしてcidata」
cidataタイプのデータは次の3つの条件が満たされている必要があります。
- ファイルシステムのラベルが「 cidata」であること 
- システムが解釈できるファイルシステムであること(ISO9660かFATが使われることが一般的です) 
- トップディレクトリに「meta-data」 と 「user-data」 の2つのファイルが存在すること 
上記の条件を満たすのデータは手作業でも作れますが、
$ sudo apt install cloud-image-utils
cloud-image-utilsパッケージは、
$ cloud-localds --help
Usage: cloud-localds [ options ] output user-data [meta-data]
   Create a disk for cloud-init to utilize nocloud
   options:
     -h | --help             show usage
     -d | --disk-format D    disk format to output. default: raw
                             can be anything supported by qemu-img or
                             tar, tar-seed-local, tar-seed-net
     -H | --hostname    H    set hostname in metadata to H
     -f | --filesystem  F    filesystem format (vfat or iso), default: iso9660
     -i | --interfaces  F    write network interfaces file into metadata
     -N | --network-config F write network config file to local datasource
     -m | --dsmode      M    add 'dsmode' ('local' or 'net') to the metadata
                             default in cloud-init is 'net', meaning network is
                             required.
     -V | --vendor-data F    vendor-data file
     -v | --verbose          increase verbosity
   Note, --dsmode, --hostname, and --interfaces are incompatible
   with metadata.
   Example:
    * cat my-user-data
      #cloud-config
      password: passw0rd
      chpasswd: { expire: False }
      ssh_pwauth: True
    * echo "instance-id: $(uuidgen || echo i-abcdefg)" > my-meta-data
    * cloud-localds my-seed.img my-user-data my-meta-data
    * kvm -net nic -net user,hostfwd=tcp::2222-:22 \
         -drive file=disk1.img,if=virtio -drive file=my-seed.img,if=virtio
    * ssh -p 2222 ubuntu@localhostオプションからもわかるようにホストネームやネットワークインターフェースも指定可能です。これらはcloud-configではなく、
あらかじめcloud-configデータを作っておきます。今回は初期状態で存在するアカウント
$ cat >user-data <<EOF
#cloud-config
password: ubuntu
chpasswd: { expire: False }
ssh_pwauth: True
EOFcloud-localdsでデータストアを作成します。設定は基本的に規定値で問題ありません。
$ cloud-localds user-data.img user-data
作られたデータストアを確認しましょう。まず、
$ file user-data.img user-data.img: ISO 9660 CD-ROM filesystem data 'cidata'
データストアをマウントして中身を確認してみましょう。
$ sudo mount -o ro user-data.img /mnt/
$ cat /mnt/meta-data
{
"instance-id": "iid-local01"
}
$ cat /mnt/user-data
#cloud-config
password: ubuntu
chpasswd: { expire: False }
ssh_pwauth: True
$ sudo umount /mntmeta-dataにはインスタンスIDが、
これでローカルマシン用のデータストアが作成されました。
QEMUでNoCloudを使用する
では作成したデータストアをQEMUで使ってみましょう。必要なパッケージとイメージファイルをダウンロードします。
$ sudo apt install qemu-kvm qemu-utils ovmf $ wget https://cloud-images.ubuntu.com/releases/18.04/release/ubuntu-18.04-server-cloudimg-amd64.img $ qemu-img resize ubuntu-18.04-server-cloudimg-amd64.img 10G
最後のコマンドでイメージサイズを2GiBから10GiBに変更しています。この時点ではディスクのサイズが変わっただけで、
さらに今回は第441回でも紹介したように、
$ cp /usr/share/OVMF/OVMF_VARS.fd .
UEFI/
最後にルートファイルシステムに加えて、
$ sudo qemu-system-x86_64 \
    -m 2G -enable-kvm -nographic \
    -net user,hostfwd=tcp::2222-:22 \
    -drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \
    -drive if=pflash,format=raw,file=OVMF_VARS.fd \
    -drive file=ubuntu-18.04-server-cloudimg-amd64.img,format=qcow2 \
    -drive file=user-data.img,format=rawデータストアとして必要なのは最後の1行だけです。起動してしばらくすると、
[ 20.396382] cloud-init[1131]: Cloud-init v. 18.5-21-g8ee294d5-0ubuntu1~18.04.1 finished at Sun, 17 Mar 2019 12:03:34 +0000. Datasource
これでcloud-initの設定完了ですので、hostfwd」
$ ssh -p 2222 ubuntu@localhost
virt-managerでNoCloudを使用する
もう一つの例として、
$ sudo apt install virtinst
あとは
$ virt-install \ --name cloudtest \ --vcpus 1 --ram 2048 \ --hvm --virt-type kvm \ --os-type linux --os-variant ubuntu18.04 \ --graphics none --serial pty --console pty \ --import --noreboot \ --disk path=ubuntu-18.04-server-cloudimg-amd64.img \ --disk path="$PWD/user-data.img,bus=ide,device=cdrom"
こちらも渡しているオプションのうちデータストア関連は最後の1行だけです。
実際に仮想マシンを起動し、
$ virsh start cloudtest $ virsh console cloudtest
SMBIOSで指定する方法
最後にSMBIOSで設定する方法も紹介しておきます。この方法の最も便利な点は、
まずあらかじめ、
あとはuser-data.
$ sudo qemu-system-x86_64 \
    -m 2G -enable-kvm -nographic \
    -net user,hostfwd=tcp::2222-:22 \
    -drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \
    -drive if=pflash,format=raw,file=OVMF_VARS.fd \
    -drive file=ubuntu-18.04-server-cloudimg-amd64.img,format=qcow2 \
    -smbios "type=1,serial=ds=nocloud-net;seedfrom=https://example.com/cloud-init/"「type=1」ds=nocloud-net;seedfrom=https://」
「ds=nocloud-net」
「ds=nocloud」
うまく設定できていれば、
$ sudo cat /sys/class/dmi/id/product_serial ds=nocloud-net;seedfrom=https://examplecom/cloud-init/
cloud-initそのものの実行ログは/var/」/var/」