Help us understand the problem. What is going on with this article?

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 のための公開鍵を設置したりもできるので、もうとっと作りこめばそれなりに有用かもしれないです。

ngyuki
テック系男子。 ただのやってみた系の記事ははてなブログに、それ以外の技術系のネタは Qiita に投稿します。
https://ngyuki.jp/
headjapan
中規模~大規模の安定した基幹システム・大規模サイトの分析・要件定義・設計・開発を得意とする、総合的な開発会社です。
http://www.headjapan.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした