Skip to content

k2works/vagrant_introduction

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Vagrant入門

目的

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コマンドは既に存在すうるディレクトリでも実行できる。

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を探す

ここで探す。

以下のコマンドを実行することで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のように普通にコマンドを実行すればオッケーです。

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

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

$ vagrant plugin install sahara

saharaプラグインを使う

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

インストール

$ 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

参考

About

vagrant入門

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published