我知道这比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
我应该如何发送模板变量以这种方式使用它?
答案 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)
示例中的内容应该有效。我猜你在原始食谱的某个地方有一个拼写错误,你在通用的时候纠正了代码。