Vagrantがサーバーをプロビジョニングするときに、ホストマシンでbashスクリプトを実行したいのですが。
これを達成するための最良の方法は何でしょうか?
役立つはずの少なくとも2つのプラグイン:
スクリプトが(ほぼ)すべてのvagrant
コマンドで実行されることを気にしない場合は、Vagrantfileでシェルアウト(またはこれまでに使用したRuby magic)を使用)することもできます。
system('./myscript.sh')
Vagrant.configure('2') do |config|
# ...
end
(受け入れられた答えはユーザーがvagrant upを使用しているかどうかをチェックしないため、私は完了と言います。したがって、スクリプトは各コマンドで実行されますが、OPはそれを望んでいません。)
ただし、これには簡単な解決策があります。
ARGV[0]
は、入力したコマンドの最初の引数で、up
、down
、status
などにすることができます。ARGV[0]
の値を確認するだけですあなたのVagrantfileで。
このような何かが行います:
system("
if [ #{ARGV[0]} = 'up' ]; then
echo 'You are doing vagrant up and can execute your script'
./myscript.sh
fi
")
Vagrant.configure('2') do |config|
# ...
end
これをVagrantfileの上部に配置します。
module LocalCommand
class Config < Vagrant.plugin("2", :config)
attr_accessor :command
end
class Plugin < Vagrant.plugin("2")
name "local_Shell"
config(:local_Shell, :provisioner) do
Config
end
provisioner(:local_Shell) do
Provisioner
end
end
class Provisioner < Vagrant.plugin("2", :provisioner)
def provision
result = system "#{config.command}"
end
end
end
次に、次のようにVagrantfileを呼び出すだけです。
config.vm.provision "list-files", type: "local_Shell", command: "ls"
そして、このようなコマンドラインを介して:
vagrant provision --provision-with list-files
これはプラグインのように見えるハックの一種ですが、実際にはそうではありません(実行しても表示されませんvagrant plugin list
)。プラグインをインストールする必要がないという利点があることを除いて、この方法で行うことはお勧めしません。そのため、Vagrantfileは最新の構成バージョン(これを書いている時点ではバージョン2)をサポートするすべてのマシンで動作します。これは移植性が高いように思えますが、発行する実際のコマンドのクロスプラットフォーム全体の問題もあります。 Vagrantfileを移植可能にする場合は考慮に入れる必要がありますが、これで開始できます。
@tmatilaiの回答に基づいて2019年に更新され、vagrant-triggersがVagrantに統合されました。これで、次のようなことができるようになります。
node.trigger.before [:up, :provision] do |trigger|
trigger.info = "Running ./myscript.sh locally..."
trigger.run = {path: "./myscript.sh"}
end
このブロックはconfig.vm.define
。詳細なドキュメント: https://www.vagrantup.com/docs/triggers/
@tmatilaiが使用について言ったことに沿って
_system('./myscript.sh')
_
システムにインストールされていない可能性のあるvagrantコマンドや一部のプロビジョナーのインストールなど、1回限りのコマンドには非常に役立ちます。 vagrant
を自動コメントするsedを追加することにより、Vagrantfile
コマンドを呼び出すたびに再実行されるのを回避します。
例えば:
system('vagrant plugin install vagrant-fabric && (pip install fabric jinja2 || Sudo pip install fabric jinja2) && sed -i -e "s/^system/#system/g" Vagrantfile')
そして、それをVagrantfileの最初の行にします。この方法では、最初にvagrant-fabricプラグイン、ファブリック、ジンジャ(Sudo
の場合はvirtualenvs
なしで、失敗した場合はSudo
付きで最初に試行します)をインストールしてから、コメント行を追加します。自体。