YggdrasillNetwork Blog

A blogging framework for hackers.

Vagrant Box を Atlas で管理

概要

Vagrant Box を Atlas by HashiCorp を利用して管理するフローをまとめる。

やりたいこと

  • Vagrant Box を一箇所で管理
    • test-kitchen の環境が会社と自宅にあり、それぞれ利用している Vagrant Box 異なってくる可能性があるため
  • Vagrant Box のバージョン管理
    • Vagrant Box に手を加える場合があるため

必要なもの

  • Atlas アカウント
  • AWS アカウント
    • S3 に Vagrant Box Image を保存するため
  • 作業端末
    • Vagrant ver1.5.0 以上

作業フロー

ベースとなる Box の追加

vagrant box add コマンドを利用して、ベースとなる Box を作業端末に追加する。

  • chef/centos-6.6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ vagrant box add chef/centos-6.6 
==> box: Loading metadata for box 'chef/centos-6.6'
    box: URL: https://vagrantcloud.com/chef/centos-6.6
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) virtualbox
2) vmware_desktop

Enter your choice: 1
==> box: Adding box 'chef/centos-6.6' (v1.0.0) for provider: virtualbox
    box: Downloading: https://vagrantcloud.com/chef/boxes/centos-6.6/versions/1.0.0/providers/virtualbox.box
==> box: Successfully added box 'chef/centos-6.6' (v1.0.0) for 'virtualbox'!

Vagrantfile の作成

vagrant init コマンドを利用して、Vagrantfile を作成

1
2
3
4
5
$ vagrant init chef/centos-6.6
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
  • 作成される Vagrantfile ( コメントアウト行は削除 )
1
2
3
4
5
6
7
8
9
# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "chef/centos-6.6"
end

Vagrantfile の修正

作成した Vagranfile の修正

追加必須

synced_folder の disable

  • 追加行
1
config.vm.synced_folder ".", "/vagrant", disabled: true
  • Vagrantfile
1
2
3
4
5
6
7
8
9
10
# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "chef/centos-6.6"
  config.vm.synced_folder ".", "/vagrant", disabled: true
end

任意で追加

Docker 環境セットアップ

1
2
3
config.vm.provision "docker" do |d| 
  d.version = 'latest'
end

chef 環境セットアップ

1
config.omnibus.chef_version = :latest

Vagrant Box の起動

vagrant up コマンドで起動

Vagrant Box のパッケージ化

vagrant package コマンドを利用して Box のパッケージを作成

1
2
3
4
5
6
7
$ vagrant package --output centos-6.6.box
WARNING: Could not load IOV methods. Check your GSSAPI C library for an update
WARNING: Could not load AEAD methods. Check your GSSAPI C library for an update
==> default: Attempting graceful shutdown of VM...
==> default: Clearing any previously set forwarded ports...
==> default: Exporting VM...
==> default: Compressing package to: /private/tmp/centos-6.6.box

S3 へのアップロード

S3 の任意の場所に作成したパッケージファイル ( e.g. centos-6.6.box ) をアップロード。

アップロード後、ファイルの Everyone へのパーミッションに Open/Download を付加する。

Atlas 上に登録するために、Link の URL を控えておく

1
https://s3-ap-northeast-1.amazonaws.com/ryoogata.ap-northease-1.tech-dev.info/centos-6.6.box

Atlas 上で新しい Box を作成

1. Atlas にログイン後、新規 Box 追加

Atlas ログイン直後の Development の Tab から create a box here. をクリックするか、下記の URL にアクセスして新規 Box 追加画面へ移る。

https://atlas.hashicorp.com/boxes/new

2. Create a new box

Name

1
centos-6.6

Short description

1
chef/centos-6.6 ( v1.0.0 ) base customized image

Description

1
2
3
4
5
chef/centos-6.6 ( v1.0.0 ) をベースに下記のアプリケーションをインストール済みイメージ

* Virtualbox Guest Additions
* Chef
* Docker

3. New Box Version

Version

1
1.0.0

Description

1
2
3
4
5
6
7
8
下記のバージョンのアプリケーションをインストール済みイメージ

* Virtualbox Guest Additions
  * 4.3.20
* Chef
  * 12.0.3
* Docker
  * 1.3.2

4. New Box Provider

Provider

1
virtualbox

`

URL

1
https://s3-ap-northeast-1.amazonaws.com/*******/centos-6.6.box

5. Release version

Release version ボタンを押下し、リリースする

Vagrant トラブルシュート

error: No such device

vagrant up 時、下記のエラーメッセージを吐いて起動に失敗する場合がある。

1
2
3
4
5
6
7
8
9
10
11
12
13
==> default: Mounting shared folders...
    default: /vagrant => /private/tmp
Vagrant::Errors::LinuxMountFailed: Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device

sync folder が正常に mount できずにエラーになる。Vagrant box に Virtualbox Guest Additions がインストールされていなかったり、Vagrant のバージョンとの乖離がありすぎると問題になるみたい。

Vagrant up 時に sync folder を mount しないように Vagrantfile に config.vm.synced_folder ".", "/vagrant", disabled: true の記述を追加して回避。