【问题标题】:Chef Attributes Structure厨师属性结构
【发布时间】:2016-12-22 08:06:13
【问题描述】:

我只是想了解我们在说明书的属性文件中定义属性结构的方式是否有所不同。

以下是两个例子:

// style-A
default['my_cookbook']['name'] = 'something'
default['my_cookbook']['version'] = '0.1.0'

// style-B
node.default.my_cookbook = {
  :name => 'something',
  :version => '0.1.0'
}

我问这个问题的原因是,在以前版本的厨师中,我有点记得风格-A 强烈推荐,所有社区食谱都遵循这种风格。我还记得当我过去尝试覆盖角色或环境中的属性时,我曾看到样式 B 的一些问题,如果我试图覆盖其中的单个属性,我会想出一个奇怪的行为来替换整个哈希结构。

我现在没有看到这个错误,我使用的是最新的 11 版 Chef,但我只是想知道这是否是我应该担心的事情。我试图以一种风格与我所有的食谱保持一致,我需要一些关于如何构建它的建议。现在有没有关系?

【问题讨论】:

  • Chef 使用 Mash,而不是 hash。不确定它是否会为您自动转换。我个人建议 = Mash.new({you hash})。但我不能发誓这很重要。
  • 确实如此,A 和 B 之间的主要缺点是覆盖中的方法访问,由于方法返回值而不是设置它,因此没有覆盖。 default['test'] = { :name => 'test1' } 完全有效且有效。只需停留在符号或字符串属性访问上,以避免方法在覆盖时失败。

标签: ruby chef-infra chef-attributes


【解决方案1】:

使用default['key']['subkey'] 样式时,defaultMash,Mash 的[]= 方法会将Hash 或哈希数组转换为Mash。

node.default.property = 样式将分配一个Hash,而不调用[]= 方法。

Mash 继承自 Hash,提供额外的功能,并将初始化程序的默认值覆盖为 {},这使任何未定义的值成为哈希,然后由于 mash 的行为将其转换为 mash。

【讨论】: