Chef节点属性定义:通过引用其他字段来定义一个字段

Chef node attribute definition: define a field by reference other field

如何通过这种方式定义一个ruby哈希?

default['mgmt']['query'] = {
    'default_interval' => {'diff' => 3600, 'snapshot' => 86400 * 7},
    'tables' => {
        'deb_packages' => default_interval,
        'rpm_packages' => default_interval,
        ...
    }
}

编辑:以上代码用于厨师食谱 attributes/default.rb

我正在寻找一种方法来在散列中定义 default_interval 但能够被其他字段引用,以便 default_interval 可以被其他 Chef 方法覆盖,例如环境 json.

这就是为什么我不选择简单地定义一个全局 default_interval var.

的原因

目前,我用下面的定义来表示default_interval

default['mgmt']['query'] = {
    'default_interval' => {'diff' => 3600, 'snapshot' => 86400 * 7},
    'tables' => {
        'deb_packages' => {} # default_interval,
        'rpm_packages' => {} # default_interval,
        ...
    }
}

空的{}可以通过环境json等其他厨师手段覆盖改成{diff: 600, snapshot:86400}

有更好的酷方法吗?

声明node

node = Hash.new { |h, k| h[k] = {} }

您的代码将按原样执行,生成您需要的结构。后者在 ruby btw.

中被命名为“hash”

有关Hash#new接受区块的更多信息。

That is the reason why I do not choose simply define a global default_interval var.

不需要,可以定义一个local变量

default['mgmt']['query'] = {
    'default_interval' => (default_interval = {'diff' => 3600, 'snapshot' => 86400 * 7}),
    'tables' => {
        'deb_packages' => default_interval,
        'rpm_packages' => default_interval,
    }
}

这种风格在 ruby 中不是很常见,肯定会引起一些人的注意,但它确实符合您的要求。