(はじめの一歩)Vagrantで、ShellScriptをつかったプロビジョニングをしてみた


Vagrant道に則ったやりかた

開発元が考えているVagrantの使い方は、ほぼ素の仮想OSのboxをベースに、インストールするソフトウェアや各種設定などの設定を読み込んで環境を作るといった流れになる。

そして、このboxと設定を記述したファイル(ShellScriptだったりChefだったり)を「配布」して開発チームなどで共有するといった流れになる。

開発環境の生成プロセスの一部として、自動的にソフトウェアをインストールする方法です。後者を行うのが、プロビジョニングです。(実践Vagrant道 P47)

環境

  • Vagrant 1.8.0
  • ホストOSはmac OS X
  • 仮想環境を動かす環境としてVirtualBox5.x系を使用
  • 使用するOSはAtlasのbento (CentoOS-6.7)2.2.3

ShellScriptで設定類を読み込む

公式のVagrantのドキュメントでは、プロビジョニングChefにあまり詳しくなければまずはShellScriptで記述するところが入ったほうが良い。ある程度詳しければVagrantはChefを学ぶ格好の場です。といった趣旨のことがかいてある。

確かに、個人レベルで開発、検証用にVagrantを使う程度の話では大げさすぎるかも。
実は、先にchef-DKを使った環境構築を試したものの

Bringing machine 'default' up with 'virtualbox' provider...
There are errors in the configuration of this machine. Please fix
the following errors and try again:

chef zero provisioner:
* Missing required value for `chef.nodes_path'.

みたいに出で、何が何だかよくわからん。
nodes_path ディレクトリなんて生成されないし。

ごく単純化したVagrantfileとシェルスクリプトの例

すでにディレクトリとVagrantfileは存在しているとする。
Vagrantfileの作成は、vagrant init -m のようにコメント抜きでやってもいいかも。

Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "bento/centos-6.7"

  # 設定をよみこみ
  config.vm.provision :shell, :path => "provision/hello.sh"
end

boxの指定と読み込むShellScriptの指定だけの、ごく単純な設定記述です。

hello.sh
#!/bin/sh

echo 'hello world!!'

ShellScriptファイルなので、#!/bin/sh などの、シェル指定を忘れずに。

プロビジョニングをしてみる

やってることは コメント表示だけですが・・・。
注:対象のVagramt仮想環境が動いている、もしくはvagrant up --provision(仮想環境を用意しなさい。プロビジョンもしなさい)としてやる必要があり。

vagrant 環境がupしていない状態でvagrant provisionとしてもエラーが出ます。

ミステイクの例
$ vagrant provision
==> default: VM is not currently running. Please, first bring it up with `vagrant up` then run this command.

今回は、仮想環境がupしていない環境からupと同時にプロビジョンを行うケースを試します。

vagrantをアップしながらプロビジョニング
$ vagrant up --provision
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'bento/centos-6.7' is up to date...
(中略)
==> default: Mounting shared folders...
    default: /vagrant => /Users/rojiuratech/Documents/vagrant/shell-provision
==> default: Running provisioner: shell...
    default: Running: /var/folders/nq/yngpxc915nscw3tt7qlp9rp40000gn/T/vagrant-shell20160327-7456-1t4awpw.sh
==> default: hello world!!

Vagrantfileで指定したプロビジョン用のShellScriptに記載した内容が処理されています。

すでにvagrant upした(仮想サーバが生成されている)状態のものをvagrant halt (仮想サーバがシャットダウンされた)状態にし、
ただ単にvagrant up とした場合

プロビジョンをしないでupすると
$ vagrant up
default: Mounting shared folders...
    default: /vagrant => /Users/rojiuratech/Documents/vagrant/shell-provision
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: flag to force provisioning. Provisioners marked to run always will still run.