将变量传递给 vagrant 中的 shell 脚本配置器
Posted
技术标签:
【中文标题】将变量传递给 vagrant 中的 shell 脚本配置器【英文标题】:Passing variable to a shell script provisioner in vagrant 【发布时间】:2013-03-05 21:48:08 【问题描述】:我正在使用一个简单的 shell 脚本来为 vagrant 设置提供软件,如 here 所示。
但无法找到一种方法来获取传递给 vagrant 的命令行参数并将它们发送到外部 shell 脚本。 Google 透露这是作为一项功能添加的,但我找不到任何涵盖它的文档或示例。
【问题讨论】:
【参考方案1】:你是对的。传递参数的方式是使用: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 文档:http://docs.vagrantup.com/v2/provisioning/shell.html
【讨论】:
当 arg 是 vagrantfile 中的变量时,我认为这不起作用。例如:- args: "#MY_VARIABLE" 并在您的 .sh 脚本中:- echo $1 有没有办法传递像vagrant provision --arg1 --arg2
这样的参数?然后访问我们的配置脚本中的那些。我几乎 99% 确定答案是否定的,但仍然无法阻止自己问。【参考方案2】:
确实,它不适用于变量! 正确的语法是:
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
【讨论】:
【参考方案3】:这是从环境中传递变量的另一种方法:
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
【讨论】:
【参考方案4】:为了添加显式参数,我成功地使用了这个:
config.vm.provision "shell", path: "provision.sh", :args => "--arg1 somearg --arg2 anotherarg"
【讨论】:
【参考方案5】:根据我在旧版docs page 中找到的一些信息回答我自己的问题:
config.vm.provision :shell, :path => "bootstrap.sh", :args => "'abc'"
-- @user1391445
【讨论】:
【参考方案6】:在新版本中可以使用数组:
config.vm.provision :shell, :path => "bootstrap.sh", :args:["first", "second"]
【讨论】:
以上是关于将变量传递给 vagrant 中的 shell 脚本配置器的主要内容,如果未能解决你的问题,请参考以下文章