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.
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.
Réponses:
Vous ne pouvez passer aucun paramètre à vagrant. Le seul moyen est d'utiliser des variables d'environnement
MY_VAR='my value' vagrant up
Et utiliser ENV['MY_VAR']
dans la recette.
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:
$ vagrant --custom-option=option up
$ vagrant --custom-option=option provision
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 .
opts
non traité: vagrant --custom-option=option destroy -f
vagrant: invalid option -- f
vagrant --custom-option=option -- up
devrait donc suffire
Il 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.
# 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
affiche le tableau correct après la suppression des arguments personnalisés supplémentaires.
puts "#{ARGV}"
ligne vagrant/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 sort An 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
ou
vagrant destroy -f
sont proprement manipulés.
J'espère que cela t'aides,
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