动态填充Chef Cookbook属性

时间:2019-12-30 17:13:48

标签: ruby vagrant chef

我正在尝试创建一个配方,以提取YAML配置文件中定义的变量,然后将其值用作配方属性。

几点:

  1. 我的config.yml文件位于我的厨师目录的根目录中(即,在我的cookbooks目录之外,并且与驱动{设置过程。

  2. 我使用类似的方法将值填充到我的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'] 非常有用,但是当然,这超出了Chef的权限。

从Chef的角度来看,我认为我可能可以采用类似的方法,因为Chef是基于Ruby的。我有一个带有Vagrantfile文件夹的食谱base和一个attributes属性文件。我最初的尝试是简单地复制default.rb中的方法:

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__的一部分动态填充属性文件,因为这不在Chef的过程中。在写这篇文章之前,我想知道是否应该考虑一种更合适的基于厨师的方法。

1 个答案:

答案 0 :(得分:0)

我可能是错的,但看来您正在尝试发明轮子。让我详细说明...

无聊

从无所事事的角度来看,您应该将test-kitchenvagrant driver结合使用。

设置完毕后,即可使用自定义厨房配置-use general configuration and (user) custom configuration(每个用户可能有不同的自定义配置,与您提到的config.yml相对)

厨师

从主厨角度来看,

是一种配置管理,您应该正确使用它。也就是说,不要使用外部文件(config.yml来为厨师提供值,而要利用recipe attributesjson attributes甚至是data bags来存储将要使用的值在您的食谱中。

请注意,属性可以动态生成,您只需要为此设置一些逻辑即可(与config.yml一样)

相关问题