动态填充 Chef Cookbook 属性
Dynamically Populate Chef Cookbook Attributes
我正在尝试创建一个配方,它引入在 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 的。我有一本食谱 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
所做的相同)
我正在尝试创建一个配方,它引入在 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 的。我有一本食谱 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
所做的相同)