我正在尝试创建一个配方,以提取YAML配置文件中定义的变量,然后将其值用作配方属性。
几点:
我的config.yml
文件位于我的厨师目录的根目录中(即,在我的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']
非常有用,但是当然,这超出了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的过程中。在写这篇文章之前,我想知道是否应该考虑一种更合适的基于厨师的方法。
答案 0 :(得分:0)
我可能是错的,但看来您正在尝试发明轮子。让我详细说明...
从无所事事的角度来看,您应该将test-kitchen与vagrant
driver结合使用。
设置完毕后,即可使用自定义厨房配置-use general configuration and (user) custom configuration(每个用户可能有不同的自定义配置,与您提到的config.yml
相对)
是一种配置管理,您应该正确使用它。也就是说,不要使用外部文件(config.yml
来为厨师提供值,而要利用recipe attributes,json attributes甚至是data bags来存储将要使用的值在您的食谱中。
请注意,属性可以动态生成,您只需要为此设置一些逻辑即可(与config.yml
一样)