88 votes

Comment passer un paramètre dans 'vagrant up' et l'avoir dans la portée de Vagrantfile ?

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.

119voto

Draco Ater Points 8468

Vous ne pouvez pas passer de 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.

74voto

Benjamin Gauthier Points 851

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 .

24voto

tsuriga Points 144

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.

Fichier Vagrant

# 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

9voto

Kannan Varadhan Points 99

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,

2voto

sophia Points 21
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.com

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.

Powered by:

X