【问题标题】:Dynamically Populate Chef Cookbook Attributes动态填充 Chef Cookbook 属性
【发布时间】:2020-04-19 09:55:59
【问题描述】:

我正在尝试创建一个配方,它会引入在 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 的。我有一本带有 attributes 文件夹和 default.rb 属性文件的食谱 base。我最初的尝试是简单地复制 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 的流程。在我开始写这篇文章之前,我想知道是否有更合适的基于厨师的方法我应该考虑。

【问题讨论】:

    标签: ruby vagrant chef-infra


    【解决方案1】:

    我可能是错的,但您似乎正在尝试发明轮子。让我详细说明...

    流浪

    从 vagrant 的角度来看,您应该将 test-kitchenvagrant driver 结合使用。

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

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

    厨师

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

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

    【讨论】:

    • 感谢您抽出宝贵时间回答!您的回答促使我重新思考我的方法,并更好地利用属性和角色来实现更符合 Chef 最佳实践的目标。 chef + vagrant 项目是一个更大的整体的一部分,所以测试厨房在这里没有多大帮助,但是更深入地研究属性、角色和环境确实让我离我的目标更近了。对于那里的任何其他读者,我确实编写了一个从我的 config.yml 到 Chef 的默认属性的映射器。我认为先生的建议很有根据,所以我会接受答案。
    猜你喜欢
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 2010-11-19
    相关资源
    最近更新 更多