Come trasferire il parametro su 'vagrant up' e averlo nell'ambito di Vagrantfile?


Risposte:


113

Non puoi passare alcun parametro a vagabondo. L'unico modo è usare le variabili d'ambiente

MY_VAR='my value' vagrant up

E usalo ENV['MY_VAR']nella ricetta.


1
Grazie! Ho provato gist.github.com/4435297 e posso ottenere l'input dell'utente, ma non ho idea di come passarlo nel ricettario di Chef. Ora proverò a combinare questo con ENV
Wojciech Bednarski

6
Puoi accedere a quella var ENV anche nel Vagrantfile e metterla nell'hash chef.json (vedi docs.vagrantup.com/v1/docs/provisioners/… )
StephenKing

Sì, è più conveniente.
Draco Ater

5
Lo stesso autore di vagrant dice di usare le variabili d'ambiente: github.com/mitchellh/vagrant/issues/2064
Alexander Bird

in PowerShell dovresti usare qualcosa del genere $ Env: MY_VAR = 'my value' | vagabondaggio
Alberto R.

70

Puoi anche includere la libreria GetoptLong Ruby che ti consente di analizzare le opzioni della riga di comando.

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

Quindi, puoi eseguire:

$ vagrant --custom-option=option up
$ vagrant --custom-option=option provision

Nota: assicurarsi che l'opzione personalizzata sia specificata prima del comando vagrant per evitare un errore di convalida dell'opzione non valida.

Maggiori informazioni sulla biblioteca qui .


1
Lo uso tutto il giorno da quando ho postato. Funziona molto bene! Qual è il tuo problema ?
Benjamin Gauthier

13
Sembra che le opzioni non siano elencate in optsnon elaborate: vagrant --custom-option=option destroy -f vagrant: invalid option -- f
Renat Zaripov

2
Sì, funziona, e imho è più elegante della prima risposta.
davidav

2
@BenjaminGauthier I documenti dicono "L'opzione vuota - (due simboli meno) è usata per terminare l'elaborazione delle opzioni.". Quindi vagrant --custom-option=option -- updovrebbe essere sufficiente
CESCO

2
Questo non funziona più con Vagrant 2. Non accetta alcun parametro oltre al proprio.
Jens Baitinger

23

È possibile leggere le variabili da ARGV e poi rimuoverle da esso prima di procedere alla fase di configurazione. È difficile modificare ARGV ma non sono riuscito a trovare nessun altro modo per le opzioni della riga di comando.

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

Questo non sembra funzionare per me. Ottengo sempre l'errore È stata specificata un'opzione non valida . L'esecuzione della puts ARGVvisualizzazione corretta dell'array dopo la rimozione di argomenti personalizzati aggiuntivi.
Majkinetor

1
Lo stesso qui, non funziona ... ho inserito una puts "#{ARGV}"riga vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/plugin/v2/command.rbe stampa quella riga prima della rimozione degli argomenti rilevanti nel Vagrantfile, quindi la rimozione è inutile poiché l'ARGV viene passato al validatore che emette An invalid option was specifiedprima di qualsiasi le operazioni possono avvenire su ARGV.
BogdanSorlea

8

La soluzione GetoptLong di @ benjamin-gauthier è davvero chiara, si adatta bene al paradigma del rubino e del vagabondo.

Tuttavia, necessita di una riga in più per correggere la gestione pulita degli argomenti vagabondi, come 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

che consente a questo blocco di codice di sospendere quando vengono elaborate le opzioni personalizzate. così ora, vagrant --custom-option up --provision o vagrant destroy -f sono gestiti in modo pulito.

Spero che sia di aiuto,


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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.