リア充爆発日記

You don't even know what ria-ju really is.

vagrantのチュートリアルをやったログ

chefのレシピを作る環境が欲しくて、サラの状態からのテストとかしたいからローカルじゃきついのでVirtualBoxを使った環境を作ろうとしたところ、Vagrantというツールがアツいという話を思い出し、チラ見したらマジでアツそうだったので導入することにした。

Vagrantはさらっというと、VirtualBoxなど(VMWareとかAWS(!)とか色々)のVM環境をコントロールするRubyで書かれたツール集的なもの。思ってたよりこれはスゴイ。VMの起動時にchefのレシピを走らせたりもできたりする。

で、公式にはいい感じのドキュメントが揃っていて、初心者向けのチュートリアルもあった。
http://docs.vagrantup.com/v2/

今回はほぼこれに沿ってやってみたログ的なエントリ。
OSX10.8.x環境前提。だけど、Windowsでもほとんど問題なくいけると思われる。

VirtualBoxのインストール

https://www.virtualbox.org/
言わずと知れたVM環境を提供してくれるツール
ダウンロードしてインスコするだけ。

Vagrantのインストール&セットアップ

http://www.vagrantup.com/
ダウンロードしてインスコするだけ。

boxの追加

http://docs.vagrantup.com/v2/getting-started/boxes.html

Vagrantはそれ用のOSイメージ(boxと呼ぶ)をあらかじめ追加しておくことによって、VMの起動時間の短縮や管理効率の向上を実現している。
boxは自分で作ることもできるけど、初心者にはおすすめできないらしいし、ぼくも別にやりたくないのでググって探すと、それなりに見つかる。
http://www.vagrantbox.es/
※それぞれのboxの身元保証はご自分で。

試しにCentOS6.4を追加してみる。

vagrant box add centos6.4 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130309.box

※↑のコマンド中の”centos6.4"はbox名で任意の文字列を指定

ちなみにboxはプロバイダ(provider)固有であり、プロバイダとはVirtualBoxとかVMWareとかのVM稼働環境を指す。なのでVirtualBox用のboxはVMWareでは動かない。なので、さっき追加したboxはVirtualBox用なのでVMWwareでは動かない。

ルートディレクトリのセットアップ

http://docs.vagrantup.com/v2/getting-started/project_setup.html

VMを管理するための任意のディレクトリを決める作業。今後、そのディレクトリがVMの設定などをする上での起点となる。
また、さっき追加したイメージはあくまでもイメージで、今後このディレクトリ単位でVMインスタンスが立ち上がるため、同じイメージから用途ごとにいくらでもディレクトリをきってVMを立ち上げられるし、それぞれのディレクトリごと(正確には後述のVagrantfileごと)にVMは完全に分離されて稼働する。

とりあえずドキュメントに沿ってやってみる。

$ mkdir vagrant_getting_started
$ cd vagrant_getting_started
$ vagrant init

これで、このディレクトリ直下にVagrantfileと.vagrantディレクトリができる。Vagrantfileが起動するVMの設定ファイルで、中身をみてみるとネットワーク周りやらchefの設定やらがある。このファイルをバージョン管理しておけばプロジェクトメンバーが同じ環境を構築しやすいね、ということでこれもスバラシイ。
.vagrantディレクトリには起動したVMのIDファイルが保存される(他の何かもこのディレクトリで管理されるんだと思うけど)。

細かい設定は追々見ていくとして、とりあえず使うboxの設定ということで、さっきaddしたboxを設定する。

Vagrant.configure("2") do |config|
  config.vm.box = "centos6.4"
~snip~

VMの起動・停止

http://docs.vagrantup.com/v2/getting-started/up.html

起動

$ vagrant up

起動したVMにログイン

$ vagrant ssh
Last login: Sun May 19 08:17:30 2013 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.
[vagrant@localhost ~]$

ログインするとvagrantユーザーとしてログインされるため、プロンプトが"vagrant@localhost"になる。このあたりで今見ているコンソールがホストなのかゲストなのか判別する。

とりあえずrm -rf / ※VMのコンソールであることを確認!!!!

[vagrant@localhost ~]$ cat /etc/redhat-release 
CentOS release 6.4 (Final)
[vagrant@localhost ~]$ sudo su
[root@localhost vagrant]# rm -rf /
rm: it is dangerous to operate recursively on `/'
rm: use --no-preserve-root to override this failsafe

おおっ!実際初めてやってみるが、最近はこういう保険がかかってるのね!
ちなみにsudoはパスワードなしでいける。

感動したところであらためてrm -rf /

[root@localhost vagrant]# rm -rf --no-preserve-root /

すぐにレスポンス返ってきた。意外と何事もなかったかのような感じ。

[root@localhost vagrant]# ls
bash: /bin/ls: No such file or directory

実際はやっぱり何事もあって割と何もできない。適当に普段使うコマンドをいくつか試したところ使えるのはcdとpwdくらい。確かにこのあたりのコマンドは/binとかにない。まあ、この辺のことは今回の主題じゃないから特に深追いせず、exit(も、もちろんできる)してVMから抜ける。

停止は"vagrant destroy"

$ vagrant destroy
A Vagrant environment is required to run this command. Run `vagrant init`
to set one up in this directory, or change to a directory with a
Vagrantfile and try again.

む・・・。なんぞこれと思いきやVagrantfileも.vagrantディレクトリもなくなっているじゃない。なにこれ。
調べてみると、vagrantで起動したVMには/vagrantというディレクトリがあり、vagrant initしたディレクトリと繋がっているというオチだった。rm -rf /やってみなよ!って公式ドキュメントにそそのかされてやってみたらこの仕打ち。世知辛いぜ。

こうなるとどうやって始末をつけたらいいものか。vagrant initしなおしてVagrantfileを作りなおしてもダメだった。
結局VirtualBox側で対処するしかないっぽい。対処のしかたは以下。
https://support.cloud.engineyard.com/entries/21449637-I-deleted-Vagrantfile-vagrant-and-or-the-app-directory-before-halting-the-VM-Now-ey-local-up-errors-

$ VBoxManage list runningvms
"vagrant_getting_started_1368951362" {5e5f24f8-d2a6-472c-a4ed-c3af789e5b3c}
$ VBoxManage controlvm vagrant_getting_started_1368951362 poweroff
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
$ VBoxManage unregistervm vagrant_getting_started_1368951362 

改めて、VMを立ち上げなおしてdestroyしてみる。

$ vagrant destroy
Are you sure you want to destroy the 'default' VM? [y/N] y
[default] Forcing shutdown of VM...
[default] Destroying VM and associated drives...

これで、ぜんぶなかったことになる。・・・'default'って何のことだろ。・・・ということで調べてみたら、vagrantはVagrantfileごとに1つのVMだけでなく、複数VMを管理できるらしい(これを"multi-machine"環境という)。
https://groups.google.com/forum/?fromgroups#!topic/vagrant-up/zZzuFaqqUWk

とりあえず"multi-machine"については、またの機会にしておく。

ちなみにぜんぶなかったことにしたくない場合はhaltとかshutdownとかあるらしいので、各位ともドキュメントのご確認のほどよろしくお願いいたします。
http://docs.vagrantup.com/v2/cli/index.html



VM(ゲストマシン)とホストマシンとのファイル共有

http://docs.vagrantup.com/v2/getting-started/synced_folders.html

まあ、はからずもさっきの事件でだいたいのことはわかっちゃったので書くことはあまりない。
とりあえず、それぞれでファイルをtouchした結果でも貼っておきますね。

ゲスト側

[vagrant@localhost ~]$ touch /vagrant/made_on_guest
[vagrant@localhost ~]$ ll /vagrant/
合計 8
-rw-r--r-- 1 vagrant vagrant 4344  5月 19 08:52 2013 Vagrantfile
-rw-r--r-- 1 vagrant vagrant    0  5月 19 12:38 2013 made_on_guest
-rw-r--r-- 1 vagrant vagrant    0  5月 19 12:38 2013 made_on_host

ホスト側(~/vagrant_getting_started)

$ touch made_on_host
$ ll
total 16
-rw-r--r--   1 ria10  staff  4344  5 19 17:52 Vagrantfile
drwxr-xr-x   3 ria10  staff   102  5 19 17:52 .vagrant
drwxr-xr-x  80 ria10  staff  2720  5 19 18:31 ..
-rw-r--r--   1 ria10  staff     0  5 19 21:38 made_on_guest
-rw-r--r--   1 ria10  staff     0  5 19 21:38 made_on_host
drwxr-xr-x   6 ria10  staff   204  5 19 21:38 .

あと、上記のデフォルトの共有はVirtualBox固有(プロバイダがVirtualBoxの場合)の機能を使っているわけだけど、それだとパフォーマンス的につらい、ということがあるかもしれない。その場合はVagrantNFSをサポートしている(Windowsがホストだと使えない)のだけど、ここでは触れないのでドキュメント見て対応してください。
http://docs.vagrantup.com/v2/synced-folders/nfs.html

プロビジョニング

provisionってiOS開発とかでその言葉を聞き始めて、これまで意味がよくわからずにいたけど今回ちゃんと辞書を引いてみた。結果、訳はたくさんあって、しっくりする訳が今んとこわかんないんだけど、たぶん「供給」とか「準備」とか「規定」あたりが近いっぽい。

で、とにかく今回のプロビジョニングとは、厳密にはオートプロビジョニングということで、要はVM起動したときに所定の処理を行なって、必要なミドルウェアインスコとかの処理を「規定」することを指す。

ここまでで準備したVMCentOSにはapacheが入っていないので、今回は、VM起動したらapacheが立ち上がっているようにしてみる。

bootstrap.sh

#!/bin/bash
sudo yum update -y
sudo yum install man -y
sudo yum install httpd -y
sudo rm -rf /var/www/html
sudo ln -fs /vagrant /var/www/html
sudo /etc/init.d/httpd start

Vagrantの公式がそうしてたのでとりあえずyum updateと、manはなんとなくとりあえずついでにやっとけ、ということで。で、このbootstrap.shはVagrantfileがあるディレクトリにおいておく。
ついでに、ここがDocumentRootになるのでindex.htmlも用意しておこう。

index.html

Hello World!


Vagrantfile

Vagrant.configure("2") do |config|
  # All Vagrant configuration is done here. The most common configuration
  # options are documented and commented below. For a complete reference,
  # please see the online documentation at vagrantup.com.

  # Every Vagrant virtual environment requires a box to build off of.
  config.vm.box = "centos6.4"
  config.vm.provision :shell, path: "bootstrap.sh"
~snip~

さっき作ったシェルを指定するだけ。

これで準備環境。さっそくVM起動してみる。

$ vagrant up
~bootstrap.shの実行ログがずらずら〜~
$ vagrant ssh

[vagrant@localhost ~]$ wget -qO- localhost
Hello World!

できてる!

ネットワーキング

http://docs.vagrantup.com/v2/networking/index.html

Vagrantにはプロバイダ依存にならないよう、各種設定を抽象化した基本設定項目を持っている。この設定項目をVagrantfile内で使ってネットワーク設定をすることになる。
なお、基本を越えるような詳細の設定をしたい場合は、Vagrantfileにプロバイダ固有の設定を入れていくことになるとのことで、初心者にはオススメできないそうなので僕も触れない。

基本的な設定方法

基本的な設定方法はVagrantfileのconfig.vm.networkを指定することになる。

一番ありがちな、VM(ゲスト)に立ち上げたWebサーバにホストからアクセスしたい、というケースを例に設定してみる。
ここまでのステップで既にゲスト上にはApacheが稼働しているはずなので、それにホストからブラウザでアクセスすることを目指す。

この場合、:forwarded_portという識別子を使う。

Vagrantfile

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

みたらだいたいわかると思うけど、ホストで8080ポートにアクセスするとゲストの80に振ってくれるという設定になる。
で、今現在VMが動いているのなら以下で設定反映できる。そうじゃないならvagrant upで。

$ vagrant reload

やってみたら、ふつうにVMがrestartされるだけのようだった。で、何かエラーでた。/vagrantのmountに失敗している。
vagrant destroyしてupしたらうまくいった。ちょっとこの時間(AM3:00前)からこのエラーの原因を探る気合がないのでとりあえずこれはまた今度。もしくは誰か教えろくだしい。

とにかく、これでホスト側でlocalhost:8080にアクセスしてみると、ゲストのWebサーバにアクセスできる。と思ったらアクセスできない。。ゲスト側のFirewallで蹴られてた(80が空いてない)。
とりあえずセキュアである必要もないのでFirawallを取っ払う設定をbootstrap.shにいれてリトライ。
bootstrap.sh

~snip~
sudo iptables -F
sudo /etc/init.d/iptables save
sudo /etc/init.d/iptables restart

アクセスできた!よかった!

その他にVMでプライベートネットワーク作れたりパブリックネットワーク(?)が作れたりするのでそれぞれドキュメントを確認のこと。
http://docs.vagrantup.com/v2/networking/private_network.html
http://docs.vagrantup.com/v2/networking/public_network.html

だいたいこんなとこかな!
これ、ほんと便利ですな!