动态填充 Chef Cookbook 属性

Dynamically Populate Chef Cookbook Attributes

我正在尝试创建一个配方,它引入在 YAML 配置文件中定义的变量,然后将它们的值用作配方属性。

几点:

  1. 我的 config.yml 文件位于我的 chef 目录的根目录中(即,在我的 cookbooks 目录之外,与我的 Vagrantfile 驱动配置过程。

  2. 我使用类似的方法将值填充到我的 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 的。我有一本食谱 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__ 值指的是节点上的路径而不是本地目录中的文件,因为在收敛过程中使用了这个属性文件, 等等 愚蠢的我。

所以,我现在的想法是动态填充属性文件作为 Vagrantfile 的一部分,因为那不在 Chef 的进程中。在我努力写这篇文章之前,我想知道是否有更合适的基于厨师的方法我应该考虑。

我可能是错的,但看来你是想发明轮子。让我详细说明...

流浪汉

从 vagrant 的角度来看,你应该利用 test-kitchen in conjunection with vagrant driver

设置好后,利用自定义厨房配置 -- use general configuration and (user) custom configuration(每个用户可能有不同的自定义配置,对应于您提到的 config.yml

另请注意,kitchen.yml 支持 erb。你可以用它动态地做事。

厨师

从厨师的角度来看,是一种配置管理,您应该正确使用它。也就是说,与其使用外部文件 (config.yml) 为厨师提供值,不如利用 recipe attributes, json attributes or even data bags 存储将在您的食谱中使用的值。

请注意,属性可以动态生成,您只需为此添加一些逻辑(与您为 config.yml 所做的相同)