ฉันกำลังมองหาวิธีส่งผ่านพารามิเตอร์ไปยังตำราอาหารของเชฟเช่น:
$ vagrant up some_parameter
จากนั้นใช้some_parameter
หนึ่งในตำราอาหารของเชฟ
ฉันกำลังมองหาวิธีส่งผ่านพารามิเตอร์ไปยังตำราอาหารของเชฟเช่น:
$ vagrant up some_parameter
จากนั้นใช้some_parameter
หนึ่งในตำราอาหารของเชฟ
คำตอบ:
คุณไม่สามารถส่งผ่านพารามิเตอร์ใด ๆ ไปยังคนเร่ร่อนได้ วิธีเดียวคือการใช้ตัวแปรสภาพแวดล้อม
MY_VAR='my value' vagrant up
และใช้ENV['MY_VAR']
ในสูตรอาหาร
คุณยังสามารถรวมไลบรารี 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 เพื่อหลีกเลี่ยงข้อผิดพลาดในการตรวจสอบความถูกต้องของอ็อพชันที่ไม่ถูกต้อง
opts
ไม่ได้ดำเนินการ: vagrant --custom-option=option destroy -f
vagrant: invalid option -- f
vagrant --custom-option=option -- up
ควรจะเพียงพอ
เป็นไปได้ที่จะอ่านตัวแปรจาก ARGV แล้วลบออกก่อนที่จะดำเนินการต่อในขั้นตอนการกำหนดค่า รู้สึกลำบากในการแก้ไข ARGV แต่ฉันไม่พบวิธีอื่นสำหรับตัวเลือกบรรทัดคำสั่ง
# 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
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
จะแสดงอาร์เรย์ที่ถูกต้องหลังจากลบอาร์กิวเมนต์ที่กำหนดเองเพิ่มเติม
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
วิธีการแก้ปัญหา 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
ได้รับการจัดการอย่างหมดจด
หวังว่านี่จะช่วยได้
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