回答:
役立つはずの少なくとも2つのプラグイン:
スクリプトが(ほぼ)すべてのvagrant
コマンドで実行されることを気にしない場合は、Vagrantfileでシェルアウト(またはルビの魔法を使用)することもできます。
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/
config.vm.define
は必須ではありません。内部に配置することもできますVagrant.configure("2") do |config| ... end
。最後の注意点として、Windowsホストでは、Vagrantは.ps1
拡張子を持つPowershellスクリプトも喜んで実行します。
@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の最初の行にします。それは最初の放浪ファブリックプラグイン、ファブリックや神社をインストールします。この方法で(せずに最初の試みますsudo
ためvirtualenvs
としてsudo
いるが失敗した場合)して、行のコメントそのもの。
if [[ $(vagrant plugin list | grep -c vagrant-host-shell) == "0" ]] then vagrant plugin install vagrant-host-shell fi
vagrant status
前にvagrant up
...