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 EOF
cloud-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 /mnt
meta-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/
」