Edited at

Vagrant で VirtualBox の guestproperty を使って cloud-init を使ってみる

More than 3 years have passed since last update.

Vagrant で cloud-init を、どうにかこうにかして使ってみました。


  • ホスト


    • Windows 7

    • Vagrant 1.7.2

    • VirtualBox 4.3.26



  • ゲスト


    • CentOS 7.1.1503

    • cloud-init 0.7.5




Box の作成

Vagrant で適当な CentOS 7 の環境を作って SSH でログインします。

vagrant up

vagrant ssh

cloud-init をインストールします。

yum install -y cloud-init

cloud-init の設定ファイルを作ります。

cloud-init を None データソースで動作確認する のように None データソースを使います。

cat <<EOS> /etc/cloud/cloud.cfg.d/vbox-cloud-init.cfg

datasource_list: [None]
datasource:
None:
metadata:
userdata_raw: |
#include
/etc/cloud/user-data
EOS

VirtualBox の guestproperty を使うとホスト/ゲスト間で値を共有することができます。

これを利用して↑の cloud-init の設定ファイルで指定した位置に user-data を配置するためのスクリプトを作ります。

cat <<EOS> /usr/local/libexec/vbox-cloud-init.sh

#!/bin/bash
VBoxControl --nologo guestproperty get user-data | sed '1s/^Value: *//' > /etc/cloud/user-data
EOS
chmod +x /usr/local/libexec/vbox-cloud-init.sh

このスクリプトをシステム起動時に実行するために systemd のユニットを作ります。

cloud-init 関連のサービスよりも先に実行する必要があります。

cat <<EOS> /etc/systemd/system/vbox-cloud-init.service

[Unit]
Description=vbox-cloud-init
Before=cloud-init.service cloud-init-local.service cloud-config.target cloud-config.service cloud-final.service
After=local-fs.target systemd-journald.socket basic.target system.slice

[Service]
Type=oneshot
ExecStart=/usr/local/libexec/vbox-cloud-init.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOS

systemd の設定ファイルを読み直して有効にします。

systemctl daemon-reload

systemctl enable vbox-cloud-init
systemctl status vbox-cloud-init

ホスト側のコンソールに戻って box を作ります。

vagrant package --output vbox-cloud-init.box

Box を追加します。

vagrant box add vbox-cloud-init vbox-cloud-init.box --force


Vagrant の環境の起動

別のディレクトリで Vagrantfile を作ります。

ホストのファイルから guestproperty を設定しているのがポイントです。

Vagrant.configure(2) do |config|

config.vm.box = "vbox-cloud-init"

config.vm.provider :virtualbox do |vb|
vb.customize ['guestproperty', 'set', :id, 'user-data', File.read('user-data')]
end
end

user-data も適当に作ります。

#cloud-config

user: oreore
hostname: oreore.example.com
fqdn: oreore.example.com
timezone: "Asia/Tokyo"

起動して接続します。

vagrant up

vagrant ssh

cloud-init によりホスト名の設定やらユーザーの作成やらが行われています。

$ uname -n

oreore.example.com

$ id oreore
uid=1000(oreore) gid=1000(oreore) groups=1000(oreore),4(adm),10(wheel),190(systemd-journal)


Vagrant の provision でいいじゃん! って感じですが、Vagrant の provision だと sshd が起動した後になるので、例えばホスト名とかはもっと前の段階で設定させたいこともあると思うし、vagrant ssh のための公開鍵を設置したりもできるので、もうとっと作りこめばそれなりに有用かもしれないです。