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

时间:2018-03-28 07:46:57

标签: chef chef-attributes

如何通过这种方式定义ruby Hash?

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

编辑:以上代码适用于Chef recipe attributes/default.rb

我正在寻找一种方法来在Hash中定义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}

有更酷的方式吗?

2 个答案:

答案 0 :(得分:1)

  

这就是我不选择简单定义全局default_interval var。

的原因

不需要,您可以定义本地变量。

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

这种风格在红宝石中并不常见,并且保证会引起一些人的注意,但它可以满足您的需求。

答案 1 :(得分:-1)

node声明为

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

并且您的代码将按原样执行,从而生成您需要的结构。后者在ruby btw中被命名为“hash”。

Hash#new接受阻止的更多信息。