繁体   English   中英

厨师,红宝石哈希和模板

[英]Chef, ruby hashes and templates

我知道这不仅仅是chefruby问题,而是......

我有一些属性,如:

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

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

编辑:这一般只适用于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类的全部功能将切片,切块和合并在一起,无论您想要什么:

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] %>

你在这个例子中所拥有的应该是有效的。 我猜你在原始配方的某个地方有一个拼写错误,你在通用的时候纠正了代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM