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

Vagrant入門

More than 5 years have passed since last update.

====================

目的

Vagrant公式サイトのGetting Startedを超訳する。

前提

ソフトウェア バージョン 備考
OS X 10.8.5
vagrant 1.6.0

構成

詳細

セットアップ

インストール
+ こっち

アンインストール
+ Windows:コントロールパネルから削除
+ Mac OS X:/Application/Vagrantディレクトリと/usr/bin/vagrantファイルを削除する
+ Linux:/opt/vagrantディレクトリと/usr/bin/vagrantファイルを削除する

はじめに

Vagrantを使うことのメリットを知りたければここを参照。

はじめにVagrantのインストールVirtualBoxのインストールを済ませておく。

実行

$ vagrant init hashicorp/precise32
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'hashicorp/precise32' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Loading metadata for box 'hashicorp/precise32'
    default: URL: https://vagrantcloud.com/hashicorp/precise32
==> default: Adding box 'hashicorp/precise32' (v1.0.0) for provider: virtualbox
    default: Downloading: https://vagrantcloud.com/hashicorp/precise32/version/1/provider/virtualbox.box
==> default: Successfully added box 'hashicorp/precise32' (v1.0.0) for 'virtualbox'!
==> default: Importing base box 'hashicorp/precise32'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'hashicorp/precise32' is up to date...
==> default: Setting the name of the VM: vagrant_introduction_default_1399426841280_52495
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...
    default: /vagrant => /Users/k2works/projects/github/vagrant_introduction

上記のコマンドを実行したらUbuntu 12.04 LTS 32-bitのVirtualBox環境を実行できるようになる。
vagrant sshコマンドでSSHログインできます、そしてvagrant destroyコマンドで削除できます。

プロジェクトのセットアップ

プロジェクトセットアップの最初のステップはVagrantfileを使って設定する。Vagrantfileの目的は以下の2点。

  1. プロジェクトのルートディレクトリをマークする。Vagrantの設定のほとんどはこのルートディレクトリに関連している。
  2. どのソフトウエアをインストールするかどのようにアクセスするかを含めて、マシンの種類と実行するリソースを明記する。
$ mkdir vagrant_getting_started
$ cd vagrant_getting_started
$ vagrant init

上記の操作でカレントディレクトリにVagrantfileを配置できる。またvagrant initコマンドは既に存在すうるディレクトリでも実行できる。

BOXES

Vagrantのベースイメージとなるのがboxes

BOXインストール

はじめにの実行を済ましているのであれば以下は実行する必要はありませんBOXを使うへ進んでください。

$ vagrant box add hashicorp/precise32

上記の操作で"hashicorp/precise32"という名前のboxをVagrant Cloudからダウンロードします。
追加したboxは複数のプロジェクトで再利用できます。

BOXを使う

追加したboxを使うにはVagrantfileを以下のように編集します。

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/precise32"
end

BOXを探す

ここで探す。

UPとSSH

以下のコマンドを実行することでUbuntu実行環境のマシンが起動します。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'hashicorp/precise32'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'hashicorp/precise32' is up to date...
==> default: Setting the name of the VM: vagrant_getting_started_default_1399429293801_36944
==> default: Fixed port collision for 22 => 2222. Now on port 2200.
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2200 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2200
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...
    default: /vagrant => /Users/k2works/projects/github/vagrant_introduction/vagrant_getting_started

起動完了後以下のコマンドでsshログインできます。

$ vagrant ssh
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic-pae i686)

 * Documentation:  https://help.ubuntu.com/
Welcome to your Vagrant-built virtual machine.
Last login: Fri Sep 14 06:22:31 2012 from 10.0.2.2

構築した仮想マシンを削除したい場合はログアウト後にvagrant destroyを実行する。

同期フォルダ

デフォルでVagrantはプロジェクトディレクトリを/vagrantディレクトリと同期させています。

$ vagrant ssh
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic-pae i686)

 * Documentation:  https://help.ubuntu.com/
Welcome to your Vagrant-built virtual machine.
Last login: Wed May  7 02:49:45 2014 from 10.0.2.2
vagrant@precise32:~$ ls /vagrant/
Vagrantfile
vagrant@precise32:~$ touch /vagrant/foo
vagrant@precise32:~$ exit
logout
Connection to 127.0.0.1 closed.
bash-3.2$ ls
Vagrantfile     foo

上記の操作で/vagrant/fooがローカルプロジェクトと動機されていることが確認できます。

プロビジョニング

Vagrantは自動プロビジョニングをサポートしています。この機能を使うことでvagrant up実行時にソフトウエアを自動的にインストールして繰り返し利用可能な状態にしてくれます。

Apacheインストール

以下のシェルスクリプトをVagrantfileと同じディレクトリにbootstrap.shで保存する。
公式サイトのガイドだとネームサーバエラーが出るのでecho "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf > /dev/nullを最初に追加する。

#!/usr/bin/env bash
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf > /dev/null
apt-get update
apt-get install -y apache2
rm -rf /var/www
ln -fs /vagrant /var/www

次にVagrantfileを以下のように編集する。

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/precise32"
  config.vm.provision :shell, :path => "bootstrap.sh"
end

ネームサーバーエラーはバーチャルマシンのバグなので以下の方法で修正するように変更

Vagrantfileに以下を追加

  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
  end

再実行

$ vagrant destroy
$ vagrant up

"provision"の行を新しく追加してVagrantにshellプロビジュナーを使ってbootstrap.shファイルの内容でマシンをセットアップするようにします。
ファイルパスはプロジェクトルートの場所(Vagrantfileが設定されている場所)と関連付けれられています。

プロビジョン!

全ての設定が終わった後にvagrant upを実行するだけでVagrantは自動的にプロビジョンしてくれます。
すでにvagrant upを実行中ならばvagrant reload --provisionを実行すれば初期セットアップを飛ばしてバーチャルマシンを再起動します。
それでもうまく行かなければvagrant provisionを実行する。

仮想マシンのwebサーバーは起動しましたが、まだブラウザから確認することはできませんプロビジョニング環境内だけ有効になっています。

ネットワーキング

ポートフォワーディング

Vagrantfileを編集する

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/precise32"
  config.vm.provision :shell, :path => "bootstrap.sh"
  config.vm.network :forwarded_port, host: 4567, guest: 80
end

vagrant reloadまたはvagrant upを実行する。
ブラウザからhttp://127.0.0.1:4567にアクセスして確認する。

その他のネットワーキング

静的なIPアドレスの設定もできます。詳細はこっち

シェア

VagrantではVagrant Shareという構築した環境を簡単に共有できる仕組みを用意しています。

Vagrant Cloudにログイン

はじめにVagrant Cloudにアカウントを作成する(無料)。

アカウントを作成したらvagrant loginでログインする。

$ vagrant login
In a moment we'll ask for your username and password to Vagrant Cloud.
After authenticating, we will store an access token locally. Your
login details will be transmitted over a secure connection, and are
never stored on disk locally.

If you don't have a Vagrant Cloud account, sign up at vagrantcloud.com

Username or Email: k2works
Password (will be hidden):
You're now logged in!

シェア

ログインできたらvagrant shareを実行する。

$ vagrant share
==> default: Detecting network information for machine...
    default: Local machine address: 127.0.0.1
    default:
    default: Note: With the local address (127.0.0.1), Vagrant Share can only
    default: share any ports you have forwarded. Assign an IP or addres to your
    default: machine to expose all TCP ports. Consult the documentation
    default: for your provider ('virtualbox') for more information.
    default:
    default: Local HTTP port: 4567
    default: Local HTTPS port: disabled
    default: Port: 2200
    default: Port: 4567
==> default: Checking authentication and authorization...
==> default: Creating Vagrant Share session...
    default: Share will be at: hot-duckbill-4965
==> default: Your Vagrant Share is running! Name: hot-duckbill-4965
==> default: URL: http://hot-duckbill-4965.vagrantshare.com
==> default:
==> default: You're sharing your Vagrant machine in "restricted" mode. This
==> default: means that only the ports listed above will be accessible by
==> default: other users (either via the web URL or using `vagrant connect`).

表示されているURLにアクセスするとこれまでに構築した環境がシェアされていることが確認できます。
シェアを実行しているターミナルでCtrl-Cを押せば終了します。

Vagrantシェアは単純なHTTPシェアよりもとパワフルです。詳細はこっち

片付け

Vagrantにはsuspend,haltそしてdestroyの終了オプションが有ります。それぞれに長所と短所がありますので自分にとってベストな選択をしてください。

  • Suspending:vagrant suspendの長所は早いことです。短所は終了後も仮想マシンのディスク領域とRAM領域を保持し続けることです。
  • Halting:vagrant haltの長所は仮想マシン内のファイルを保持してくれることです。短所は起動に時間がかかることとディスク領域を保持しし続けることです。
  • Destroying:vagrant destroyの長所は痕跡を残さないことです。短所は再起動時の仮想マシン再インポートや再プロビジョンに時間がかかることです。

再構築

作業を翌日、翌週あるいは翌年に再開するとしても以下のコマンドを実行するだけです。

$ vagrant up

プロバイダ

はじめにではVirtualBoxを背景に解説してきました。しかし、VagrantはVMwareAWSなどさまざまなバックエンドプロバイダを使うことができます。

プロバイダをインストールすればVagrantfileを編集する必要はありません、ただvagrant upをプロバイダオプションを付けて実行するだけです。

$ vagrant up --provider=vmware_fusion

クラウドに移行したい?ならばAWS

$ vagrant up --provider=aws

一度vagrant upをプロバイダオプション付きで実行したらそのほかのVagrantコマンドでは明示する必要はありません。
そんなわけでSSHの準備が完了または不要になったらvagrant destroyのように普通にコマンドを実行すればオッケーです。

もっと詳しく知りたければこっち

Saharaプラグインを使う

プラグインのインストール

$ vagrant plugin install sahara

saharaプラグインを使う

$ vagrant up
$ vagrant sandbox on
$ vagrant sandbox rollback
$ vagrant sandbox commit
$ vagrant sandbox off

AWS対応

インストール

$ vagrant plugin install vagrant-aws

環境変数の設定

export AWS_ACCESS_KEY_ID=xxxxxxxxx AWSアクセスキー
export AWS_SECRET_ACCESS_KEY=xxxxxxxx AWSシークレットアクセスキー
export AWS_KEYPAIR_NAME=xxx AWSキーペア名
export AWS_PRIVATE_KEY_PATH=./aws/xxx.pem AWS秘密鍵保存場所

EC2-Classic環境で、vagrant-awsを利用する

$ mkdir vagrant_aws_classic
$ cd vagrant_aws_classic/
$ vagrant init

Vagrantfile

# -*- 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|
  #--- 以下を指定 --
  box_name = "dummy"
  box_url = "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box"
  ssh_username = "ec2-user"
  security_groups = ["web"]
  region = "ap-northeast-1"
  availability_zone = "ap-northeast-1a"
  ami = "ami-b1fe9bb0"
  instance_type = "m1.medium"
  #--- ここまで --

  config.vm.box = box_name
  config.vm.box_url = box_url

  config.vm.provider :aws do |aws, override|
    aws.access_key_id = ENV['AWS_ACCESS_KEY_ID']
    aws.secret_access_key = ENV['AWS_SECRET_ACCESS_KEY']
    aws.keypair_name = ENV['AWS_KEYPAIR_NAME']
    override.ssh.username = ssh_username
    override.ssh.private_key_path = ENV['AWS_PRIVATE_KEY_PATH']

    #---- EC2-Classic固有の設定 ----#
    # リージョンを設定
    aws.region = region
    # AZを設定
    aws.availability_zone = availability_zone
    # セキュリティグループを設定
    aws.security_groups = security_groups
    #---- EC2-Classic固有の設定ここまで ----#

    # User-data
    aws.user_data = "#!/bin/sh\nsed -i 's/^.*requiretty/#Defaults requiretty/' /etc/sudoers\n"
    # タグを指定(任意)
    aws.tags = aws.tags = { "Name" => "test-classic-default-minimal", "env" => "dev"}
    # AMIを指定。起動したいリージョンにあるAMI
    aws.ami = ami
    # インスタンスタイプを設定
    aws.instance_type = instance_type
  end
end

実行

$ vagrant up --provider=aws
Bringing machine 'default' up with 'aws' provider...
[fog][WARNING] Unable to load the 'unf' gem. Your AWS strings may not be properly encoded.
==> default: HandleBoxUrl middleware is deprecated. Use HandleBox instead.
==> default: This is a bug with the provider. Please contact the creator
==> default: of the provider you use to fix this.
==> default: Warning! The AWS provider doesn't support any of the Vagrant
==> default: high-level network configurations (`config.vm.network`). They
==> default: will be silently ignored.
==> default: Launching an instance with the following settings...
==> default:  -- Type: m1.medium
==> default:  -- AMI: ami-b1fe9bb0
==> default:  -- Region: ap-northeast-1
==> default:  -- Availability Zone: ap-northeast-1a
==> default:  -- Keypair: k2works
==> default:  -- User Data: yes
==> default:  -- Security Groups: ["web"]
==> default:  -- User Data: #!/bin/sh
==> default: sed -i 's/^.*requiretty/#Defaults requiretty/' /etc/sudoers
==> default:  -- Block Device Mapping: []
==> default:  -- Terminate On Shutdown: false
==> default:  -- Monitoring: false
==> default:  -- EBS optimized: false
==> default: Waiting for instance to become "ready"...
==> default: Waiting for SSH to become available...
==> default: Machine is booted and ready for use!
==> default: Rsyncing folder: /Users/k2works/projects/github/vagrant_introduction/vagrant_aws_classic/ => /vagrant

インスタンスにログインする

$ vagrant ssh
[fog][WARNING] Unable to load the 'unf' gem. Your AWS strings may not be properly encoded.

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2013.09-release-notes/
20 package(s) needed for security, out of 146 available
Run "sudo yum update" to apply all updates.
Amazon Linux version 2014.03 is available.

インスタンスを削除する

$ vagrant destroy
    default: Are you sure you want to destroy the 'default' VM? [y/N] y
[fog][WARNING] Unable to load the 'unf' gem. Your AWS strings may not be properly encoded.
==> default: Terminating the instance...

うまく動かないとき

$ export VAGRANT_LOG=debug
$ vagrant up --provider=aws

VPC環境で、vagrant-awsを利用する

$ mkdir vagrant_aws_vpc
$ cd vagrant_aws_vpc/
$ vagrant init

Vagrantfile

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  #--- 以下を指定 --
  box_name = "dummy"
  box_url = "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box"
  ssh_username = "ec2-user"
  subnet_id = "subnet-b45640c0"
  private_ip_address = "10.0.0.46"
  security_groups = ["sg-29d8364c"]
  region = "ap-northeast-1"
  ami = "ami-b1fe9bb0"
  instance_type = "t1.micro"
  #--- ここまで --

  config.vm.box = box_name
  config.vm.box_url = box_url

  config.vm.provider :aws do |aws, override|
    aws.access_key_id = ENV['AWS_ACCESS_KEY_ID']
    aws.secret_access_key = ENV['AWS_SECRET_ACCESS_KEY']
    aws.keypair_name = ENV['AWS_KEYPAIR_NAME']
    override.ssh.username = ssh_username
    override.ssh.private_key_path = ENV['AWS_PRIVATE_KEY_PATH']

    #---- VPC固有の設定 ----#
    # リージョンを設定
    aws.region = region
    # サブネットIDを指定
    aws.subnet_id = subnet_id
    # VPC内のローカルIPを指定
    aws.private_ip_address = private_ip_address
    # Public Subnet内を指定した場合
    # 自動的にEIPを取得して割り当てるので、EIPの取得上限数(5個)に注意
    aws.elastic_ip = true
    # セキュリティグループを設定
    # ここではIDのリストを指定
    aws.security_groups = security_groups
    #---- VPC固有の設定ここまで ----#

    # User-data
    aws.user_data = "#!/bin/sh\nsed -i 's/^.*requiretty/#Defaults requiretty/' /etc/sudoers\n"
    # タグを指定(任意)
    aws.tags = aws.tags = { "Name" => "test-minimal", "env" => "dev"}
    # AMIを指定。起動したいリージョンにあるAMI
    aws.ami = ami
    # インスタンスタイプを設定
    aws.instance_type = instance_type
  end
end

実行

$ vagrant up --provider=aws
Bringing machine 'default' up with 'aws' provider...
[fog][WARNING] Unable to load the 'unf' gem. Your AWS strings may not be properly encoded.
==> default: HandleBoxUrl middleware is deprecated. Use HandleBox instead.
==> default: This is a bug with the provider. Please contact the creator
==> default: of the provider you use to fix this.
==> default: Warning! The AWS provider doesn't support any of the Vagrant
==> default: high-level network configurations (`config.vm.network`). They
==> default: will be silently ignored.
==> default: Launching an instance with the following settings...
==> default:  -- Type: t1.micro
==> default:  -- AMI: ami-b1fe9bb0
==> default:  -- Region: ap-northeast-1
==> default:  -- Keypair: k2works
==> default:  -- Subnet ID: subnet-b45640c0
==> default:  -- Private IP: 10.0.0.46
==> default:  -- Elastic IP: true
==> default:  -- User Data: yes
==> default:  -- Security Groups: ["sg-29d8364c"]
==> default:  -- User Data: #!/bin/sh
==> default: sed -i 's/^.*requiretty/#Defaults requiretty/' /etc/sudoers
==> default:  -- Block Device Mapping: []
==> default:  -- Terminate On Shutdown: false
==> default:  -- Monitoring: false
==> default:  -- EBS optimized: false
==> default: Warning! Vagrant might not be able to SSH into the instance.
==> default: Please check your security groups settings.
==> default: Waiting for instance to become "ready"...
==> default: Waiting for SSH to become available...
==> default: Machine is booted and ready for use!
==> default: Rsyncing folder: /Users/k2works/projects/github/vagrant_introduction/vagrant_aws_vpc/ => /vagrant

参考

Why do not you register as a user and use Qiita more conveniently?
  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
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