Je cherche un moyen de passer un paramètre au livre de recettes du chef, par exemple :
$ vagrant up some_parameter
Et ensuite utiliser some_parameter
à l'intérieur d'un des livres de cuisine du Chef.
Je cherche un moyen de passer un paramètre au livre de recettes du chef, par exemple :
$ vagrant up some_parameter
Et ensuite utiliser some_parameter
à l'intérieur d'un des livres de cuisine du Chef.
Vous pouvez également inclure le GetoptLong Bibliothèque Ruby qui permet d'analyser les options de la ligne de commande.
Fichier Vagrant
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
Note : Assurez-vous que l'option personnalisée est spécifiée. antes de la commande vagrant pour éviter une erreur de validation d'option invalide.
Plus d'informations sur la bibliothèque ici .
Il est possible de lire les variables de l'ARGV et ensuite de les supprimer de celui-ci avant de passer à la phase de configuration. C'est un peu bizarre de modifier ARGV mais je n'ai pas trouvé d'autre moyen pour les options en 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
La solution GetoptLong de @benjamin-gauthier est très intéressante et s'intègre bien dans le paradigme ruby et vagrant.
Il a cependant besoin d'une ligne supplémentaire pour corriger la gestion des arguments de vagrant, 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. donc maintenant, vagrant --custom-option up --provision
o vagrant destroy -f
sont traitées proprement.
J'espère que cela vous aidera,
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
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.