Как передать параметр на 'vagrant up' и иметь его в области Vagrantfile?
Я ищу способ передать параметр шеф-повару поваренной книги, как:
$ vagrant up some_parameter
и затем использовать some_parameter
внутри одной из поваренных книг шеф-повара.
3 ответа:
вы не можете передать какой-либо параметр vagrant. Единственный способ-использовать переменные среды
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, чтобы избежать ошибки проверки недопустимого параметра.
дополнительная информация о библиотеке здесь.
можно прочитать переменные из 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
provision.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