圧倒亭グランパのブログ

30年後の自分にもわかるように書くブログ

【Vagrant1.3.4】provisioner/shell:のbinaryオプションの検証

こんにちは。最近は寝る時の服装を長袖に変えた@at_grandpaです。

始めに前記事についてのお詫びをさせてください。

 

お詫び

前回、前々回とVagrantを触ってきたわけですが、gemでインストールしたVagrant1.0.7を使用していました。
ところが、公式ではgemでのインストールを非推奨としています。

ですので、パッケージから最新バージョンをインストールしました。

gemでインストールされた方は、以下から最新バージョンをダウンロードし、インストールしてください。

http://downloads.vagrantup.com/

1.0.7をインストールした方、申し訳ございませんでした。

引き続き、今日の記事を御覧ください。

 

Vagrant1.3.4

さて、2013/10/02に、Vagrant1.3.4がリリースされました。

https://github.com/mitchellh/vagrant/blob/master/CHANGELOG.md

主な変更・追加箇所は、以下となっています。

  1. provisioner/shell:binaryオプションを追加
  2. guests/suse: において、CFEngineのインストールをサポート
  3. その他 BUG FIXES

今回は1の挙動を確かめてみようと思います。

 

Twitterで間違った説明をしていました。検証結果から今回の記事が正しいと思われます。すみませんでした。

 

Vagrantfileを編集して確かめてみる

 

SHELL PROVISIONER

今回の対象はprovisioner/shell:です。

provisionerは後日詳しく書こうと思いますが、一言で言うとVM立ち上げ時に実行する処理」を意味します。

provisioner/shell:は、立ち上げ時に実行するシェルスクリプトのことを意味します。

 

改行コードが変換されるか検証

binaryオプションの挙動は、Vagrant Docs - SHELL PROVISIONER によると以下のようになっています。

binary (boolean) - Vagrant automatically replaces Windows line endings with Unix line endings. If this is true, then Vagrant will not do this. By default this is "false".

 

  trueだと自動変換しない。デフォルトはfalse

 

なんてわかりにくい記述なんだ・・・。

では、上記を確かめてます。

 

各改行コードのシェルスクリプトファイルを用意

LF(unix)、CR+LF(win)、CR(mac) の3種類の改行コードのシェルスクリプトファイルを用意します。

vimunix.sh, win.sh, mac.sh という名前のファイルを作成し編集します。それぞれ、

:set fileformat=unix
:set fileformat=dos
:set fileformat=mac

と設定した上で、以下のスクリプトファイルを作成しました。

#!/bin/sh

echo hogehoge!
echo fugafuga!

3つのファイルとも中身は同じですが、改行コードだけが異なります。

 

Vagrantfileの設定

Vagrantfileは以下のように設定します。

# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

    config.vm.box = "cent_os"  # 各自のbox-name

    config.vm.provision "shell",
        binary: true,     # trueは自動変換なし
        path: "unix.sh"    # シェルスクリプトのPath

end

true or falseとそれぞれのファイルの組わせを実行してみます。

 

各パターンの検証

各パターンの組み合わせ全てをVagrantfileに記述し、vagrant upした結果を示します。

 

binary: true (自動変換なし)の場合

LF(unix) 成功!

$ vagrant up
...
[default] Running: ...
hogehoge!
fugafuga!

 

CR+LF(win) 失敗!

$ vagrant up
...
[default] Running: ...
bash: /tmp/vagrant-shell: /bin/sh^M: bad interpreter: No such file or directory
No error message

 

CR(mac) 失敗!

$ vagrant up
...
[default] Running: ...
echo: bad interpreter: No such file or directory
No error message

 

binary: false (自動変換あり)の場合

LF(unix) 成功!

$ vagrant up
...
[default] Running: ...
hogehoge!
fugafuga!

 

CR+LF(win) 成功!

$ vagrant up
...
[default] Running: ...
hogehoge!
fugafuga!

 

CR(mac) 失敗!

$ vagrant up
...
[default] Running: ...
echo: bad interpreter: No such file or directory
No error message

     

  CR全滅!\(^o^)/ まぁそうですよねー。

 

まとめ

今回は、各改行コードのおいてprovisioner/shell:binaryオプションの挙動を確かめました。

結果は次の通りです。

binary:true (自動変換なし)
* LF(unix) -> 実行可能
* CR+LF(win) -> エラー
* CR(mac) -> エラー


binary:false (自動変換あり)
* LF(unix) -> 実行可能
* CR+LF(win) -> 実行可能
* CR(mac) -> エラー

以上の結果より、このオプションが付いたことで、Windowsで編集したVagrantfileもunixで実行できるようになりました。

こういった細かいアップデートのおかげで、どんどん使いやすくなっていくんですね。

今後のアップデートにも期待です。