0

Just having issues trying to get this to work. Not exactly sure where I went but I'm guessing it might have something to do with the undeclared "group".

So here is my code:

Attribute File:

default['dynamic']['config']['queueGroup'] = [
    {
        'groupName' => 'group1',
        'queueNameRegex' => 'temp.x',
        'showIndividualStats' => 'false',
    },
    {
        'groupName' => 'group2',
        'queueNameRegex' => 'temp.y',
        'showIndividualStats' => 'false',
    },
]

ERB Template:

queueGroups:
 <% @node['dynamic']['config']['queueGroup'].each do |group| %>
  <%= "" %>
  <% @group.each do |key, value| %>
    <%if key == "groupName" %>
     - groupName:<%= value %>
    <% else %>
      <%= "#{key}=#{value}" %>
    <% end %>
  <% end %>
<% end %>

Recipe:

template '/tmp/temp.config' do
  source 'config.yml.erb'
  owner 'test'
  group 'test'
  mode '0644'
  variables(
    rmq_host: node['fqdn'],
    rmq_port: node['dynamic']['config']['rmq_port'],
    rmq_usessl: node['dynamic']['config']['rmq_usessl'],
    rmq_username: node['dynamic']['config']['rmq_username'],
    rmq_password: node['dynamic']['config']['rmq_password'],
    rmq_display_name: node['fqdn'],
    rmq_socket_timeout: node['dynamic']['config']['rmq_socket_timeout'],
    rmq_connect_timeout: node['dynamic']['config']['rmq_connect_timeout'],
    rmq_metric_prefix: node['dynamic']['config']['rmq_metric_prefix']
  )
  action :create
end

Getting the following error when I try to run the recipe to create the template:

Running handlers:
[2020-10-15T23:02:31+11:00] ERROR: Running exception handlers
Running handlers complete
[2020-10-15T23:02:31+11:00] ERROR: Exception handlers complete
Chef Infra Client failed. 5 resources updated in 07 seconds
[2020-10-15T23:02:31+11:00] FATAL: Stacktrace dumped to /tmp/cookbooks/london/.chef/local-mode-cache/cache/chef-stacktrace.out
[2020-10-15T23:02:31+11:00] FATAL: Please provide the contents of the stacktrace.out file if you file a bug report
[2020-10-15T23:02:31+11:00] FATAL: Chef::Mixin::Template::TemplateError: undefined method `each' for nil:NilClass

Below is the Stacktrace output

Generated at 2020-10-15 23:02:31 +1100
Chef::Mixin::Template::TemplateError:

Chef::Mixin::Template::TemplateError (undefined method `each' for nil:NilClass) on line #30:

 28:  <<% @node['dynamic']['config']['queueGroup'].each do |group| %>
 29:   <%= "" %>
 30:   <% @group.each do |key, value| %>
 31:     <%if key == "groupName" %>
 32:      - groupName:<%= value %>

  /tmp/cookbooks/default/.chef/local-mode-cache/cache/cookbooks/test/templates/default/temp.config.erb:30:in `block (2 levels) in evaluate'
  /tmp/cookbooks/default/.chef/local-mode-cache/cache/cookbooks/test/templates/default/temp.config.erb:28:in `each'
  /tmp/cookbooks/default/.chef/local-mode-cache/cache/cookbooks/test/templates/default/temp.config.erb:28:in `block in evaluate'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/erubis-2.7.0/lib/erubis/evaluator.rb:74:in `instance_eval'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/erubis-2.7.0/lib/erubis/evaluator.rb:74:in `evaluate'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/mixin/template.rb:161:in `_render_template'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/mixin/template.rb:146:in `render_template'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/provider/template/content.rb:76:in `file_for_provider'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/file_content_management/content_base.rb:42:in `tempfile'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/provider/file.rb:455:in `tempfile'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/provider/file.rb:329:in `do_generate_content'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/provider/file.rb:141:in `action_create'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/provider.rb:189:in `run_action'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/resource.rb:586:in `run_action'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/runner.rb:74:in `run_action'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/runner.rb:108:in `block in run_all_actions'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/runner.rb:108:in `each'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/runner.rb:108:in `run_all_actions'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/runner.rb:132:in `block in converge'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/resource_collection/resource_list.rb:96:in `block in execute_each_resource'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/resource_collection/stepable_iterator.rb:115:in `call_iterator_block'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/resource_collection/stepable_iterator.rb:86:in `step'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/resource_collection/stepable_iterator.rb:104:in `iterate'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/resource_collection/stepable_iterator.rb:55:in `each_with_index'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/resource_collection/resource_list.rb:94:in `execute_each_resource'
  /opt/chef/embedded/lib/ruby/2.6.0/forwardable.rb:230:in `execute_each_resource'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/runner.rb:130:in `converge'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/client.rb:703:in `block in converge'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/client.rb:698:in `catch'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/client.rb:698:in `converge'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/client.rb:722:in `converge_and_save'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/client.rb:288:in `run'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/application.rb:320:in `run_with_graceful_exit_option'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/application.rb:296:in `block in run_chef_client'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/local_mode.rb:42:in `with_server_connectivity'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/application.rb:279:in `run_chef_client'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/application/base.rb:330:in `run_application'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/application.rb:69:in `run'
  /opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-bin-15.8.23/bin/chef-client:25:in `<top (required)>'
  /bin/chef-client:177:in `load'
  /bin/chef-client:177:in `<main>'


/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/mixin/template.rb:163:in `rescue in _render_template'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/mixin/template.rb:158:in `_render_template'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/mixin/template.rb:146:in `render_template'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/provider/template/content.rb:76:in `file_for_provider'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/file_content_management/content_base.rb:42:in `tempfile'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/provider/file.rb:455:in `tempfile'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/provider/file.rb:329:in `do_generate_content'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/provider/file.rb:141:in `action_create'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/provider.rb:189:in `run_action'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/resource.rb:586:in `run_action'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/runner.rb:74:in `run_action'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/runner.rb:108:in `block in run_all_actions'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/runner.rb:108:in `each'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/runner.rb:108:in `run_all_actions'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/runner.rb:132:in `block in converge'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/resource_collection/resource_list.rb:96:in `block in execute_each_resource'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/resource_collection/stepable_iterator.rb:115:in `call_iterator_block'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/resource_collection/stepable_iterator.rb:86:in `step'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/resource_collection/stepable_iterator.rb:104:in `iterate'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/resource_collection/stepable_iterator.rb:55:in `each_with_index'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/resource_collection/resource_list.rb:94:in `execute_each_resource'
/opt/chef/embedded/lib/ruby/2.6.0/forwardable.rb:230:in `execute_each_resource'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/runner.rb:130:in `converge'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/client.rb:703:in `block in converge'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/client.rb:698:in `catch'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/client.rb:698:in `converge'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/client.rb:722:in `converge_and_save'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/client.rb:288:in `run'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/application.rb:320:in `run_with_graceful_exit_option'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/application.rb:296:in `block in run_chef_client'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/local_mode.rb:42:in `with_server_connectivity'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/application.rb:279:in `run_chef_client'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/application/base.rb:330:in `run_application'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/application.rb:69:in `run'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-bin-15.8.23/bin/chef-client:25:in `<top (required)>'
/bin/chef-client:177:in `load'
/bin/chef-client:177:in `<main>'

>>>> Caused by NoMethodError: undefined method `each' for nil:NilClass
/tmp/cookbooks/default/.chef/local-mode-cache/cache/cookbooks/test/templates/default/temp.config.erb:30:in `block (2 levels) in evaluate'
/tmp/cookbooks/default/.chef/local-mode-cache/cache/cookbooks/test/templates/default/temp.config.erb:28:in `each'
/tmp/cookbooks/default/.chef/local-mode-cache/cache/cookbooks/test/templates/default/temp.config.erb:28:in `block in evaluate'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/erubis-2.7.0/lib/erubis/evaluator.rb:74:in `instance_eval'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/erubis-2.7.0/lib/erubis/evaluator.rb:74:in `evaluate'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/mixin/template.rb:161:in `_render_template'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/mixin/template.rb:146:in `render_template'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/provider/template/content.rb:76:in `file_for_provider'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/file_content_management/content_base.rb:42:in `tempfile'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/provider/file.rb:455:in `tempfile'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/provider/file.rb:329:in `do_generate_content'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/provider/file.rb:141:in `action_create'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/provider.rb:189:in `run_action'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/resource.rb:586:in `run_action'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/runner.rb:74:in `run_action'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/runner.rb:108:in `block in run_all_actions'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/runner.rb:108:in `each'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/runner.rb:108:in `run_all_actions'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/runner.rb:132:in `block in converge'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/resource_collection/resource_list.rb:96:in `block in execute_each_resource'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/resource_collection/stepable_iterator.rb:115:in `call_iterator_block'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/resource_collection/stepable_iterator.rb:86:in `step'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/resource_collection/stepable_iterator.rb:104:in `iterate'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/resource_collection/stepable_iterator.rb:55:in `each_with_index'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/resource_collection/resource_list.rb:94:in `execute_each_resource'
/opt/chef/embedded/lib/ruby/2.6.0/forwardable.rb:230:in `execute_each_resource'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/runner.rb:130:in `converge'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/client.rb:703:in `block in converge'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/client.rb:698:in `catch'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/client.rb:698:in `converge'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/client.rb:722:in `converge_and_save'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/client.rb:288:in `run'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/application.rb:320:in `run_with_graceful_exit_option'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/application.rb:296:in `block in run_chef_client'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/local_mode.rb:42:in `with_server_connectivity'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/application.rb:279:in `run_chef_client'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/application/base.rb:330:in `run_application'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-15.8.23/lib/chef/application.rb:69:in `run'
/opt/chef/embedded/lib/ruby/gems/2.6.0/gems/chef-bin-15.8.23/bin/chef-client:25:in `<top (required)>'
/bin/chef-client:177:in `load'
/bin/chef-client:177:in `<main>'

Hope someone could quickly help. Thank you in advance!

kenochrome
  • 23
  • 3
  • **Please provide the contents of the stacktrace.out file if you file a bug report** Please edit your question and add the content of the stacktrace there. Without this, we can't help you either as we don't know what's wrong. – Holger Just Oct 15 '20 at 12:37
  • Sure thing, have updated the post and provided the stacktrace. – kenochrome Oct 15 '20 at 12:59

2 Answers2

0

In your template, you are referring to @group (which is an instance variable) rather than group (the local variable set by the each method. SInce this instance variable is not defined, it is assumed to be nil when you call each on it in line 30.

In templates, you usually only refer to data passed in with the variables attribute as instance variables. In your example, you could e.g. refer to @ rmq_host since you explicitly pass it in.

Other variables, especially block parameters for loops are referred to without a leading @ character since they are only local variables.

To fix your template, make sure to refer to the correct variables:

queueGroups:
 <% node['dynamic']['config']['queueGroup'].each do |group| %>
  <%= "" %>
  <% group.each do |key, value| %>
    <%if key == "groupName" %>
     - groupName:<%= value %>
    <% else %>
      <%= "#{key}=#{value}" %>
    <% end %>
  <% end %>
<% end %>
Holger Just
  • 52,918
  • 14
  • 115
  • 123
  • I am still getting the same problem. I have noticed that this works perfectly fine from a single cookbook but if I call something like `chef-client -z -n ` i experience the above error vs `chef-client -zr recipe[cookbook::recipe]` – kenochrome Oct 15 '20 at 15:18
0

There is a small error in reading the variables inside the template. When you need to reference node attributes or template variables @ is not required. Due to the prefix the attributes and variables are getting a nil value.

Only the variables passed from within variables() of a template resource need to be prefixed with @.

So then with these modifications, we will have a template temp.config.j2 like below:

queueGroups:
 <% node['dynamic']['config']['queueGroup'].each do |group| %>
  <%= "" %>
  <% group.each do |key, value| %>
    <%if key == "groupName" %>
     - groupName:<%= value %>
    <% else %>
      <%= "#{key}=#{value}" %>
    <% end %>
  <% end %>
<% end %>

Note that @ is not used before the node attribute, and group in group.each.

Or you could pass the ['dynamic']['config']['queueGroup'] as a variable in template.

template '/tmp/temp.config' do
  # rest of the declarations
  variables(
    dynamic_config_queuegroup: node['dynamic']['config']['queueGroup']
    # other variables
  )

Then use it in template like:

queueGroups:
 <% @dynamic_config_queuegroup.each do |group| %>
  <%= "" %>
  <% group.each do |key, value| %>
seshadri_c
  • 6,906
  • 2
  • 10
  • 24