厨师模板变量@node似乎抛出错误

时间:2013-07-14 17:59:37

标签: ruby-on-rails variables chef chef-solo

我正在通过peepcode的Chef教程,到目前为止一切顺利。由于某种原因,使用模板变量时出现故障。这个例子是针对nginx的。

在nginx / attributes / nginx.rb中我有:

default[:nginx][:worker_processes] = 4

在nginx.conf.erb模板中,我引用:

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

以下是我运行大厨独奏的错误:

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

错误输出的其他部分:

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

2 个答案:

答案 0 :(得分:6)

您可以在模板中访问对象变量(以@开头的变量),只有当您通过variables模板方法传递它们时才会这样:

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

然后您将在模板中提供@my_var。但您不必传递node,因为它已在模板中提供。您只需要将其作为对象变量访问它。模板中的以下代码应该有效。

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

只需从@前面删除node

答案 1 :(得分:2)

无法通过实例变量(以@符号开头的东西)访问node对象。相反,它是当前环境中的一种方法。

变化:

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

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

注意删除@ -sign?通过variables参数将变量传递给模板时,只需要@ -sign。