Vagrant で仮想マシンを構築する(4) 仮想マシンのネットワーク

仮想マシンで使用できるネットワークは、以下の3つがあります。

  1. フォワードされたネットワーク
  2. プライベートネットワーク(ホストのみのネットワーク)
  3. パブリックネットワーク(ブリッジネットワーク)

フォワードされたネットワーク

ホストの特定ポートへのアクセスを仮想マシンへ転送するネットワーク構成です。
以下のように転送したいポートを Vagrantfile へ設定します。

Vagrant.configure(2) do |config|
  config.vm.network "forwarded_port", guest: 80, host: 8888
end

デフォルトのプロトコルtcp ですが、udp も転送できます。

Vagrant.configure(2) do |config|
  config.vm.network "forwarded_port", guest: 80, host: 8888, protocol: 'udp'
end

プライベートネットワーク(ホストのみのネットワーク)

ホストと仮想マシンだけ、また仮想マシン同士を接続するプライベートなネットワーク構成です。
仮想マシンへ割り当てるスタティック ip アドレスを設定します。

Vagrant.configure(2) do |config|
  config.vm.network "private_network", ip: "192.168.56.10"
end

VirtualBox のホストオンリーネットワークアダプタ vboxnet も設定してくれます。

パブリックネットワーク(ブリッジネットワーク)

仮想マシンがホストと同じネットワークに接続される構成です。
ブリッジに使用するホスト側のネットワークインタフェースを設定します。

Vagrant.configure(2) do |config|
  config.vm.network "public_network", bridge: 'en0: Wi-Fi (AirPort)'
end

まとめ

Vagrant のネットワーク設定は、複数の構成を組み合わせることができるので、柔軟なネットワーク構成を簡単に作成することができます。
Networking - Vagrant Documentation

Vagrant で仮想マシンを構築する(3) 仮想マシンへのプロビジョニング(chef solo)

Vagrant プロビジョニングの chef 編です。
shell script でプロビジョニングした nginx を chef solo で行います。

chef zero とかありますが、chef solo でいきます。

仮想マシン起動

$ mkdir -p vagrant_example
$ cd vagrant_example
$ vagrant init ubuntu/trusty64
$ vagrant up

vagrant-omnibus のインストールと設定

仮想マシン起動時に chef をインストールしてくれるプラグイン vagrant-omnibus をインストールします。

$ vagrant plugin install vagrant-omnibus
$ vagrant plugin list
vagrant-omnibus (1.4.1)
…..

自動で最新バージョンをインストールするように設定します。

$ vi Vagrantfile
Vagrant.configure(2) do |config|
  config.omnibus.chef_version = :latest
end

仮想マシンを再起動します。

$ vagrant reload –provision

プロビジョニング用 chef recipe の作成

@local host
$ mkdir -p cookbooks/nginx/recipes
$ vi cookbooks/nginx/recipes/default.rb
execute 'aptitude update' do
  command 'aptitude update'
end

package 'nginx' do
  action :install
end

execute 'rm -rf /usr/share/nginx/html'
link '/usr/share/nginx/html' do
  to '/home/vagrant/data'
end

service 'nginx' do
  supports :restart => true, :reload => true
  action [ :enable, :start]
end

Vagrantfile 設定

$ vi Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.network "forwarded_port", guest: 80, host: 8888
  config.vm.synced_folder "./data", "/home/vagrant/data"
  config.omnibus.chef_version = :latest
  config.vm.provision "chef_solo" do |chef|
    chef.cookbooks_path = "./cookbooks/"
    chef.add_recipe "nginx"
  end
end

仮想マシンを再起動します。

$ vagrant reload –provision

仮想マシンに nginx がインストールされることを確認します。

vagrant provision - Command-Line Interface - Vagrant Documentation
Chef Solo - Provisioning - Vagrant Documentation

Vagrant で仮想マシンを構築する(2) 仮想マシンへのプロビジョニング(shell script)

プロビジョニングとは、開発環境生成プロセスの一部として、仮想マシンへ自動的にソフトウェアのインストールや設定を行うことです。
Vagrant では、shell script、chef、puppet によるプロビジョニングをサポートしています。
今回は、shell script を使用したプロビジョニングを行います。

プロビジョニングはいつ実行されるか?

プロビジョニングは以下のタイミングで実行されます。

初回仮想マシン生成時にプロビジョニングしない場合は、vagrant up --no-provision を実行します。

プロビジョニングで Nginx をセットアップする

プロビジョニングに shell script を使って、nginx のインストール、ドキュメントルートの設定を行います。

1. 仮想マシン初期設定

$ mkdir -p vagrant_example
$ cd vagrant_example
$ vagrant init ubuntu/trusty64

2. Vagrantfile 設定

  • HTTP 通信のポートフォワード
  • 共有フォルダの設定
  • プロビジョニングの設定
$ vi Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.network "forwarded_port", guest: 80, host: 8888
  config.vm.synced_folder "./data", "/home/vagrant/data"
  config.vm.provision "shell", path: "./script/provision.sh"
end

3. プロビジョニング用 shell script 作成

$ mkdir -p script
$ cd script
$ vi provision.sh
#!/bin/bash

echo "Installing nginx and setting it up..."
aptitude update > /dev/null 2>&1
aptitude install -y nginx > /dev/null 2>&1
rm -rf /usr/share/nginx/html
ln -fs /home/vagrant/data /usr/share/nginx/html

4. 仮想マシン起動

$ vagrant up

起動した仮想マシンで nginx がインストールされていることを確認します。
仮想マシン起動時に default: stdin: is not a tty エラーになりますが、ubuntu の問題で動作には問題ないようです。

shell script によるプロビジョニング(補足)

プロビジョニング内容が単純な場合は、Vagrantfile に直接書くこともできます。

config.vm.provision "shell", inline: "aptitude install -y nginx"
  • 1度だけ実行したいプロビジョニング

1度だけ実行したいプロビジョニングは、初回にフラグファイルを作成して、フラグファイルがある場合はプロビジョニングしないようにします。

if [ -f "/var/tmp/provision" ]; then
  exit 0
fi

(処理)

touch /var/tmp/provision

Provisioning - Vagrant Documentation
Shell Scripts - Provisioning - Vagrant Documentation

Vagrant で仮想マシンを構築する(1) Vagrant インストールから Vagrant Share での仮想マシン公開

Vagrant 1.5 以降に対応したインストール、設定メモです。
Vagrant 1.5 から Vagrant Cloud や Vagrant Share が使えるようになったので、そのあたりも書いていこうと思います。
ホストマシンは Mac OS X です。

環境構築(VirtualBox, Vagrant のインストール)

1. VirtualBox のインストール

    • VirtualBox から最新バージョンをダウンロードして、インストールします

2. Vagrant のインストール

    • Vagrant から最新バージョンをダウンロードして、インストールします

仮想マシンの起動と SSH ログイン

1. 作業用ディレクトリを作成して、vagrant init と vagrant up を実行します。今回は Ubuntu 14.04 LTS な仮想マシンを起動します。

$ mkdir -p vagrant_example  
$ cd vagrant_example  
$ vagrant init ubuntu/trusty64  
$ vagrant up

2. 仮想マシンSSH ログインします。

$ vagrant ssh

仮想マシンの操作コマンド

$ vagrant status
$ vagrant ssh
$ vagrant halt
$ vagrant up
$ vagrant suspend
$ vagrant up
$ vagrant reload
$ vagrant destroy

仮想マシンのネットワークと共有フォルダ設定

以下の設定を追加します。

  • HTTP 通信のポートフォワード
  • ホスト側のディレクトリ vagrant_example/data を仮想マシン /home/vagrant/data にマウント
$ mkdir data
$ vi Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.network "forwarded_port", guest: 80, host: 8888     <- 追記
  config.vm.synced_folder "./data", "/home/vagrant/data"     <- 追記
end
$ vagrant reload

Web サーバの起動

仮想マシンで Web サーバを起動します。

@local host
$ cd vagrant_example/data
$ vi index.html
Hello, Vagrant!

@virtual host
$ cd /home/vagrant/data
$ $ sudo python -m SimpleHTTPServer 80

ホストのブラウザで、http://localhost:8888/index.html へアクセスします。

Vagrant Share で Web サーバを公開

Vagrant 1.5 から使えるようになった Vagrant Share で Web サーバを公開します。

Vagrant Share とは

Vagrant Share allows you to share your Vagrant environment with anyone in the world

インターネットから仮想マシンへアクセスできる機能です。

Vagrant Share を使ってみる

Vagrant Share の使用には Vagrant Cloud へのアカウント作成が必要です。
1. Vagrant Cloud アカウント作成

2. vagrant login

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

If you do not have an Atlas account, sign up at
https://atlas.hashicorp.com.

Atlas Username:                <- Vagrant Cloud に登録したユーザ名
Password (will be hidden):               <- Vagrant Cloud に登録したパスワード
You are now logged in. 

3. vagrant share

$ vagrant share
.....
==> default: Your Vagrant Share is running! Name: gigantic-blizzard-5997
==> default: URL: http://gigantic-blizzard-5997.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`).

vagrant share コマンド実行時に最後の方に表示される URL(上記の場合だと、http://gigantic-blizzard-5997.vagrantshare.com) にアクセスすると、仮想マシンで起動した Web サーバにアクセスできます。
URL は、vagrant share 実行毎に変わります。

まとめ

Vagrant Share、非常に便利です。
vagrantshare.com なサーバへアクセスに行くので若干レイテンシがありますが、動作確認やデモとかに使用する程度だと思うので問題ないと思いました。

Vagrant

YAPC::Asia Tokyo 2014 (2日目)に行ってきました #yapcasia #yapcasia2014


ブログを書くまでが YAPC
2 日目の参加メモとか感想です。

Dockerで遊んでみよっかー - YAPC::Asia Tokyo 2014

Docker の基本から Web アプリケーション起動まで、とても分かりやすかったです。
仕事に使えるレベルにないプロダクトでも、真剣に遊んでみることが大事です。

Perl Mongersのためのstrace入門 - YAPC::Asia Tokyo 2014

正直見方とかよく分からなかったので strace をあまり使ってこなかったけど、使えるような気になりました。
「問題が起きたときは、嘘をつかないツールに頼る」というのが印象的でした。
strace、勉強します。

ほんとにあったスキーマの話 「ソーシャルゲーム」 - YAPC::Asia Tokyo 2014

ソーシャルゲーム特有な(?)スキーマのお話。
サービス開始後のゲームバランス調整とか考えるとスキーマ決めるの難しい。

Perl For (Non?) Perl Mongers - YAPC::Asia Tokyo 2014

@songmu さんの Perl 愛を感じました。
いいセッションでした。

Changing the tires on a moving car: a case study in upgrading legacy architecture - YAPC::Asia Tokyo 2014

GitHub がどのように新しいアーキテクチャへ移行したか(しているか)のお話。
Git の話もあり、とても興味深かったです。
自分の英語力に絶望しました。

Mobile Application Development for Perl Mongers [ninjinkun x gfx] - YAPC::Asia Tokyo 2014

普段関わることがないので、フロントエンド側の話が勉強になりました。

そんなにビッグでもないデータ処理手法の話 - YAPC::Asia Tokyo 2014

Hadoop/MapReduce くらいしか知らなかったので、他のミドルウェアとか分かって勉強になりました。

その通りだと思いました。

Lightning Talks Day 2 - YAPC::Asia Tokyo 2014
キーノート - YAPC::Asia Tokyo 2014 / エンジニアとして生きる
  • 一度きりの人生だから、やりたいことやらないと損
YAPC ラーメンチャレンジ*1 #yapcramen

とりあえず、ラーメンの方だけやりました

感想とか

2 日目も Perl セッションほとんど聞いてません。
Perl 以外のセッションが多かったり、ベストトーク賞が PHP だったりと、Perl コミュニティの懐の深さを感じました。
良いコミュニティだなぁと改めて思いました。
あと、ミーハー心丸出しで Ruby の女神を見に行ってしまいました。

最後になりましたが、運営のみなさん、スピーカーのみなさん、参加者のみなさん、お疲れ様でした!


YAPC::Asia Tokyo 2014

*1:ラーメン食べるかOSS貢献するかのラーメンチャレンジ