Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

chef template variable @node seems to throw error

I'm going through peepcode's Chef tutorial, so far so good. For some reason there is a failure when using template variables. The example is for nginx.

In the nginx/attributes/nginx.rb I have:

default[:nginx][:worker_processes] = 4

In the nginx.conf.erb template I refer to:

worker_processes  <%= @node[:nginx][:worker_processes] %>;

Below is the error I get running chef-solo:

Template Context:
-----------------
on line #2
  1: user www-data;
  2: worker_processes  <%= @node[:nginx][:worker_processes] %>;
  3: 
  4: error_log  /var/log/nginx/error.log;
  5: pid        /var/run/nginx.pid;


[2013-07-14T19:46:36+02:00] ERROR: Running exception handlers
[2013-07-14T19:46:36+02:00] ERROR: Exception handlers complete
Chef Client failed. 0 resources updated
[2013-07-14T19:46:36+02:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
[2013-07-14T19:46:36+02:00] FATAL: Chef::Mixin::Template::TemplateError: undefined method `[]' for nil:NilClass

Other part of the error output:

Starting Chef Client, version 11.4.4
Compiling Cookbooks...
Converging 3 resources
Recipe: nginx::default
  * package[nginx] action install (up to date)
  * service[nginx] action enable (up to date)
  * service[nginx] action start (up to date)
  * template[/etc/nginx/nginx.conf] action create
================================================================================
Error executing action `create` on resource 'template[/etc/nginx/nginx.conf]'
================================================================================


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


Resource Declaration:
---------------------
# In /cookbooks/nginx/recipes/default.rb

  8: template "/etc/nginx/nginx.conf" do
  9:    notifies :reload, "service[nginx]"
 10: end



Compiled Resource:
------------------
# Declared in /cookbooks/nginx/recipes/default.rb:8:in `from_file'

template("/etc/nginx/nginx.conf") do
  provider Chef::Provider::Template
  action "create"
  retries 0
  retry_delay 2
  path "/etc/nginx/nginx.conf"
  backup 5
  source "nginx.conf.erb"
  cookbook_name :nginx
  recipe_name "default"
end
like image 462
Michael K Madison Avatar asked Jul 14 '13 17:07

Michael K Madison


2 Answers

You can access object variables (the ones that start with @) in templates, only if you passed them through variables method of template like that:

template("/etc/nginx/nginx.conf") do
  [...]
  variables( :my_var => node )
  [...]
end

Then you will have @my_var available in template. But you don't have to pass the node, because it is already available in templates. You just have to access it not as an object variable. The following code in template should work.

<%= node[:nginx][:worker_processes] %>

Just remove the @ from the front of node.

like image 68
Draco Ater Avatar answered Oct 02 '22 18:10

Draco Ater


The node object is not accessible via an instance variable (the thing starting with an @ sign). Instead, it is a method in the current context.

Change:

<%= @node[:nginx][:worker_processes] %>

to

<%= node[:nginx][:worker_processes] %>

Notice the removal of the @-sign? You only need the @-sign when passing in variables to the template via the variables parameter.

like image 43
sethvargo Avatar answered Oct 02 '22 19:10

sethvargo