Answers:
至少两个应有帮助的插件:
如果您不关心脚本是否(几乎)在所有vagrant
命令上运行,则也可以在Vagrantfile中将其外壳(或使用红宝石魔术):
system('./myscript.sh')
Vagrant.configure('2') do |config|
# ...
end
(我之所以说是完整的,是因为接受的答案不会检查用户是否正在使用无用功。因此,脚本是在每个命令上执行的,这不是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年更新,流浪者触发已合并到流浪者中。因此,您现在可以执行以下操作:
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
通过添加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插件,fabric和jinja(如果没有失败,将首先尝试sudo
for virtualenvs
和with sudo
),然后行注释本身。
if [[ $(vagrant plugin list | grep -c vagrant-host-shell) == "0" ]] then vagrant plugin install vagrant-host-shell fi
vagrant status
在vagrant up
... 之前运行呢?