'योनिर अप' पर पैरामीटर कैसे पास करें और इसे वैग्रांटफाइल के दायरे में रखें?


85

मैं बावर्ची रसोई की किताब के लिए पैरामीटर पारित करने के लिए एक रास्ता देख रहा हूँ जैसे:

$ vagrant up some_parameter

और फिर some_parameterशेफ कुकबुक में से एक के अंदर का उपयोग करें ।

जवाबों:


112

आप आवारा किसी भी पैरामीटर को पारित नहीं कर सकते। एकमात्र तरीका पर्यावरण चर का उपयोग करना है

MY_VAR='my value' vagrant up

और ENV['MY_VAR']नुस्खा में उपयोग करें ।


1
धन्यवाद! मैंने gist.github.com/4435297 की कोशिश की है और मैं उपयोगकर्ता इनपुट प्राप्त कर सकता हूं, लेकिन इसे बावर्ची रसोई की किताब में पारित करने का कोई विचार नहीं है। अब इसे ENV
Wojciech Bednarski

6
आप उस ENV वर्जन को Vagrantfile में भी एक्सेस कर सकते हैं और उसे chef.json हैश में डाल सकते हैं (देखें docs.vagrantup.com/v1/docs/provisioners/… )
StephenKing

हां, यह अधिक सुविधाजनक है।
ड्रेको एटर

5
योनि के लेखक खुद पर्यावरण चर का उपयोग करने के लिए कहते हैं: github.com/mitchellh/vagrant/issues/2064
अलेक्जेंडर बर्ड

इस तरह से आपको $ Env: MY_VAR = 'my value' | आवारा
अल्बर्टो आर।

70

आप GetoptLong Ruby लाइब्रेरी को भी शामिल कर सकते हैं जो आपको कमांड लाइन विकल्पों को पार्स करने की अनुमति देती है।

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

फिर, आप चला सकते हैं:

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

नोट: सुनिश्चित करें कि अमान्य विकल्प सत्यापन त्रुटि से बचने के लिए कस्टम कमांड योनि कमांड से पहले निर्दिष्ट किया गया है।

पुस्तकालय के बारे में अधिक जानकारी यहाँ


1
मैं इसे पोस्ट करने के बाद से पूरे दिन इस्तेमाल कर रहा हूं। ये अच्छी तरह काम करता है ! तुम्हारी समस्या क्या है ?
बेंजामिन गौथियर

13
ऐसा लगता है कि विकल्प optsसंसाधित नहीं हैं:vagrant --custom-option=option destroy -f vagrant: invalid option -- f
रेनैट ज़रीपोव

2
हां, यह काम करता है, और पहले जवाब की तुलना में इमो अधिक सुरुचिपूर्ण है।
द्वीदेव

2
@BenjaminGauthier डॉक्स का कहना है कि "खाली ऑप्शन - (दो माइनस सिंबल) का इस्तेमाल ऑप्शन प्रोसेसिंग को खत्म करने के लिए किया जाता है।" तो vagrant --custom-option=option -- upपर्याप्त होना चाहिए
सीईएससीओ

2
यह अब Vagrant 2 के साथ काम नहीं करता है। यह अपने स्वयं के पास किसी भी पैरामीटर को स्वीकार नहीं करता है।
जेन्स बैटरिंगर

23

ARGV से चर पढ़ना संभव है और फिर कॉन्फ़िगरेशन चरण पर आगे बढ़ने से पहले उन्हें इससे हटा दें। यह ARGV को संशोधित करने के लिए icky लगता है, लेकिन मैं कमांड-लाइन विकल्पों के लिए कोई अन्य तरीका नहीं खोज सका।

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

यह मेरे लिए काम नहीं लगता है। मुझे हमेशा त्रुटि मिलती है एक अवैध विकल्प निर्दिष्ट किया गया था । कर puts ARGVप्रदर्शित करता है अतिरिक्त कस्टम तर्क को हटाने के बाद सही सरणी।
४। में

1
यहाँ भी, यह काम नहीं करता है ... मैं एक puts "#{ARGV}"लाइन डालता हूं vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/plugin/v2/command.rbऔर यह वैग्रांटीफाइल में संबंधित आर्गन्स को हटाने से पहले उस लाइन को प्रिंट करता है, इस प्रकार अर्थ यह है कि निष्कासन निरर्थक है क्योंकि ARGV सत्यापनकर्ता के पास जाता है जो An invalid option was specifiedकिसी भी आउटपुट के लिए है संचालन ARGV पर हो सकता है।
बोगदानसोर्ल

8

@ बेंजामिन-गॉथियर का गेटॉप्लॉन्ग सॉल्यूशन वास्तव में साफ-सुथरा है, जो रूबी और योनि के प्रतिमान के साथ अच्छी तरह से फिट बैठता है।

हालांकि, योनि तर्कों की स्वच्छ हैंडलिंग को ठीक करने के लिए एक अतिरिक्त पंक्ति की आवश्यकता होती है, जैसे कि 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

जब कस्टम विकल्प संसाधित किए जाते हैं तो कोड के इस ब्लॉक को रोकने की अनुमति देता है। तो अब, vagrant --custom-option up --provision या vagrant destroy -f सफाई से संभाला जाता है।

उम्मीद है की यह मदद करेगा,


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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.