厨师,红宝石哈希和模板

时间:2017-10-05 09:38:36

标签: ruby-on-rails ruby chef

我知道这比ruby更多chef个问题,但是......

我有一些属性,如:

default['my_cookbook']['some_namespace1']['some_attribute1'] = 'some_value1'
default['my_cookbook']['some_namespace1']['some_attribute2'] = 'some_value2'
default['my_cookbook']['some_namespace1']['some_attribute2'] = 'some_value3'
...
default['my_cookbook']['some_namespace2']['some_attribute1'] = 'some_value1'
default['my_cookbook']['some_namespace2']['some_attribute2'] = 'some_value2'
default['my_cookbook']['some_namespace2']['some_attribute2'] = 'some_value3'
...

另一方面,我正在创建这样的模板资源:

template 'template_name' do
  source 'template_source.erb'
  variables (
    my_namespace_1: node['my_cookbook']['some_namespace1'],
    my_namespace_2: node['my_cookbook']['some_namespace2']
  )
end

然后在template_source.erb我尝试:

...
<%= @my_namespace_1['some_attribute1'] %> #=> 'some_value1'
...

然而,当我运行Kitchen时,我得到了这个,而不是'some_value1'

Chef::Mixin::Template::TemplateError
------------------------------------
undefined method `[]' for nil:NilClass

我应该如何发送模板变量以这种方式使用它?

2 个答案:

答案 0 :(得分:4)

编辑:这一般只适用于Ruby,尤其不适用于Chef。

传递嵌套哈希:

template 'template_name' do
  source 'template_source.erb'
  variables (
    my_namespace_1: {
      some_attribute1: node['my_cookbook']['some_namespace1']['some_attribute1']
    }
  )
end

但是,不是逐字复制值,而是可以使用Hash class的全部功能来切片,切块并合并在一起,无论你想要什么:

template 'template_name' do
  source 'template_source.erb'
  variables (
    node['my_cookbook'].slice('some_namespace1', 'some_namespace2')
  )
end

Ruby中你遇到的一个问题是符号通常用作哈希键:

# newer literal syntax
a_hash = {
  foo: 'bar'
}

# or with the older hash-rocket syntax
a_hash = {
  :foo => 'bar'
}

符号非常有效,因为它们是存储在表中的实习字符串 - 比较符号时比较对象ID而不是比较字符串中的每个字符。

实际上,只有当您希望哈希中的键不是有效的Ruby符号时才会真正使用字符串 - 就像构建HTTP头的哈希时一样。

Ruby不会无差别地处理符号和字符串键:

{
  foo: 'bar'
}[:foo] 
# => bar

{
  foo: 'bar'
}['foo'] 
# => nil

因此,要访问模板中的传递变量,您将使用:

<%= @my_namespace_1[:some_attribute1] %>

答案 1 :(得分:0)

示例中的内容应该有效。我猜你在原始食谱的某个地方有一个拼写错误,你在通用的时候纠正了代码。

相关问题