ツール

【Vagrant】シェルプロビジョニングの実行方法

更新日:

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!

おしまい。

-ツール
-

Copyright© アナグマのモノローグ , 2021 All Rights Reserved Powered by STINGER.