จะส่งผ่านพารามิเตอร์ใน 'vagrant up' และให้อยู่ในขอบเขตของ Vagrantfile ได้อย่างไร?


86

ฉันกำลังมองหาวิธีส่งผ่านพารามิเตอร์ไปยังตำราอาหารของเชฟเช่น:

$ vagrant up some_parameter

จากนั้นใช้some_parameterหนึ่งในตำราอาหารของเชฟ

คำตอบ:


113

คุณไม่สามารถส่งผ่านพารามิเตอร์ใด ๆ ไปยังคนเร่ร่อนได้ วิธีเดียวคือการใช้ตัวแปรสภาพแวดล้อม

MY_VAR='my value' vagrant up

และใช้ENV['MY_VAR']ในสูตรอาหาร


1
ขอบคุณ! ฉันได้ลองใช้gist.github.com/4435297และสามารถรับข้อมูลจากผู้ใช้ได้ แต่ไม่รู้จะส่งต่อไปยังตำราอาหารของเชฟได้อย่างไร ตอนนี้จะลองรวมสิ่งนี้กับ ENV
Wojciech Bednarski

6
คุณสามารถเข้าถึง ENV var ได้เช่นกันใน Vagrantfile และใส่ลงในแฮช chef.json (ดูdocs.vagrantup.com/v1/docs/provisioners/… )
StephenKing

ใช่ว่าจะสะดวกกว่า
Draco Ater

5
ผู้เขียนคนเร่ร่อนบอกว่าให้ใช้ตัวแปรสภาพแวดล้อม: github.com/mitchellh/vagrant/issues/2064
Alexander Bird

ใน powershell คุณควรใช้ $ Env: MY_VAR = 'ค่าของฉัน' | คนเร่ร่อน
Alberto R.

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

หมายเหตุ: ตรวจสอบให้แน่ใจว่าได้ระบุตัวเลือกที่กำหนดเองไว้ก่อนคำสั่ง vagrant เพื่อหลีกเลี่ยงข้อผิดพลาดในการตรวจสอบความถูกต้องของอ็อพชันที่ไม่ถูกต้อง

ข้อมูลเพิ่มเติมเกี่ยวกับห้องสมุดที่นี่


1
ฉันใช้มันทั้งวันตั้งแต่ฉันโพสต์ ได้ผลดีมาก! ปัญหาของคุณคืออะไร ?
Benjamin Gauthier

13
ดูเหมือนว่าตัวเลือกจะไม่อยู่ในรายการที่optsไม่ได้ดำเนินการ: vagrant --custom-option=option destroy -f vagrant: invalid option -- f
Renat Zaripov

2
ใช่มันใช้งานได้และ imho นั้นสง่างามกว่าคำตอบแรก
davidav

2
@BenjaminGauthier เอกสารระบุว่า "ตัวเลือกว่าง - (สัญลักษณ์ลบสองตัว) ใช้เพื่อสิ้นสุดการประมวลผลตัวเลือก" ดังนั้นvagrant --custom-option=option -- upควรจะเพียงพอ
CESCO

2
สิ่งนี้ใช้ไม่ได้กับ Vagrant 2 อีกต่อไป ไม่ยอมรับพารามิเตอร์ใด ๆ ที่อยู่ข้างตัวมันเอง
Jens Baitinger

23

เป็นไปได้ที่จะอ่านตัวแปรจาก ARGV แล้วลบออกก่อนที่จะดำเนินการต่อในขั้นตอนการกำหนดค่า รู้สึกลำบากในการแก้ไข ARGV แต่ฉันไม่พบวิธีอื่นสำหรับตัวเลือกบรรทัดคำสั่ง

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

 

บทบัญญัติ.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จะแสดงอาร์เรย์ที่ถูกต้องหลังจากลบอาร์กิวเมนต์ที่กำหนดเองเพิ่มเติม
majkinetor

1
เหมือนกันที่นี่มันใช้ไม่ได้ ... ฉันใส่puts "#{ARGV}"บรรทัดvagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/plugin/v2/command.rbและมันพิมพ์บรรทัดนั้นก่อนที่จะลบ args ที่เกี่ยวข้องใน Vagrantfile ซึ่งหมายความว่าการลบนั้นไร้ประโยชน์เนื่องจาก ARGV ถูกส่งไปยังตัวตรวจสอบความถูกต้องที่ส่งออกAn invalid option was specifiedก่อนใด ๆ การดำเนินการสามารถเกิดขึ้นใน ARGV
BogdanSorlea

8

วิธีการแก้ปัญหา GetoptLong ของ @ benjamin-gauthier นั้นประณีตมากเหมาะกับกระบวนทัศน์ของทับทิมและคนเร่ร่อนเป็นอย่างดี

อย่างไรก็ตามจำเป็นต้องมีบรรทัดเพิ่มเติมหนึ่งบรรทัดเพื่อแก้ไขการจัดการอาร์กิวเมนต์เร่ร่อนอย่าง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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.