Parametre 'vagrant up' üzerine nasıl geçirilir ve Vagrantfile kapsamında nasıl bulunur?


Yanıtlar:


113

Serseriye herhangi bir parametre aktaramazsınız. Tek yol, ortam değişkenlerini kullanmaktır

MY_VAR='my value' vagrant up

Ve ENV['MY_VAR']tarifte kullanın .


1
Teşekkürler! Gist.github.com/4435297'yi denedim ve kullanıcı girdisi alabiliyorum, ancak bunu Şef yemek kitabına nasıl aktaracağımı bilmiyorum. Şimdi bunu ENV ile birleştirmeyi deneyeceğiz
Wojciech Bednarski

6
Bu ENV varlığına Vagrantfile'dan da erişebilir ve chef.json hash dosyasına koyabilirsiniz (bkz. Docs.vagrantup.com/v1/docs/provisioners/… )
StephenKing

Evet, bu daha uygun.
Draco Ater


powershell'de böyle bir şey kullanmalısınız $ Env: MY_VAR = 'benim değerim' | serseri yukarı
Alberto R.

70

Ayrıca GetoptLong'u da ekleyebilirsiniz.Komut satırı seçeneklerini ayrıştırmanıza izin veren Ruby kitaplığını .

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

Ardından şunları çalıştırabilirsiniz:

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

Not: Geçersiz bir seçenek doğrulama hatasını önlemek için özel seçeneğin vagrant komutundan önce belirtildiğinden emin olun .

Kütüphane hakkında daha fazla bilgiyi burada bulabilirsiniz .


1
Gönderdiğimden beri bütün gün kullanıyorum. Çok iyi çalışıyor ! Senin sorunun ne ?
Benjamin Gauthier

13
Görünen o ki, seçenekler optsişlenmeyenler listesinde yer almıyor: vagrant --custom-option=option destroy -f vagrant: invalid option -- f
Renat Zaripov

2
Evet, bu işe yarıyor ve imho ilk cevaptan daha zarif.
davidav

2
@BenjaminGauthier Dokümanlar "Boş seçenek - (iki eksi sembol), seçenek işlemeyi sonlandırmak için kullanılır." Bu yüzden vagrant --custom-option=option -- upyeterli olmalı
CESCO

2
Bu artık Vagrant 2 ile çalışmıyor. Kendisinin dışında hiçbir parametreyi kabul etmez.
Jens Baitinger

23

Değişkenleri ARGV'den okumak ve ardından konfigürasyon aşamasına geçmeden önce ondan çıkarmak mümkündür. ARGV'yi değiştirmek iğrenç geliyor ama komut satırı seçenekleri için başka bir yol bulamadım.

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

 

provizyon.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

Bu benim için işe yaramıyor gibi görünüyor. Her zaman hata alıyorum Geçersiz bir seçenek belirtildi . Yapmak puts ARGV, fazladan özel bağımsız değişkenler kaldırıldıktan sonra doğru diziyi görüntüler.
majkinetor

1
Aynı burada, işe yaramıyor ... Bir puts "#{ARGV}"satır koyuyorum vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/plugin/v2/command.rbve o satırı Vagrantfile'daki ilgili argümanlar kaldırılmadan önce yazdırıyor, yani ARGV An invalid option was specifiedherhangi birinden önce çıktı veren doğrulayıcıya geçirildiği için kaldırmanın boşuna olduğu anlamına geliyor. işlemler ARGV üzerinde gerçekleştirilebilir.
BogdanSorlea

8

@ benjamin-gauthier'in GetoptLong çözümü gerçekten temiz, yakut ve serseri paradigmasına çok iyi uyuyor.

Bununla birlikte, serseri argümanların temiz bir şekilde ele alınmasını düzeltmek için fazladan bir satıra ihtiyaç duyar 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

bu, özel seçenekler işlendiğinde bu kod bloğunun duraklamasına izin verir. yani şimdi vagrant --custom-option up --provision veya vagrant destroy -f temiz bir şekilde ele alınıyor.

Bu yardımcı olur umarım,


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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.