Wie kann man Parameter an 'vagrant up' übergeben und im Bereich von Vagrantfile haben?

84

Ich suche nach einer Möglichkeit, Parameter wie folgt an das Kochbuch des Küchenchefs zu übergeben:

$ vagrant up some_parameter

Und dann some_parameterin einem der Kochbücher des Küchenchefs verwenden.

Wojciech Bednarski
quelle

Antworten:

111

Sie können keinen Parameter an vagrant übergeben. Die einzige Möglichkeit besteht darin, Umgebungsvariablen zu verwenden

MY_VAR='my value' vagrant up

Und ENV['MY_VAR']im Rezept verwenden.

Draco Ater
quelle
1
Vielen Dank! Ich habe gist.github.com/4435297 ausprobiert und kann Benutzereingaben erhalten, habe aber keine Ahnung, wie ich sie an das Kochbuch des Küchenchefs weitergeben soll. Jetzt werde ich versuchen, dies mit ENV
Wojciech Bednarski
6
Sie können auf diese ENV-Variable auch in der Vagrant-Datei zugreifen und sie in den Hash von chef.json einfügen (siehe docs.vagrantup.com/v1/docs/provisioners/… )
StephenKing
Ja, das ist bequemer.
Draco Ater
5
Der Autor von Vagrant selbst sagt, Umgebungsvariablen zu verwenden: github.com/mitchellh/vagrant/issues/2064
Alexander Bird
In Powershell solltest du so etwas verwenden. $ Env: MY_VAR = 'my value' | Landstreicher
Alberto R.
67

Sie können auch die GetoptLong Ruby-Bibliothek einschließen , mit der Sie Befehlszeilenoptionen analysieren können.

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

Dann können Sie ausführen:

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

Hinweis: Stellen Sie sicher, dass die benutzerdefinierte Option vor dem Befehl vagrant angegeben ist , um einen ungültigen Optionsüberprüfungsfehler zu vermeiden.

Weitere Informationen zur Bibliothek finden Sie hier .

Benjamin Gauthier
quelle
1
Ich benutze es den ganzen Tag, seit ich gepostet habe. Es funktioniert sehr gut ! Was ist dein Problem ?
Benjamin Gauthier
13
Es scheint, dass die Optionen nicht in der optsnicht verarbeiteten aufgeführt sind: vagrant --custom-option=option destroy -f vagrant: invalid option -- f
Renat Zaripov
2
Ja, das funktioniert und imho ist eleganter als die erste Antwort.
Davidav
2
@BenjaminGauthier In den Dokumenten heißt es: "Die leere Option - (zwei Minuszeichen) wird verwendet, um die Optionsverarbeitung zu beenden." Also vagrant --custom-option=option -- upsollte genug sein
CESCO
1
War jemand in der Lage, ohne zu verwenden, vagrant -- destroy -fscheint es, dass jetzt die -fKraftflagge überhaupt nicht passiert, noch tippen muss [y/N]. Ich habe es beim Ausführen mit Standardparametern zum Laufen gebracht, vagrant upaber das destroyerfordert --irgendwelche Ideen?
MMT
23

Es ist möglich, Variablen aus ARGV zu lesen und sie dann zu entfernen, bevor Sie mit der Konfigurationsphase fortfahren. Es fühlt sich schwierig an, ARGV zu ändern, aber ich konnte keinen anderen Weg für Befehlszeilenoptionen finden.

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

 

Bestimmung.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
quelle
Das scheint bei mir nicht zu funktionieren. Ich erhalte immer den Fehler. Es wurde eine ungültige Option angegeben . Wenn Sie dies tun, puts ARGVwird das richtige Array angezeigt, nachdem zusätzliche benutzerdefinierte Argumente entfernt wurden.
Majkinetor
1
Hier funktioniert es auch nicht ... Ich habe eine puts "#{ARGV}"Zeile vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/plugin/v2/command.rbeingefügt und diese Zeile wird gedruckt, bevor die relevanten Argumente in der Vagrant-Datei entfernt wurden. Dies bedeutet, dass die Entfernung zwecklos ist, da das ARGV an den Validator übergeben wird, der An invalid option was specifiedvor jedem ausgegeben wird Operationen können auf ARGV stattfinden.
BogdanSorlea
8

Die GetoptLong-Lösung von @ benjamin-gauthier ist wirklich ordentlich und passt gut zum rubinroten und vagabundierenden Paradigma.

Es wird jedoch eine zusätzliche Zeile benötigt, um den sauberen Umgang mit den vagabundierenden Argumenten zu korrigieren, wie z 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

Dadurch kann dieser Codeblock angehalten werden, wenn die benutzerdefinierten Optionen verarbeitet werden. also jetzt vagrant --custom-option up --provision oder vagrant destroy -f werden sauber gehandhabt.

Hoffe das hilft,

Kannan Varadhan
quelle
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
quelle