无法在运行时设置节点属性并在厨师模板中引用它

时间:2017-10-07 03:39:44

标签: ruby chef chef-recipe

由于backend.key=<%= node['key']%&gt;我收到模板错误在源key.properties.erb中使用,在运行shellout时没有值。

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

我有一个ruby块来获取文件cat /tmp/key.txt的输出并指定为节点值。

Ruby块:

ruby_block "Get_key" do
    block do
        #tricky way to load this Chef::Mixin::ShellOut utilities
        Chef::Resource::RubyBlock.send(:include, Chef::Mixin::ShellOut)      
        command = 'cat /tmp/key.txt'
        command_out = shell_out(command)
        node.set['key'] = command_out.stdout
    end
    action :create
end

Erb:

backend.key=<%= node['key']%>

2 个答案:

答案 0 :(得分:0)

无需shell_out来读取文件的内容。试试这个:

ruby_block "Get_key" do
  only_if { node['key'] == "" }
  block do
    node.set['key'] = File.read('/tmp/key.txt')
  end
end

但我认为你的实际问题是在其他地方。该错误消息表明您的模板中nodenil,这非常不寻常。

所以要么我是盲目的,你在发布的模板行中确实有一些拼写错误,或者你以简化错误的方式简化了代码示例。我假设您的真实模板看起来更像

backend.key=<%= node['foo']['key']%>

foo不是数组。检查一下。

答案 1 :(得分:0)

请不要使用此模式。它很慢并且在节点对象中放入了额外的数据,这会占用空间和RAM并使搜索索引变得悲伤。你想要的是这个:

template "whatever" do
  # Other stuff ...
  variables my_file: lazy { IO.read('/tmp/key.txt') }
end

这将延迟读取直到收敛时间。