Je cherche un moyen de passer un paramètre au livre de cuisine Chef comme:
$ vagrant up some_parameter
Et puis utilisez some_parameter
dans l'un des livres de cuisine du chef.
ruby
command-line
vagrant
parameter-passing
Wojciech Bednarski
la source
la source
Vous pouvez également inclure la bibliothèque GetoptLong Ruby qui vous permet d'analyser les options de ligne de commande.
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
Ensuite, vous pouvez exécuter:
Remarque: assurez-vous que l'option personnalisée est spécifiée avant la commande vagrant pour éviter une erreur de validation d'option non valide.
Plus d'informations sur la bibliothèque ici .
la source
opts
non traité:vagrant --custom-option=option destroy -f
vagrant: invalid option -- f
vagrant --custom-option=option -- up
devrait donc suffireIl est possible de lire des variables depuis ARGV puis de les supprimer avant de passer à la phase de configuration. Cela fait mal de modifier ARGV mais je n'ai pas trouvé d'autre moyen pour les options de ligne de commande.
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
la source
puts ARGV
affiche le tableau correct après la suppression des arguments personnalisés supplémentaires.puts "#{ARGV}"
lignevagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/plugin/v2/command.rb
et il imprime cette ligne avant la suppression des arguments pertinents dans le Vagrantfile, ce qui signifie que la suppression est vaine car l'ARGV est passé au validateur qui sortAn invalid option was specified
avant tout les opérations peuvent avoir lieu sur ARGV.La solution GetoptLong de @ benjamin-gauthier est vraiment soignée, s'inscrit bien dans le paradigme du rubis et du vagabond.
Cependant, il a besoin d'une ligne supplémentaire pour corriger la gestion propre des arguments vagabonds, tels que
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
qui permet à ce bloc de code de se mettre en pause lorsque les options personnalisées sont traitées. alors maintenant,
vagrant --custom-option up --provision
ouvagrant destroy -f
sont proprement manipulés.J'espère que cela t'aides,
la source
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
la source