【发布时间】:2020-04-19 09:55:59
【问题描述】:
我正在尝试创建一个配方,它会引入在 YAML 配置文件中定义的变量,然后将它们的值用作配方属性。
几点:
我的
config.yml文件位于我的 chef 目录的根目录中(也就是说,在我的cookbooks目录之外,并且与驱动配置过程的Vagrantfile处于同一级别。我使用类似的方法将值填充到我的
Vagrantfile中,这就是我提出这个解决方案的想法的原因。我想维护一个用户可配置值的列表,这些值需要在我的Vagrantfile以及各种食谱中的各种食谱中使用。
例如,这里有两个来自config.yml 的值:
---
basics:
vm_ip: 192.168.56.11
vm_hostname: luma.com
我在Vagrantfile 中使用以下内容来读取这些值:
require 'yaml'
config_file = "config.yml"
settings = YAML.load_file(File.dirname(File.expand_path(__FILE__)) + "/#{config_file}")
我在Vagrantfile(语法缩写)的其他地方引用它们:
machine.vm.network 'private_network', ip: settings['basics']['vm_ip']
machine.vm.hostname = settings['basics']['vm_hostname']
这种方法非常适合 Vagrantfile,但当然,这超出了 Chef 的权限。
从 Chef 的角度来看,我想我或许可以采用类似的方法,因为 Chef 是基于 Ruby 的。我有一本带有 attributes 文件夹和 default.rb 属性文件的食谱 base。我最初的尝试是简单地复制 default.rb 中的方法:
require 'yaml'
config_file = "config.yml"
settings = YAML.load_file(File.dirname(File.expand_path("../../../", __FILE__)) + "/#{config_file}")
然后将config.yml 值作为属性引用,如下所示:
default['vm']['ip'] = settings['basics']['vm_ip']
default['vm']['hostname'] = settings['basics']['vm_hostname']
这失败了,因为正如我(天真地)了解到的那样,__FILE__ 值是指节点上的路径而不是本地目录中的文件,因为此属性文件在收敛期间使用等。愚蠢我。
所以,我现在的想法是动态填充属性文件作为Vagrantfile 的一部分,因为这超出了 Chef 的流程。在我开始写这篇文章之前,我想知道是否有更合适的基于厨师的方法我应该考虑。
【问题讨论】:
标签: ruby vagrant chef-infra