Parametreyi Şef yemek kitabına iletmenin bir yolunu arıyorum:
$ vagrant up some_parameter
Ve sonra some_parameter
Şef yemek kitaplarından birinin içinde kullanın .
Parametreyi Şef yemek kitabına iletmenin bir yolunu arıyorum:
$ vagrant up some_parameter
Ve sonra some_parameter
Şef yemek kitaplarından birinin içinde kullanın .
Yanıtlar:
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 .
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 .
opts
işlenmeyenler listesinde yer almıyor: vagrant --custom-option=option destroy -f
vagrant: invalid option -- f
vagrant --custom-option=option -- up
yeterli olmalı
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.
# 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
, fazladan özel bağımsız değişkenler kaldırıldıktan sonra doğru diziyi görüntüler.
puts "#{ARGV}"
satır koyuyorum vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/plugin/v2/command.rb
ve o satırı Vagrantfile'daki ilgili argümanlar kaldırılmadan önce yazdırıyor, yani ARGV An invalid option was specified
herhangi 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.
@ 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,
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