Jak przekazać parametr „vagrant up” i mieć go w zakresie pliku Vagrantfile?

85

Szukam sposobu na przekazanie parametru do książki kucharskiej Chefa, takiego jak:

$ vagrant up some_parameter

A następnie użyj some_parameterw jednej z książek kucharskich szefa kuchni.

Wojciech Bednarski
źródło

Odpowiedzi:

112

Nie możesz przekazać żadnego parametru do włóczęgi. Jedynym sposobem jest użycie zmiennych środowiskowych

MY_VAR='my value' vagrant up

I użyj ENV['MY_VAR']w przepisie.

Draco Ater
źródło
1
Dzięki! Wypróbowałem gist.github.com/4435297 i mogę uzyskać dane wejściowe użytkownika, ale nie mam pojęcia, jak przekazać je do książki kucharskiej szefa kuchni. Teraz spróbuję połączyć to z ENV
Wojciech Bednarski
6
Możesz uzyskać dostęp do tego ENV var również w pliku Vagrantfile i umieścić go w skrócie chef.json (patrz docs.vagrantup.com/v1/docs/provisioners/ ... )
StephenKing,
Tak, to jest wygodniejsze.
Draco Ater
5
Sam autor włóczęgi mówi, że używa zmiennych środowiskowych: github.com/mitchellh/vagrant/issues/2064
Alexander Bird,
w PowerShell powinieneś użyć czegoś takiego $ Env: MY_VAR = 'moja wartość' | vagrant up
Alberto R.
70

Możesz także dołączyć bibliotekę GetoptLong Ruby, która umożliwia analizowanie opcji wiersza poleceń.

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

Następnie możesz uruchomić:

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

Uwaga: Upewnij się, że opcja niestandardowa jest określona przed komendą włóczni, aby uniknąć błędu sprawdzania nieprawidłowej opcji.

Więcej informacji o bibliotece tutaj .

Benjamin Gauthier
źródło
1
Używam go cały dzień, odkąd opublikowałem. Pracuje bardzo dobrze ! Jaki masz problem ?
Benjamin Gauthier
13
Wygląda na to, że opcje nie są wymienione w optsnieprzetworzonych: vagrant --custom-option=option destroy -f vagrant: invalid option -- f
Renat Zaripov
2
Tak, to działa, a imho jest bardziej eleganckie niż pierwsza odpowiedź.
davidav
2
@BenjaminGauthier Dokumenty mówią: „Pusta opcja - (dwa symbole minus) służy do zakończenia przetwarzania opcji”. To vagrant --custom-option=option -- uppowinno wystarczyć
CESCO
2
To już nie działa z Vagrant 2. Nie akceptuje żadnych innych parametrów.
Jens Baitinger,
23

Możliwe jest odczytanie zmiennych z ARGV, a następnie usunięcie ich z niego przed przejściem do fazy konfiguracji. Modyfikowanie ARGV wydaje się nieprzyjemne, ale nie mogłem znaleźć innego sposobu na opcje wiersza poleceń.

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
źródło
To chyba nie działa dla mnie. Zawsze pojawia się błąd Podano nieprawidłową opcję . Wykonanie puts ARGVwyświetla poprawną tablicę po usunięciu dodatkowych argumentów niestandardowych.
majkinetor
1
To samo tutaj, to nie działa ... Wstawiam puts "#{ARGV}"linię vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/plugin/v2/command.rbi drukuje tę linię przed usunięciem odpowiednich argumentów w pliku Vagrantfile, co oznacza, że ​​usunięcie jest daremne, ponieważ ARGV jest przekazywany do walidatora, który wypisuje An invalid option was specifiedprzed jakimkolwiek operacje mogą odbywać się na ARGV.
BogdanSorlea
8

Rozwiązanie GetoptLong firmy @ benjamin-gauthier jest naprawdę zgrabne, dobrze pasuje do paradygmatu rubinu i włóczęgi.

Jednak potrzebuje jednej dodatkowej linii, aby naprawić czystą obsługę błędnych argumentów, takich jak 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

co umożliwia wstrzymanie tego bloku kodu podczas przetwarzania opcji niestandardowych. więc teraz, vagrant --custom-option up --provision lub vagrant destroy -f są czysto obsługiwane.

Mam nadzieję że to pomoże,

Kannan Varadhan
źródło
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
źródło