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

85

Je cherche un moyen de passer un paramètre au livre de cuisine Chef comme:

$ vagrant up some_parameter

Et puis utilisez some_parameterdans l'un des livres de cuisine du chef.

Wojciech Bednarski
la source

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.

Draco Ater
la source
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 .

Benjamin Gauthier
la source
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
Tsuriga
la source
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,

Kannan Varadhan
la source
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
Sophia
la source