作って壊し放題の仮想マシン自動化ツール Vagrant さんに入門したくて Getting started から見習い始めました:)
目的
- 仮想マシンって何?
- Vagrant って何?
- Vagrant のチュートリアルをやってみる
前提環境
- Mac (OS X 10.9.2)
- Ruby (v2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin13.0.0])
- VirtualBox(v4.3.6)
ではではチュートリアル開始〜♪
インストールとプロジェクトフォルダ作成
Vagrant のインストールが完了したのでその確認と任意のディレクトリからプロジェクトを作っておきます.
$ which vagrant
/usr/bin/vagrant
$ vagrant -v
Vagrant 1.5.3
$ mkdir vagrant-tutrial
$ cd vagrant-tutrial
vagrant init はそのプロジェクトの設定ファイルを生成する
$ vagrant init
$ ls
Vagrantfile
Vagrantfile というファイルが生成されました. ruby の構文ですね. 少し見てみます.
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# Vagrant の仮想マシンを作るために必要な box の設定.
config.vm.box = "hashicorp/precise32"
# config.vm.box の場所を場所を示す URL を指定.
# config.vm.box_url = "base"
# ホストマシンの 8080 番ポートへの接続を仮想マシンの 80番ポートに転送する. プロトコルは TCP.
# config.vm.network "forwarded_port", guest: 80, host: 8080
# プロトコルを UDP にする場合の記述.
# config.vm.network "forwarded_port", guest: 1024, host: 10240, protocol: 'udp'
# ホストと仮想マシンの間でのみ通信が行える仮想ネットワークインターフェイス(仮想NIC)を作成
# config.vm.network "private_network", ip: "192.168.33.10"
# ブリッジ接続を利用して仮想マシンがホストOSのネットワークと直接通信できるようにする
# config.vm.network "public_network"
# true の場合は SSH 接続がする際に ssh の鍵の認証情報を forward する(デフォルトは false)
# config.ssh.forward_agent = true
# 仮想マシンにホストマシンのファイルを同期する. (第 1 引数はホストのフォルダ, 第 2 引数は仮想マシンのフォルダ)
# config.vm.synced_folder "../data", "/vagrant_data"
# プロバイダ(VirtualBox などの仮想マシン)の設定
# config.vm.provider "virtualbox" do |vb|
# # Don't boot with headless mode
# vb.gui = true
#
# # Use VBoxManage to customize the VM. For example to change memory:
# vb.customize ["modifyvm", :id, "--memory", "1024"]
# end
#
# View the documentation for the provider you're using for more
# information on available options.
# CFEngine (システム構成エンジン) を使ってプロビジョニングする場合の設定
# config.vm.provision "cfengine" do |cf|
# cf.am_policy_hub = true
# # cf.run_file = "motd.cf"
# end
# Puppet(Ruby 製のシステム管理ツール) を使ってプロビジョニングする場合の設定
# config.vm.provision "puppet" do |puppet|
# puppet.manifests_path = "manifests"
# puppet.manifest_file = "site.pp"
# end
# chef solo を使ってプロビジョニングする場合の設定
# config.vm.provision "chef_solo" do |chef|
# chef.cookbooks_path = "../my-recipes/cookbooks" # クックブックが格納されているディレクトリ
# chef.roles_path = "../my-recipes/roles"
# chef.data_bags_path = "../my-recipes/data_bags" # Data Bagが格納されているディレクトリ
# chef.add_recipe "mysql" # 実行するレシピ名
# chef.add_role "web"
#
# # You may also specify custom JSON attributes:
# chef.json = { :mysql_password => "foo" }
# end
# chef server を使ってプロビジョニングする場合の設定
# config.vm.provision "chef_client" do |chef|
# chef.chef_server_url = "https://api.opscode.com/organizations/ORGNAME"
# chef.validation_key_path = "ORGNAME-validator.pem"
# end
end
なんとなく読んだので次に進みます.
まとめ:
vagrant は Vagrantfile という設定ファイルに仮想マシンの OS や環境構築の手順などを全て記述する. init コマンドはそのプロジェクトのひな形設定ファイルを生成する.
vagrant box add は box を取得し保存する
チュートリアルを進めます. vagrant は box という仮想マシンのテンプレのような構成物を扱います. box にはそれぞれ名前があり, この名前を Vagrantfile の config.vm.box に指定することで, この box を使って仮想マシンを起動することができるみたいです.
Vagrantfile に box を指定する方法は以下の 2 通りがあります.
- Vagrantfile の config.vm.box, config.vm.box_url に追記する.
-
$ vagrant init <box の名前> <box のインストール先 URL>
で Vagrantfile を生成する時に予め指定して, 各々の引数を config.vm.box, config.vm.box_url に追加する.
そして box を作業環境にインストールします. box をインストールする方法は以下の 2 つです.
- 上の Vagrantfile に box の情報を追記して
$vagrant up
して box をインストールさせる. -
$ vagrant box add <box 名> <box のインストール先 URL>
で box をインストールする.
これらの box は作業環境の ~/.vagrant.d/boxes
配下にインストールされます.
box は一度作業環境にインストールすると次回から URL からインストールせずに既にインストールしたものを使うようになっているので, 前者の方法では初回の $ vagrant up
の時のみ box がインストールされます.
また, チュートリアルにあるように box の URL を指定しなくてもすむものもあります.
$ vagrant box add hashicorp/precise32
まとめ:
vagrant は box と名付けられた仮想マシンを構築する為の元となるスケルトンをインストールして使う. box は OS やディストリビューションによって様々な種類が提供されている.
vagrant up は Vagrantfile に指定した box で仮想マシンを構築する
プロジェクトファイル配下で $ vagrant up
を実行すると, このカレントディレクトリの Vagrantfile の設定通りに仮想マシンを起動します.
Vagrantfile は以下の通り. 最小限です.
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/precise32"
end
up が終わるとこのディレクトリに .vagrant というファイルが生成されます. .vagrant/machines 内にこの仮想マシンの情報が書かれるみたいです.
次は同じディレクトリから $ vagrant ssh
を実行します. ssh でこの仮想マシンに入ることが出来ます.
作業環境のどのディレクトリからでも ssh ログインするためには以下のように config ファイルに追記しておきましょう.
$ vagrant ssh-config --host vagrant_tuturial >> ~/.ssh/config
$ ssh vagrant_tuturial
まとめ:
vagrant up を実行するだけで Vagrantfile に書いた設定を処理し仮想マシンの起動させることができる
provisioning の練習に Apache をインストールし起動してみる
チュートリアルに従い Apache を入れてみましょう. プロジェクトフォルダに bootstrap.sh というファイルを作ります.
#!/usr/bin/env bash
apt-get update
apt-get install -y apache2
rm -rf /var/www
ln -fs /vagrant /var/www
Vagrantfile に以下の 2 行を追記したら provisioning します.
# -*- mode: ruby -*-
# vi: set ft=ruby :
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
config.vm.network を設定することで仮想マシンのポートを空けて作業環境と接続できるようにします.
provisioning は bootstrap.sh ファイルを実行させる為にconfig.vm.provision を設定し, $ vagrant reload --provision
を実行します.
この間にプロジェクトフォルダに index.html を置いておきましょう.
Vagrantfile のデフォルトの設定では, 仮想マシンの /vagarnt/ 配下とプロジェクトフォルダのルートパスは同じディレクトリを指します.
provisioning が終わったらブラウザで http://localhost:4567 を開くと先ほど置いた index.html が返ってきます. チュートリアルでは shellscript のファイルでしたが, これを chef や ansible などを使ってさらに環境構築を自動化するのですね.
まとめ:
vagrant up(または既に仮想マシンが起動済みの場合は vagrant reload --provisioning) を実行することでサーバの環境構築と必要な設定全てを自動化することができる
結果 & 次の課題
- Vagrant のやっていることをざっと把握した
- 仮想マシンを使って何ができるのか? 何が便利なのか? を調査