Vagrantでシェルプロビジョニングを実行させる方法について記載します。
プロビジョニングが実行されるタイミング
まずはどのような時にプロビジョニングが実行されるか知っておきましょう。
これはシェルプロビジョニング以外の他のプロビジョニングにも当てはまります。
プロビジョニングは次のタイミングで実行されます。
- 仮想マシンが作成されていない場合に、最初にvagrant upを実行して仮想マシンが作成されたとき。
- vagrant upやvagrant reloadに--provisionを指定したとき。
- 仮想マシンが起動しているときにvagrant provisionを実行したとき。
なお、--no-provisionを指定してプロビジョニングを実行させないようにすることもできます。
シェルプロビジョニング
プロビジョニングはプロビジョナが担当します。プロビジョナはconfig.vm.provisionパラメータに指定します。シェルプロビジョナの場合は「"shell"」を指定します。
シェルプロビジョニングはSSHでスクリプトを実行します。デフォルトでスクリプトはroot権限で実行されます。
シェルプロビジョニングに指定できるにはオプションはいくつかありますが、inlineまたはpathは必須です。
スクリプトをVagrantfileの中にインラインに記述する場合にはinlineを指定し、シェルスクリプトをリモートマシンにアップロードして実行する場合は、pathでそのファイルを指定します。
インラインスクリプト
インラインスクリプトはVagrantfileに直接スクリプトを記述する方法です。
キーワードinlineを指定して次のようにVagrantfileに記述します。
Vagrant.configure("2") do |config|
config.vm.provision "shell",
inline: "echo Hello, World!"
end
「echo Hello, World!」はクウォーテーションで囲まないとエラーになります。たぶんSSHでコマンドを実行しているからでしょう。
複数行のスクリプトを記述するには、Ruby言語のヒアドキュメントを使うのが良いでしょう。
config.vm.provision "shell", inline: <<-SHELL
echo Foo!
echo Hoge!
SHELL
次のように書くこともできます。
$script = <<-SCRIPT
echo Foo!
echo Hoge!
SCRIPT
Vagrant.configure("2") do |config|
config.vm.provision "shell", inline: $script
end
外部スクリプト
ホストマシンにあるシェルスクリプトファイルを、
ゲストマシンにアップロードして実行することもできます。
それにはキーワードpathにホストマシンでのシェルのパスを指定します。
シェルスクリプトはデフォルトで「/tmp/vagrant-shell」にアップロードされます。
シェルプロビジョニングで外部スクリプトを実行するには以下のように記述します。
パスは絶対パスか相対パスです。
プロジェクトのルート(Vagrantfileがあるディレクトリ)が相対パスの基準になります。
Vagrant.configure("2") do |config|
config.vm.provision "shell", path: "script.sh"
end
この場合、プロジェクトのルートにscript.shという名前のシェルスクリプトを配置します。
例えば、以下のようなスクリプトをscript.shいう名前で保存して実行してみてください。
#!/bin/sh
echo Foo!
echo Hoge!
おしまい。