How to pass parameter on 'vagrant up' and have it in the scope of Vagrantfile? How to pass parameter on 'vagrant up' and have it in the scope of Vagrantfile? ruby ruby

How to pass parameter on 'vagrant up' and have it in the scope of Vagrantfile?


You cannot pass any parameter to vagrant. The only way is to use environment variables

MY_VAR='my value' vagrant up

And use ENV['MY_VAR'] in recipe.


You also can include the GetoptLong Ruby library that allows you to parse command line options.

Vagrantfile

require 'getoptlong'opts = GetoptLong.new(  [ '--custom-option', GetoptLong::OPTIONAL_ARGUMENT ])customParameter=''opts.each do |opt, arg|  case opt    when '--custom-option'      customParameter=arg  endendVagrant.configure("2") do |config|             ...    config.vm.provision :shell do |s|        s.args = "#{customParameter}"    endend

Then, you can run :

$ vagrant --custom-option=option up$ vagrant --custom-option=option provision

Note: Make sure that the custom option is specified before the vagrant command to avoid an invalid option validation error.

More information about the library here.


It is possible to read variables from ARGV and then remove them from it before proceeding to configuration phase. It feels icky to modify ARGV but I couldn't find any other way for command-line options.

Vagrantfile

# Parse optionsoptions = {}options[:port_guest] = ARGV[1] || 8080options[:port_host] = ARGV[2] || 8080options[: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=8080port_host=8080while getopts ":g:h:" opt; do    case "$opt" in        g)            port_guest="$OPTARG" ;;        h)            port_host="$OPTARG" ;;    esacdone