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.
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.
Respuestas:
No puedes pasar ningún parámetro a vagabundo. La única forma es usar variables de entorno
MY_VAR='my value' vagrant up
Y usar ENV['MY_VAR']
en receta.
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:
$ vagrant --custom-option=option up
$ vagrant --custom-option=option provision
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í .
opts
no procesado: vagrant --custom-option=option destroy -f
vagrant: invalid option -- f
vagrant --custom-option=option -- up
debería ser suficiente
Es 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.
# 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
muestra la matriz correcta después de eliminar los argumentos personalizados adicionales.
puts "#{ARGV}"
línea vagrant/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 genera An 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
o
vagrant destroy -f
se manejan limpiamente.
Espero que esto ayude,
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