Comment passer le paramètre sur 'vagrant up' et l'avoir dans le cadre de Vagrantfile?


Réponses:


112

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.


1
Merci! J'ai essayé gist.github.com/4435297 et je peux obtenir l'entrée de l'utilisateur, mais je ne sais pas comment le transmettre dans le livre de cuisine Chef. Essayons maintenant de combiner cela avec ENV
Wojciech Bednarski

6
Vous pouvez accéder à cette variable ENV également dans le fichier Vagrant et le mettre dans le hachage chef.json (voir docs.vagrantup.com/v1/docs/provisioners/… )
StephenKing

Oui, c'est plus pratique.
Draco Ater

5
L'auteur de vagrant lui-même dit utiliser des variables d'environnement: github.com/mitchellh/vagrant/issues/2064
Alexander Bird

dans PowerShell, vous devriez utiliser quelque chose comme ça $ Env: MY_VAR = 'my value' | vagrant up
Alberto R.

70

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 .


1
Je l'utilise toute la journée depuis que j'ai posté. Il fonctionne très bien ! Quel est votre problème ?
Benjamin Gauthier

13
Il semble que les options ne soient pas répertoriées dans le optsnon traité: vagrant --custom-option=option destroy -f vagrant: invalid option -- f
Renat Zaripov

2
Oui, cela fonctionne, et à mon humble avis est plus élégant que la première réponse.
davidav

2
@BenjaminGauthier La documentation dit "L'option vide - (deux symboles moins) est utilisée pour terminer le traitement des options.". Cela vagrant --custom-option=option -- updevrait donc suffire
CESCO

2
Cela ne fonctionne plus avec Vagrant 2. Il n'accepte aucun paramètre autre que le sien.
Jens Baitinger

23

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.

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

Cela ne semble pas fonctionner pour moi. J'obtiens toujours l'erreur Une option non valide a été spécifiée . Faire puts ARGVaffiche le tableau correct après la suppression des arguments personnalisés supplémentaires.
majkinetor

1
Même chose ici, cela ne fonctionne pas ... Je mets une puts "#{ARGV}"ligne vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/plugin/v2/command.rbet 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 specifiedavant tout les opérations peuvent avoir lieu sur ARGV.
BogdanSorlea

8

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,


1
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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.