Ruby 动态填充厨师烹饪书属性

Ruby 动态填充厨师烹饪书属性,ruby,vagrant,chef-infra,Ruby,Vagrant,Chef Infra,我正在尝试创建一个配方,它将在YAML配置文件中定义的变量拉入配方,然后将它们的值用作配方属性 有两点: 我的config.yml文件位于我的厨师目录的根目录中(即,在我的cookbooks目录之外,与驱动供应过程的我的Vagrantfile处于同一级别) 我使用类似的方法将值填充到我的Vagrantfile,这就是我提出此解决方案的原因。我想维护一个用户可配置值列表,这些值需要在我的Vagrantfile以及各种烹饪书中的各种食谱中使用 例如,下面是来自config.yml的两个值: ---

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

有两点:

  • 我的
    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']