我正在寻找一种将参数传递给Chef食谱的方法,例如:
$ vagrant up some_parameter
然后some_parameter
在其中一本厨师食谱中使用。
我正在寻找一种将参数传递给Chef食谱的方法,例如:
$ vagrant up some_parameter
然后some_parameter
在其中一本厨师食谱中使用。
Answers:
您不能将任何参数传递给无业游民。唯一的方法是使用环境变量
MY_VAR='my value' vagrant up
并用于ENV['MY_VAR']
配方。
您还可以包括GetoptLong Ruby库,该库允许您解析命令行选项。
流浪文件
require 'getoptlong'
opts = GetoptLong.new(
[ '--custom-option', GetoptLong::OPTIONAL_ARGUMENT ]
)
customParameter=''
opts.each do |opt, arg|
case opt
when '--custom-option'
customParameter=arg
end
end
Vagrant.configure("2") do |config|
...
config.vm.provision :shell do |s|
s.args = "#{customParameter}"
end
end
然后,您可以运行:
$ vagrant --custom-option=option up
$ vagrant --custom-option=option provision
注意:确保在vagrant命令之前指定了custom选项,以避免无效的选项验证错误。
有关图书馆的更多信息,请点击此处。
opts
未处理的列表中未列出:vagrant --custom-option=option destroy -f
vagrant: invalid option -- f
vagrant --custom-option=option -- up
应该足够了
可以从ARGV读取变量,然后从变量中将其删除,然后再进入配置阶段。修改ARGV感觉很棘手,但我找不到命令行选项的其他任何方式。
# 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
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
puts ARGV
删除其他自定义参数后,这样做会显示正确的数组。
puts "#{ARGV}"
一行,vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/plugin/v2/command.rb
并在删除Vagrantfile中的相关args之前打印了该行,因此这意味着删除是徒劳的,因为ARGV传递给了验证器,该验证器An invalid option was specified
在任何输出之前操作可以在ARGV上进行。
@ 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
干净利落。
希望这可以帮助,
Vagrant.configure("2") do |config|
class Username
def to_s
print "Virtual machine needs you proxy user and password.\n"
print "Username: "
STDIN.gets.chomp
end
end
class Password
def to_s
begin
system 'stty -echo'
print "Password: "
pass = URI.escape(STDIN.gets.chomp)
ensure
system 'stty echo'
end
pass
end
end
config.vm.provision "shell", env: {"USERNAME" => Username.new, "PASSWORD" => Password.new}, inline: <<-SHELL
echo username: $USERNAME
echo password: $PASSWORD
SHELL
end
end