我正在编写一个Vagrantfile来设置VM。我不想在Vagrantfile中硬编码一些配置参数,例如内存和CPU数量。结果,我正在使用一个YAML文件,该文件已加载到Vagrantfile中以存储这些配置参数。 YAML文件中存储的一件事是要运行的Shell Provisioner脚本列表。例如:
---
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>
---
供应商的数量不是先验的:在上面的YAML中有两个,但这仅是示例。我想有一个Vagrantfile,它可以运行YAML文件中的所有预配器。我的意思是我希望能够在不触摸Vagrantfile的情况下向YAML文件添加/删除预配器,但是Vagrantfile应该正确运行YAML文件中的所有预配器。我在Google上进行了搜索,其中有很多示例说明了如何在动态数量的VM上运行相同的,经过硬编码的资源调配器,但是找不到与我有关的问题。
用伪vagrantfile语法编写的我想做的是:
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的语法一无所知(也许对有此知识的人来说,我的问题的答案是微不足道的,但我无法通过谷歌搜索找到它)。
答案 0 :(得分:1)
以下将起作用
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