Estoy buscando una forma de pasar un parámetro al libro de cocina de Chef como:
$ vagrant up some_parameter
Y luego úselo some_parameterdentro de uno de los libros de cocina del Chef.
ruby
command-line
vagrant
parameter-passing
Wojciech Bednarski
fuente
fuente

También puede incluir la biblioteca GetoptLong Ruby que le permite analizar las opciones de la línea de comandos.
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 endEntonces, puedes ejecutar:
Nota: asegúrese de que la opción personalizada esté especificada antes del comando vagrant para evitar un error de validación de opción no válida.
Más información sobre la biblioteca aquí .
fuente
optsno procesado:vagrant --custom-option=option destroy -fvagrant: invalid option -- fvagrant --custom-option=option -- updebería ser suficienteEs posible leer variables de ARGV y luego eliminarlas antes de pasar a la fase de configuración. Se siente repugnante modificar ARGV, pero no pude encontrar otra forma de opciones de línea de comandos.
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_sprovision.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 donefuente
puts ARGVmuestra la matriz correcta después de eliminar los argumentos personalizados adicionales.puts "#{ARGV}"líneavagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/plugin/v2/command.rbe imprime esa línea antes de la eliminación de los argumentos relevantes en el Vagrantfile, lo que significa que la eliminación es inútil ya que el ARGV se pasa al validador que generaAn invalid option was specifiedantes de cualquier las operaciones pueden tener lugar en ARGV.La solución GetoptLong de @ benjamin-gauthier es realmente genial, encaja bien con el paradigma rubí y vagabundo.
Sin embargo, necesita una línea adicional para arreglar el manejo limpio de los argumentos vagabundos, como
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 endlo que permite que este bloque de código se detenga cuando se procesan las opciones personalizadas. tan ahora,
vagrant --custom-option up --provisionovagrant destroy -fse manejan limpiamente.Espero que esto ayude,
fuente
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 endfuente