如何在'vagrant up'上传递参数并将其放在Vagrantfile的范围内?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在'vagrant up'上传递参数并将其放在Vagrantfile的范围内?相关的知识,希望对你有一定的参考价值。

我正在寻找一种方法将参数传递给Chef cookbook,如:

$ vagrant up some_parameter

然后在厨师烹饪书中使用some_parameter

答案

你不能将任何参数传递给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命令之前指定了custom选项,以避免无效的选项验证错误。

有关库here的更多信息。

另一答案

可以从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
另一答案

@ benjamin-gauthier的GetoptLong解决方案非常简洁,适合红宝石和流浪者的范例。

但是,它需要一个额外的行来修复流浪者参数的清理处理,例如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

这允许在处理自定义选项时暂停此代码块。所以现在,vagrant --custom-option up --provisionvagrant destroy -f干净利落。

希望这可以帮助,

以上是关于如何在'vagrant up'上传递参数并将其放在Vagrantfile的范围内?的主要内容,如果未能解决你的问题,请参考以下文章

如何在每次 vagrant up 命令后保持 RSA 密钥的指纹不发生变化?

如何在“vagrant up”上传递参数并将其置于 Vagrantfile 的范围内?

Vagrant Homestead'存储'文件夹权限被拒绝[已结束]

Vagrant的一个BUG - 不支持'change_host_name'

Vagrant Up失败,因为名称已存在

VirtualBox,Vagrant和Laravel Homestead“vagrant up”错误