我正在寻找一种将参数传递给Chef cookbook的方法,比如:
$ vagrant up some_parameter
然后在厨师食谱中使用some_parameter
。
发布于 2013-01-02 23:10:23
您不能向vagrant传递任何参数。唯一的方法是使用环境变量
MY_VAR='my value' vagrant up
并在食谱中使用ENV['MY_VAR']
。
发布于 2013-11-18 06:33:11
可以从ARGV读取变量,然后在进入配置阶段之前将它们从ARGV中删除。修改ARGV感觉很麻烦,但我找不到命令行选项的其他方法。
Vagrantfile
# Parse options
options = {}
options[:port_guest] = ARGV[1] || 8080
options[:port_host] = ARGV[2] || 8080
options[:port_guest] = Integer(options[:port_guest])
options[:port_host] = Integer(options[:port_host])
ARGV.delete_at(1)
ARGV.delete_at(1)
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# Create a forwarded port mapping for web server
config.vm.network :forwarded_port, guest: options[:port_guest], host: options[:port_host]
# Run shell provisioner
config.vm.provision :shell, :path => "provision.sh", :args => "-g" + options[:port_guest].to_s + " -h" + options[:port_host].to_s
provision.sh
port_guest=8080
port_host=8080
while getopts ":g:h:" opt; do
case "$opt" in
g)
port_guest="$OPTARG" ;;
h)
port_host="$OPTARG" ;;
esac
done
发布于 2019-03-03 04:41:40
@benjamin-gauthier的GetoptLong解决方案非常简洁,非常适合红宝石和流浪的范例。
然而,它需要额外的一行来修复对漂移参数的干净处理,比如vagrant destroy -f
。
require 'getoptlong'
opts = GetoptLong.new(
[ '--custom-option', GetoptLong::OPTIONAL_ARGUMENT ]
)
customParameter=''
opts.ordering=(GetoptLong::REQUIRE_ORDER) ### this line.
opts.each do |opt, arg|
case opt
when '--custom-option'
customParameter=arg
end
end
这允许该代码块在处理自定义选项时暂停。所以现在,vagrant --custom-option up --provision
或vagrant destroy -f
都被干净地处理了。
希望这能帮上忙
https://stackoverflow.com/questions/14124234
复制相似问题