Pergunta

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
Foi útil?

Solução

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.

Outras dicas

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top