将命令行参数传递给vagrant shell脚本配置器

时间:2015-10-11 22:15:25

标签: ruby shell vagrant provisioning

与此问题类似:Passing variable to a shell script provisioner in vagrant

我想将变量传递给shell脚本配置器,但我想在调用配置器时在命令行上设置这些变量。这可能吗?

2 个答案:

答案 0 :(得分:4)

这就是我想尝试的 - 我猜有可能因为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

答案 1 :(得分:0)

在您的Vagrant文​​件中,添加以下内容-

{
    "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

如果未指定这些参数,脚本将采用默认值。