在vagrant中将变量传递给shell脚本供应器

在vagrant中将变量传递给shell脚本供应器,vagrant,parameter-passing,provisioning,Vagrant,Parameter Passing,Provisioning,我使用一个简单的shell脚本为一个流浪设置提供软件,如图所示 但无法找到一种方法将传递给vagrant的命令行参数发送到外部shell脚本。谷歌透露,这是作为一项功能添加的,但我找不到任何相关文档或示例。你说得对。传递参数的方法是使用:args参数 config.vm.provision :shell, :path => "bootstrap.sh", :args => "'first arg' second" 请注意,first arg周围的单引号仅在希望将空格作为传递的参数的

我使用一个简单的shell脚本为一个流浪设置提供软件,如图所示


但无法找到一种方法将传递给vagrant的命令行参数发送到外部shell脚本。谷歌透露,这是作为一项功能添加的,但我找不到任何相关文档或示例。

你说得对。传递参数的方法是使用
:args
参数

config.vm.provision :shell, :path => "bootstrap.sh", :args => "'first arg' second"
请注意,
first arg
周围的单引号仅在希望将空格作为传递的参数的一部分时才需要。也就是说,上述代码相当于在终端中键入以下内容:

$ bootstrap.sh 'first arg' second
其中,在脚本中,$1表示字符串“first arg”,而$2表示字符串“second”


这里可以找到关于这个的v2文档:

事实上,它不适用于变量! 正确的snytax是:

var1= "192.168.50.4"
var2 = "my_server"
config.vm.provision :shell, :path => 'setup.sh', :args => [var1, var2]
然后,在shell setup.sh中:

echo "### $1 - $2"

> ### 192.168.50.4 - my_server

根据我在旧版本中找到的一些信息回答我自己的问题:


--@user1391445

以下是从环境中传递变量的替代方法:

config.vm.provision "shell" do |s|
    s.binary = true # Replace Windows line endings with Unix line endings.
    s.inline = %Q(/usr/bin/env    \
      TRACE=#{ENV['TRACE']}       \
      VERBOSE=#{ENV['VERBOSE']}   \
      FORCE=#{ENV['FORCE']}       \
      bash my_script.sh)
end
用法示例:

TRACE=1 VERBOSE=1 vagrant up

为了添加显式参数,我成功地使用了以下方法:

config.vm.provision "shell", path: "provision.sh", :args => "--arg1 somearg --arg2 anotherarg"

在新版本中,您可以使用阵列:

config.vm.provision:shell,:path=>bootstrap.sh,:args:[“第一”、“第二”]

如果arg是文件中的一个变量,我认为这不起作用。例如:-args:“#{MY_VARIABLE}”和在.sh脚本中:-echo$1是否有一种方法可以传递参数,如
vagrant provision--arg1--arg2
?然后访问我们的供应脚本中的那些。我几乎99%肯定答案是否定的,但我还是忍不住要问。
config.vm.provision "shell", path: "provision.sh", :args => "--arg1 somearg --arg2 anotherarg"