vmコマンドラインツールのvagrant使用方法メモ 

コマンドラインから仮想マシンのVirtualBoxを操作する
gemパッケージの[vagrant](http://www.vagrantup.com)がすんばらしかったので使い方メモ。

あらかじめVirtualBoxをインストールする必要がある。


## 基本的な使い方

    $ vagrant box add {title} {url}
    $ vagrant init {title}
    $ vagrant up

これだけで仮想環境が立ち上がる

## boxの入手

osのイメージをboxと呼ぶ。
boxの入手先は以下
http://www.vagrantbox.es

## centos6.3を立ち上げる
例としてcentOS6.3を立ち上げる。

    $ mkdir centos
    $ cd centos
    $ vagrant box add centos https://dl.dropbox.com/u/7225008/Vagrant/CentOS-6.3-x86_64-minimal.box
    $ vagrant init centos
    $ vagrant up

`vagrant init`を行ったディレクトリには`Vagrantfile`が作成されて
起動を行うと`.vagrant`が作成される。

## ssh接続

    $ vagrant ssh

普通にssh接続する事も出来る

    $ vagrant ssh-config --host vagrant-vm >> ~/.ssh/config
    $ ssh vagrant-vm

## 基本的なコマンド

    # Vagrantfileの作成
    $ vagrant init
    # Vagrantfileを元にしたvmの立ち上げ
    $ vagrant up
    # ssh接続
    $ vagrant ssh
    # vmのシャットダウン
    $ vagrant halt
    # vmの起動状態表示
    $ vagrant status
    # vmの削除
    $ vagrant destroy

## Vagrantfileの編集
Vagrantfileはrubyで記述できる

    # 通常設定
    Vagrant::Config.run do |config|
      config.vm.box = "centos"
    end


    # シングルvmカスタマイズ
    Vagrant::Config.run do |config|
      config.vm.box = "centos"
      # ローカルに無ければ取ってくる
      config.vm.box_url = "https://dl.dropbox.com/u/7225008/Vagrant/CentOS-6.3-x86_64-minimal.box"
      # ip指定
      config.vm.network :hostonly, "192.168.33.10"
      config.vm.customize do |vm|
        vm.memory_size = 2048  # メモリ2G
        vm.name = "centOS6.3"  # 名前指定
      end
    end


    # 一度に複数のvm立ち上げ
    Vagrant::Config.run do |config|
      config.vm.define :node01 do |cfg|
        cfg.vm.box = "centos"
        cfg.vm.network :hostonly, "192.168.30.10"
        cfg.vm.host_name = "node01"
      end

      config.vm.define :node02 do |cfg|
        cfg.vm.box = "centos"
        cfg.vm.network :hostonly, "192.168.30.11"
        cfg.vm.host_name = "node02"
      end

      config.vm.define :node03 do |cfg|
        cfg.vm.box = "centos"
        cfg.vm.network :hostonly, "192.168.30.12"
        cfg.vm.host_name = "node03"
      end
    end

## vagrantで起動できるpackageの作成

    $ visudo
    %wheel ALL=(ALL) NOPASSWD:ALL

    $ echo 'UseDNS no' >> /etc/ssh/sshd_config

    # vagrantユーザーの追加
    $ adduser vagrant
    $ passwd vagrant
    $ gpasswd -a vagrant wheel
    $ mkdir /home/vagrant/.ssh
    $ chmod 700 /home/vagrant/.ssh
    $ cd /home/vagrant/.ssh
    $ curl 'https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub' > authorized_keys
    $ chown -R vagrant:vagrant /home/vagrant/.ssh

    # ネットワーク関連
    $ rm /var/lib/dhcp3/*

    # MACアドレスの自動保存無効化
    $ rm /etc/udev/rules.d/70-persistent-net.rules
    $ mkdir /etc/udev/rules.d/70-persistent-net.rules

    # ホスト側で実行
    $ vagrant package --base VMディレクトリ --output BOX名.box

参考 : [Vagrant のベースBOX作成手順 (Scientific Linux 6.1)](http://d.hatena.ne.jp/okinaka/20110805/1312474847)

どうやら`.vagrant`があるディレクトリでも実行できるらしい。
vagrantでupしたイメージを自分なりにいい感じにした後にpackage化して配布するのが簡単かも知れない。

## 状態の巻き戻し
vagrantの状態を巻き戻す方法

    $ gem install sahara
    $ vagrant up
    # sandboxモードの開始
    $ vagrant sandbox on
    # 状態の巻き戻し
    $ vagrant sandbox rollback
    # sandboxモードの終了
    $ vagrant sandbox off
    # sandboxの内容を恒久的に反映
    $ vagrant sandbox commit
    # sandboxモードの確認
    $ vagrant sandbox status

## まとめて

[id:naoya](http://d.hatena.ne.jp/naoya/about)の[入門Chef-Solo-](http://www.amazon.co.jp/入門Chef-Solo-Infrastructure-Code-ebook/dp/B00BSPH158/ref=sr_1_1?ie=UTF8&qid=1363625779&sr=8-1)
を購入して[vagrant](http://www.vagrantup.com)の事を知りました。ありがとうございます。
chef-soloよりも興味出てしまったのでとりあえずvagrantの事知ってからchef-soloも使っていこうと思います。
vagrantは標準でchefと組み合わせる使い方が出来るので今度はchef合わせ技を試していく予定。
vagrantとchef組み合わせるの楽しそう!!!!

開発環境を手軽に配布できて手軽に起動できるの良いです。

入門Chef-Solo-も面白いのでぜひ

参考 :
[Vagrant intro](http://www.slideshare.net/t9md/vagrant-intro)
[Vagrant - naoyaのはてなダイアリー](http://d.hatena.ne.jp/naoya/20130205/1360062070)
[Vagrant のベースBOX作成手順 (Scientific Linux 6.1)](http://d.hatena.ne.jp/okinaka/20110805/1312474847)
[入門Chef-Solo-](http://www.amazon.co.jp/入門Chef-Solo-Infrastructure-Code-ebook/dp/B00BSPH158/ref=sr_1_1?ie=UTF8&qid=1363625779&sr=8-1)
[VagrantをPluginで拡張する](http://www.ryuzee.com/contents/blog/4310)
[vagrant sandboxが便利な件](http://f96q.github.com/blog/2012/09/23/vagrant/)