Estoy buscando una forma de pasar un parámetro al libro de cocina de Chef como:
$ vagrant up some_parameter
Y luego úselo some_parameter
dentro 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 end
Entonces, 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
opts
no procesado:vagrant --custom-option=option destroy -f
vagrant: invalid option -- f
vagrant --custom-option=option -- up
deberí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_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
fuente
puts ARGV
muestra 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.rb
e 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 specified
antes 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 end
lo que permite que este bloque de código se detenga cuando se procesan las opciones personalizadas. tan ahora,
vagrant --custom-option up --provision
ovagrant destroy -f
se 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 end
fuente