Ich suche nach einer Möglichkeit, Parameter wie folgt an das Kochbuch des Küchenchefs zu übergeben:
$ vagrant up some_parameter
Und dann some_parameter
in einem der Kochbücher des Küchenchefs verwenden.
Ich suche nach einer Möglichkeit, Parameter wie folgt an das Kochbuch des Küchenchefs zu übergeben:
$ vagrant up some_parameter
Und dann some_parameter
in einem der Kochbücher des Küchenchefs verwenden.
Antworten:
Sie können keinen Parameter an vagrant übergeben. Die einzige Möglichkeit besteht darin, Umgebungsvariablen zu verwenden
MY_VAR='my value' vagrant up
Und ENV['MY_VAR']
im Rezept verwenden.
Sie können auch die GetoptLong Ruby-Bibliothek einschließen , mit der Sie Befehlszeilenoptionen analysieren können.
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
Dann können Sie ausführen:
$ vagrant --custom-option=option up
$ vagrant --custom-option=option provision
Hinweis: Stellen Sie sicher, dass die benutzerdefinierte Option vor dem Befehl vagrant angegeben ist , um einen ungültigen Optionsüberprüfungsfehler zu vermeiden.
Weitere Informationen zur Bibliothek finden Sie hier .
opts
nicht verarbeiteten aufgeführt sind: vagrant --custom-option=option destroy -f
vagrant: invalid option -- f
vagrant --custom-option=option -- up
sollte genug sein
vagrant -- destroy -f
scheint es, dass jetzt die -f
Kraftflagge überhaupt nicht passiert, noch tippen muss [y/N]
. Ich habe es beim Ausführen mit Standardparametern zum Laufen gebracht, vagrant up
aber das destroy
erfordert --
irgendwelche Ideen?
Es ist möglich, Variablen aus ARGV zu lesen und sie dann zu entfernen, bevor Sie mit der Konfigurationsphase fortfahren. Es fühlt sich schwierig an, ARGV zu ändern, aber ich konnte keinen anderen Weg für Befehlszeilenoptionen finden.
# 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
wird das richtige Array angezeigt, nachdem zusätzliche benutzerdefinierte Argumente entfernt wurden.
puts "#{ARGV}"
Zeile vagrant/embedded/gems/gems/vagrant-1.7.2/lib/vagrant/plugin/v2/command.rb
eingefügt und diese Zeile wird gedruckt, bevor die relevanten Argumente in der Vagrant-Datei entfernt wurden. Dies bedeutet, dass die Entfernung zwecklos ist, da das ARGV an den Validator übergeben wird, der An invalid option was specified
vor jedem ausgegeben wird Operationen können auf ARGV stattfinden.
Die GetoptLong-Lösung von @ benjamin-gauthier ist wirklich ordentlich und passt gut zum rubinroten und vagabundierenden Paradigma.
Es wird jedoch eine zusätzliche Zeile benötigt, um den sauberen Umgang mit den vagabundierenden Argumenten zu korrigieren, wie z 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
Dadurch kann dieser Codeblock angehalten werden, wenn die benutzerdefinierten Optionen verarbeitet werden. also jetzt
vagrant --custom-option up --provision
oder
vagrant destroy -f
werden sauber gehandhabt.
Hoffe das hilft,
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