Ruby 动态填充厨师烹饪书属性
我正在尝试创建一个配方,它将在YAML配置文件中定义的变量拉入配方,然后将它们的值用作配方属性 有两点:Ruby 动态填充厨师烹饪书属性,ruby,vagrant,chef-infra,Ruby,Vagrant,Chef Infra,我正在尝试创建一个配方,它将在YAML配置文件中定义的变量拉入配方,然后将它们的值用作配方属性 有两点: 我的config.yml文件位于我的厨师目录的根目录中(即,在我的cookbooks目录之外,与驱动供应过程的我的Vagrantfile处于同一级别) 我使用类似的方法将值填充到我的Vagrantfile,这就是我提出此解决方案的原因。我想维护一个用户可配置值列表,这些值需要在我的Vagrantfile以及各种烹饪书中的各种食谱中使用 例如,下面是来自config.yml的两个值: ---
config.yml
文件位于我的厨师目录的根目录中(即,在我的cookbooks
目录之外,与驱动供应过程的我的Vagrantfile
处于同一级别)Vagrantfile
,这就是我提出此解决方案的原因。我想维护一个用户可配置值列表,这些值需要在我的Vagrantfile
以及各种烹饪书中的各种食谱中使用config.yml
的两个值:
---
basics:
vm_ip: 192.168.56.11
vm_hostname: luma.com
我在我的vagrant文件中使用以下内容来读取这些值:
require 'yaml'
config_file = "config.yml"
settings = YAML.load_file(File.dirname(File.expand_path(__FILE__)) + "/#{config_file}")
我在Vagrantfile
的其他地方引用了它们(语法缩写):
这种方法非常适用于Vagrantfile
,但当然,这超出了Chef的权限
从Chef的角度来看,我想我也许可以遵循类似的方法,因为Chef是基于Ruby的。我有一本带有attributes
文件夹的烹饪书base
,还有一个default.rb
attributes文件。我最初的尝试是简单地在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']
这失败了,因为我(天真地)了解到,\uuuuuu FILE\uuuuu
值指的是节点上的路径,而不是本地目录中的文件,因为该属性文件在聚合过程中被使用,等等
所以,我现在的想法是动态地将属性文件填充为代码> VGRAATFION/<代码>的一部分,因为这是在厨师的过程之外。在我努力写之前,我想知道是否有一个更合适的基于厨师的方法我应该考虑。
< P>我可能是错的,但是看起来你正在试图发明W。鞋跟。让我详细说明一下
流浪汉
从流浪者的角度来看,你应该与他们合作
设置好后,利用自定义厨房配置——(每个用户可能有不同的自定义配置,对应于您提到的config.yml
)
另外请注意,kitchen.yml
支持。您可以使用它动态地执行操作
厨师
从chef的角度来看,是一种配置管理,您应该正确使用它。也就是说,不要使用外部文件(config.yml
)向chef提供值,利用甚至存储将在您的配方中使用的值
请注意,属性可以动态生成,您只需为此添加一些逻辑(与config.yml
相同)感谢您抽出时间回答!您的回答促使我重新思考我的方法,更好地利用属性和角色,以实现更符合Chef最佳实践的目标。Chef+vagrant项目是更大整体的一部分,因此test kitchen在这里帮不上什么忙,但更深入地探讨属性、角色和enEnvironments无疑让我离我的目标更近了。对于其他读者,我确实编写了一个从config.yml到Chef默认属性的映射程序。我认为先生的建议是有道理的,所以我会接受答案。
default['vm']['ip'] = settings['basics']['vm_ip']
default['vm']['hostname'] = settings['basics']['vm_hostname']