実践 Vagrant + 1.8系の新機能を試したのでメモ

![](https://www.vagrantup.com/assets/images/logo_vagrant-81478652.png)

# 概要
- [実践 Vagrant](https://www.oreilly.co.jp/books/9784873116655/) を読んだので簡単にまとめ
- あと、1.8系の新機能も触ってみたのまとめ

# 初めてのVagrant

- 初めての作業環境作成まで

## プロジェクト作成、起動、実行、接続、停止

- プロジェクト作成

    ~~~
    $ vagrant init bento/centos-7.2
    ~~~
- 起動と実行

    ~~~
    $ vagrant up
    ~~~
    - .vagrant/ という名前のディレクトリが作成される
    - このディレクトリにはゲストマシンのID, ロック, 設定が保存される
    - このディレクトリはバージョン管理システムには無視させるべき
- マシンの状態

    ~~~
    $ vagrant status
    ~~~
- SSH 接続

    ~~~
    $ vagrant ssh
    ~~~
- 再起動

    ~~~
    $ vagrant reload
    ~~~
- サスペンド

    ~~~
    $ vagrant suspend
    ~~~
    - 現在の動作状況を保存した後、マシンは停止する
    - 後でリジュームすることが出来る
    - デメリットはゲストマシンが残るのでハードディスクの容量を使ってしまう
- 停止

    ~~~
    $ vagrant halt
    ~~~
- 破棄

    ~~~
    $ vagrant destory
    ~~~

## Vagrantfile

- vagrant はプロジェクト単位に設定を行う
- プロジェクト="Vagrantfile"
- Vagrantfile をバージョン管理することでチーム内で作業環境を共有できる
- Vagrantfile はRuby で書かれている

### V1 とV2 の設定

- V1 とV2 の２つのバージョンをサポートしている
- V1 は安定版
- V2 はVagrant2.0 になる予定の設定構文
    - Vagrant2.0 はまだリリースされていない(2016年9月 現在)
- １つのVagrantfile 中にV1 とV2 の設定を混在させることができる

    ~~~
    Vagrant::Config.run do |config|
      # ここはV1 の設定
    end

    Vagrant.configure(2) do |config|
      # ここはV2 の設定
    end
    ~~~

## ボックス

- ボックス=ベースイメージ
    - マシンのテンプレートのようなもの
- 必要なボックスはプロジェクト毎にVagrantfile のconfig.vm.box で指定する

    ~~~
    Vagrant.configure(2) do |config|
      config.vm.box = "bent_centos-7.2"
      config.vm.box_url = "bento/centos-7.2"
    end
    ~~~
- ボックスの管理はvagrant box コマンドで行う
    - プロジェクトと関係なくボックスを追加する

        ~~~
        $ vagrant box add
        ~~~
    - インストールされているボックス群を表示

        ~~~
        $ vagrant box list
        ~~~

    - ボックスを削除

        ~~~
        $ vagrant box remove
        ~~~
        - 実行中のプロジェクトが使っているボックスを削除してもプロジェクトに影響はしない
        - しかし、動作していなかったプロジェクトを起動する場合にはボックスを再度ダウンロードする必要がある

## 共有ファイルシステム

- 仮想マシンとホストマシン間でファイルやフォルダの同期が出来る
- 共有ファイルシステムはvagrant destroy によって廃棄されない
- ゲストマシンが生成した重要なデータをバックアップしたい際などに便利
- デフォルトでは
    - ホストマシン側
        - プロジェクトのディレクトリ(Vagrantfile があるディレクトリ)
    - 仮想マシン
        - /vagrant
- デフォルトの共有フォルダの場所はVagrantfile で上書き出来る
    - V2 の設定

    ~~~
    config.vm.synced_folder "../data", "/vagrant_data"
    ~~~

## ネットワーキング

- ゲストのポート80 をホストのポート8080 へとフォワードする
    - V2 の設定

    ~~~
    config.vm.network "forwarded_port", guest: 80, host: 8080
    ~~~

# 仮想マシンのプロビジョニング

- Vagrant は自動的なプロビジョニングをサポートしている
- 設定されたプロビジョナをvagrant up の際に実行する
    - デフォルトは新たに環境を生成する時のみプロビジョニングが実行される
    - 生成済みの環境でプロビジョニングを実行させる

        ~~~
        $ vagrant up --provision
        ~~~
- サポートしているプロビジョナ
    - シェルスクリプト
    - Chef
    - Puppet
    - Ansible
    - Ansible_local
    - Docker
- 複数のプロビジョナを指定することも可能
    - 指定された順序でそれぞれのプロビジョナが実行される

    ~~~
    Vagrant.configure(2) do |config|
      config.vm.box = "ubuntu/trusty64"
    
      # 先に Ansible 1.x をインストールさせる
      config.vm.provision :shell, path: "install-ansible.sh"
    
      # Ansible_local で任意の Playbook を実行する
      config.vm.provision "ansible_local" do |ansible|
        ansible.playbook = "playbook.yml"
      end
    end
    ~~~
- 複数のプロビジョナを指定して、その中から特定のプロビジョナだけ実行することも可能

    ~~~
    $ vagrant up --provision-with=ansible
    ~~~
- 「プロビジョニングしない」モードも可能

    ~~~
    $ vagrant up --no-provision
    ~~~

## ansible_local プロビジョナ

- Vagrant 1.8 から追加
- プロビジョナ: ansible との違い

    |プロビジョナ|プロビジョニングの仕組み|
    |---|---|
    |ansible|**Vagrant ホスト側**でansible-playbook を実行する|
    |ansible_local|**仮想マシン側**でansible-playbook を実行する|
- 何が嬉しいのか？
    - [Vagrant + Ansible で開発環境を作るなら ansible_local プロビジョナがいい！](http://blog.shin1x1.com/entry/ansible_local-provisioner-in-vagrant) を参考にさせてもらった
    - ざっくりいうと
        1. ホストに Ansible をインストールする手間がない
        - ホストの Ansible のバージョンが異なるために起こる問題を防げる
        - 「Ansible はWindows をプロビジョニングはできるが、Windows 環境でAnsible 自体は実行できない」問題の解消

### 実行結果

~~~
$ vagrant up
(省略)
==> default: Running provisioner: ansible_local...
    default: Installing Ansible...　　　　←　1
    default: Running ansible-playbook...　←　2

PLAY [Configure webserver with nginx] ******************************************

TASK [setup] *******************************************************************
ok: [default]

TASK [install nginx] ***********************************************************
changed: [default]

PLAY RECAP *********************************************************************
default                    : ok=2    changed=1    unreachable=0    failed=0
~~~

1. （インストールされていなければ）Ansible のインストール
    - 仮想マシン上だとこんな感じ
    - ちなみにインストールされたバージョンはansible 2.1.1.0

        ~~~
        USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
        
        root      1964  0.9  0.8  97900  3876 ?        Ss   17:25   0:00  \_ sshd: vagrant [priv]
        vagrant   1967  0.3  0.3  97900  1800 ?        S    17:25   0:00  |   \_ sshd: vagrant@notty
        root      3000  0.0  0.5 175104  2656 ?        Ss   17:25   0:00  |       \_ sudo -E -H bash -l
        root      3007  0.0  0.3 106060  1488 ?        S    17:25   0:00  |           \_ bash -l
        root      3012 13.0  4.8 323696 22884 ?        S    17:25   0:00  |               \_ /usr/bin/python /usr/bin/yum -y --enablerepo=epel    install ansible
        ~~~
- ansible-playbook コマンドによる Playbook の実行
    - 通常 ansible-playbook コマンドを実行したのと同等にタスク実行時に逐次出力が行われる
    - 実行結果も色付けされる 

### 参考: Ansible 実行に使用したファイル

- インベントリ

    ~~~
    $ cat hosts
    [webservers]
    127.0.0.1
    ~~~    
- playbook

    ~~~
    $ cat web-notls.yml
    - name: Configure webserver with nginx
      hosts: all
      become: True
      tasks:
        - name: install nginx
          yum: name=nginx update_cache=yes
    ~~~



# 機能
---

## Snapshot (1.8の新機能)

公式ドキュメント：https://www.vagrantup.com/docs/cli/snapshot.html

### 概要

- 仮想マシンのその時点の状態を保存
- Vagrantではコマンド一発で実行できる
- 従来saharaプラグインで提供されていたのと同等？

### コマンド

- 単一スナップショット
    - vagrant snapshot push : スナップショット作成
    - vagrant snapshot pop : スナップショット復元
- 複数(名前付き)スナップショット
    - vagrant snapshot save <スナップショット名> : スナップショット作成
    - vagrant snapshot restore <スナップショット名> : スナップショット復元
    - vagrant snapshot list : 名前付きスナップショットの一覧