将命令行参数传递给Vagrant shell脚本provisioner

4

你想要做类似于 vagrant up arg1 arg2 的操作,并将 arg1 和 arg2 发送给配置管理器吗? - Frederic Henri
2个回答

6
这是我会尝试的方法 - 我猜Vagrantfile是一种ruby脚本,您可以使用大部分ruby功能。但要小心,因为vagrant可能需要检查变量,例如当执行“vagrant up arg1 arg2”时,它期望arg1和arg2是在Vagrantfile中定义的机器名称,并将引发错误,因为找不到它。因此,您需要像这样传递这些变量:
vagrant --arg1 --arg2 up

为了阅读它们,您可以

# -*- mode: ruby -*-
# vi: set ft=ruby :

v1 = ARGV[0]
v2 = ARGV[1]
array_arg = [v1, v2]


Vagrant.configure("2") do |config|

  blabla config

  array_arg.each do |arg|
    config.vm.provision "shell", run: "always" do |s|
      s.inline = "echo $1"
      s.args   = arg
    end
  end
end

例如,执行将会产生
fhenri@machine:~/project$ vagrant --arg1 --arg2 up
    . . . . . 
==> default: Running provisioner: shell...
    default: Running: inline script
==> default: stdin: is not a tty
==> default: --arg1
==> default: Running provisioner: shell...
    default: Running: inline script
==> default: stdin: is not a tty
==> default: --arg2

我想调用 vagrant provision --arg1,这样它就不会运行 vagrant up,而是运行 vagrant provision(如果机器已经启动但需要重新配置)。 - Jonathan
如果你想要拥有自己的变量,你应该在vagrant命令之后立即设置它。如果你把它放在像provision命令这样的vagrant命令之后,vagrant会认为它是自己命令的参数,并报错。如果你在这种情况下运行vagrant --arg1 provision,它仍然只会运行provision命令。 - Frederic Henri

0
在你的 Vagrantfile 文件中,添加以下内容 -
{
    "PROVISION_PARAMS" => "some_default_values",
}.each { |key, value| ENV[key] = value if ENV[key] == nil }
  

现在可以通过以下方式将这些参数传递给Shell脚本提供程序 -

config.vm.provision :shell, privileged: true, run: "always",
                            :path => "../../scripts/script.ps1", 
                            :args => ENV['PROVISION_PARAMS']

现在,您可以以以下方式向此脚本提供命令行参数 -
$ PROVISION_PARAMS=' param1 param2 "param 3" ' vagrant provision

如果没有指定这些参数,脚本将使用默认值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接