Posted at

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

More than 1 year has passed since last update.


概要



  • 実践 Vagrant を読んだので簡単にまとめ

  • あと、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 の2つのバージョンをサポートしている

  • V1 は安定版

  • V2 はVagrant2.0 になる予定の設定構文


    • Vagrant2.0 はまだリリースされていない(2016年9月 現在)




  • 1つの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 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






  2. 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 : 名前付きスナップショットの一覧