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.