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の場合)の機能を使っているわけだけど、それだとパフォーマンス的につらい、ということがあるかもしれない。その場合はVagrantはNFSをサポートしている(Windowsがホストだと使えない)のだけど、ここでは触れないのでドキュメント見て対応してください。
http://docs.vagrantup.com/v2/synced-folders/nfs.html
プロビジョニング
provisionってiOS開発とかでその言葉を聞き始めて、これまで意味がよくわからずにいたけど今回ちゃんと辞書を引いてみた。結果、訳はたくさんあって、しっくりする訳が今んとこわかんないんだけど、たぶん「供給」とか「準備」とか「規定」あたりが近いっぽい。
で、とにかく今回のプロビジョニングとは、厳密にはオートプロビジョニングということで、要はVM起動したときに所定の処理を行なって、必要なミドルウェアのインスコとかの処理を「規定」することを指す。
ここまでで準備したVMのCentOSには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
だいたいこんなとこかな!
これ、ほんと便利ですな!