运行 在不更改 Vagrantfile 的情况下,在 Vagrant 中同一 VM 上的 shell 供应商的动态数量?

Run a dynamic number of shell provisioners on the same VM in Vagrant without changing the Vagrantfile?

我正在编写 Vagrantfile 来设置虚拟机。我不想在 Vagrantfile 中硬编码一些配置参数,例如内存和 CPU 数量。因此,我使用了一个加载到 Vagrantfile 中的 YAML 文件来存储这些配置参数。 YAML 文件中存储的一件事是 shell 到 运行 的配置程序脚本列表。例如:

---
machine_config:
  mem: 2048
  cpus: 2
  provisioners:
    -name: shell-script-1
     path: <path-to-shell-script-1>
    -name: shell-script-2
     path: <path-to-shell-script-2>
---

provisioner 的数量事先未知:在上面的 YAML 中有两个,但这只是一个例子。我想要一个 Vagrantfile,它可以 运行 YAML 文件中的所有供应商。我的意思是我希望能够 add/remove YAML 文件的供应者而不触及 Vagrantfile,但是 Vagrantfile 应该正确地 运行 YAML 文件中的所有供应者。我在 Google 上搜索了很多关于如何在动态数量的 VM 上 运行 相同的、硬编码的配置器的示例,但可以找到 none 来解决我的问题。

我想用伪流浪文件语法编写的是:

require "yaml"

current_dir = File.dirname(File.expand_path(__FILE__))
yaml_config = YAML.load_file("#{current_dir}/machine_config.yaml")
machine_config = yaml_config["machine_config"]
additional_scripts = machine_config["provisioners"]

Vagrant.configure("2") do |config|
  config.vm.box = <vm-box-to-use>

  for each item $script in additional_scripts do 
    config.vm.provision "shell", path: $script["path"] 
  end

end

其中 machine_config.yaml 是一个 YAML 文件,就像这个问题的第一个示例中的文件一样, $script 是一个变量,在循环的每次迭代中都包含 machine_config.yaml.最后一点,我对 Ruby 和 Ruby 的语法一无所知(也许对于有这方面知识的人来说,我的问题的答案是微不足道的,但我无法通过谷歌搜索找到它)。

以下将起作用

require "yaml"

current_dir = File.dirname(File.expand_path(__FILE__))
yaml_config = YAML.load_file("#{current_dir}/machine_config.yaml")
machine_config = yaml_config["machine_config"]

Vagrant.configure("2") do |config|
  config.vm.box = "<vm-box-to-use>"

  machine_config["provisioners"].each do |script|
    config.vm.provision "shell", name: script['name'], path: script['path']
  end

end