Я ищу способ передать параметр в поваренную книгу Chef, например:
$ vagrant up some_parameter
А затем используйте some_parameter
в одной из кулинарных книг шеф-повара.
ruby
command-line
vagrant
parameter-passing
Войцех Беднарски
источник
источник
Вы также можете включить библиотеку GetoptLong Ruby, которая позволяет анализировать параметры командной строки.
Vagrantfile
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, чтобы избежать ошибки проверки недопустимой опции.
Подробнее о библиотеке здесь .
источник
opts
необработанном:vagrant --custom-option=option destroy -f
vagrant: invalid option -- f
vagrant --custom-option=option -- up
должно быть достаточноМожно считать переменные из 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
источник
puts ARGV
отображает правильный массив после удаления дополнительных настраиваемых аргументов.puts "#{ARGV}"
строку,vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/plugin/v2/command.rb
и она печатает эту строку перед удалением соответствующих аргументов в Vagrantfile, что означает, что удаление бесполезно, поскольку ARGV передается валидатору, который выводитAn invalid option was specified
перед любым операции могут проходить на ARGV.Решение GetoptLong от @ benjamin-gauthier действительно изящное, хорошо вписывается в парадигму рубина и бродяг.
Однако ему нужна одна дополнительная строка, чтобы исправить чистую обработку бродячих аргументов, таких как
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
источник