Szukam sposobu na przekazanie parametru do książki kucharskiej Chefa, takiego jak:
$ vagrant up some_parameter
A następnie użyj some_parameter
w jednej z książek kucharskich szefa kuchni.
Szukam sposobu na przekazanie parametru do książki kucharskiej Chefa, takiego jak:
$ vagrant up some_parameter
A następnie użyj some_parameter
w jednej z książek kucharskich szefa kuchni.
Odpowiedzi:
Nie możesz przekazać żadnego parametru do włóczęgi. Jedynym sposobem jest użycie zmiennych środowiskowych
MY_VAR='my value' vagrant up
I użyj ENV['MY_VAR']
w przepisie.
Możesz także dołączyć bibliotekę GetoptLong Ruby, która umożliwia analizowanie opcji wiersza poleceń.
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
Następnie możesz uruchomić:
$ vagrant --custom-option=option up
$ vagrant --custom-option=option provision
Uwaga: Upewnij się, że opcja niestandardowa jest określona przed komendą włóczni, aby uniknąć błędu sprawdzania nieprawidłowej opcji.
Więcej informacji o bibliotece tutaj .
opts
nieprzetworzonych: vagrant --custom-option=option destroy -f
vagrant: invalid option -- f
vagrant --custom-option=option -- up
powinno wystarczyć
Możliwe jest odczytanie zmiennych z ARGV, a następnie usunięcie ich z niego przed przejściem do fazy konfiguracji. Modyfikowanie ARGV wydaje się nieprzyjemne, ale nie mogłem znaleźć innego sposobu na opcje wiersza poleceń.
# 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
wyświetla poprawną tablicę po usunięciu dodatkowych argumentów niestandardowych.
puts "#{ARGV}"
linię vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/plugin/v2/command.rb
i drukuje tę linię przed usunięciem odpowiednich argumentów w pliku Vagrantfile, co oznacza, że usunięcie jest daremne, ponieważ ARGV jest przekazywany do walidatora, który wypisuje An invalid option was specified
przed jakimkolwiek operacje mogą odbywać się na ARGV.
Rozwiązanie GetoptLong firmy @ benjamin-gauthier jest naprawdę zgrabne, dobrze pasuje do paradygmatu rubinu i włóczęgi.
Jednak potrzebuje jednej dodatkowej linii, aby naprawić czystą obsługę błędnych argumentów, takich jak 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
co umożliwia wstrzymanie tego bloku kodu podczas przetwarzania opcji niestandardowych. więc teraz,
vagrant --custom-option up --provision
lub
vagrant destroy -f
są czysto obsługiwane.
Mam nadzieję że to pomoże,
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