2013-07-14 21 views
7

Sto passando attraverso il tutorial di peepcode's Chef, finora tutto bene. Per qualche ragione c'è un errore quando si usano le variabili del modello. L'esempio è per nginx.variabile template chef @node sembra lanciare l'errore

Negli nginx/attributi/nginx.rb ho:

default[:nginx][:worker_processes] = 4 

Nel modello nginx.conf.erb mi riferisco a:

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

Di seguito è l'errore che ottengo in esecuzione cuoco -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 

Altra parte dell'output errore:

0.123.
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 
+0

Penso che questo abbia a che fare con i cambiamenti da chef 10 a 11 - gli attributi sono gestiti in modo leggermente diverso. I peepcode sono stati creati utilizzando lo chef 10, credo, potremmo provare a utilizzare lo chef 10 all'inizio e passare a 11 in seguito? – house9

risposta

6

È possibile accedere a variabili oggetto (quelli che iniziano con @) nei modelli, solo se li avete attraversato variables metodo modello del genere:

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

allora si avrà @my_var disponibile in modello. Ma non è necessario passare lo node, perché è già disponibile nei modelli. Devi solo accedervi non come una variabile oggetto. Il seguente codice nel modello dovrebbe funzionare.

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

è sufficiente rimuovere la @ dalla parte anteriore della node.

+0

in Chef 11 deve essere impostato un livello di precedenza. questo è il problema Non @ segni o variabili del modello. –

+1

Hai ragione Draco, mi dispiace per la mia confusione. Anche la mia macchina virtuale per qualche motivo non stava raccogliendo le modifiche correttamente. la rimozione del simbolo @ ora funziona. –

2

L'oggetto node non è accessibile tramite una variabile di istanza (la cosa che inizia con un segno @). Invece, è un metodo nel contesto attuale.

Cambio:

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

a

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

Avviso la rimozione del simbolo @? Hai solo bisogno del simbolo @ quando passi le variabili al modello tramite il parametro variables.

+0

Come ho detto sopra, questo non risolve il problema; il problema è che in Chef 11 un livello di precedenza deve essere impostato come –

+0

per qualche strano motivo che sembra funzionare ora come dichiarato. Quello che stavo leggendo nelle note di rilascio riguardava le scritture implicite, non le letture. Quindi, mangiare da umile torta dopo qualche ritardo. –

+2

La risposta di Seth ha funzionato per me. Per inciso, ho erroneamente usato '<% = ...' piuttosto che '<% = ...'. –