2013-07-14 11 views
7

Przechodzę przez samouczek szefa kuchni Peepcode, o ile dobrze. Z jakiegoś powodu wystąpił błąd podczas używania zmiennych szablonu. Przykład dotyczy nginx.Szablon szefa kuchni zmienna @node wydaje się rzucać błąd

W nginx/atrybutów/nginx.rb mam:

default[:nginx][:worker_processes] = 4 

W nginx.conf.erb szablonu odsyłam do:

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

Poniżej znajduje się błąd pojawia działa kucharz -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 

Pozostałe części wyjściu błędu:

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

Myślę, że ma to związek ze zmianami wprowadzonymi przez szefa kuchni 10 do 11 - atrybuty są traktowane nieco inaczej. Peepcode został stworzony przy pomocy szefa kuchni 10, wierzę, może spróbuje najpierw użyć szefa kuchni 10 i przejść na 11 później? – house9

Odpowiedz

6

Można uzyskać dostęp do zmiennych obiektu (te, które rozpoczynają się od @) w szablonach, jedynie jeśli przekazywane im przez variables metody szablonu tak:

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

następnie trzeba będzie @my_var dostępne w szablonie. Ale nie musisz przekazywać kodu node, ponieważ jest on już dostępny w szablonach. Musisz tylko uzyskać do niego dostęp, nie jako zmienną obiektową. Poniższy kod w szablonie powinien działać.

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

Wystarczy wyjąć @ z przodu node.

+0

w Chef 11 należy ustawić poziom priorytetu. to jest problem. Nie @ znaki lub zmienne szablonów. –

+1

Masz rację, Draco, przepraszam za moje zamieszanie. Moja maszyna wirtualna z jakiegoś powodu również nie odbierała poprawnych poprawek. usunięcie znaku @ działa teraz. –

2

Obiekt node nie jest dostępny za pośrednictwem zmiennej instancji (rzeczy zaczynającej się znakiem @). Zamiast tego jest to metoda w obecnym kontekście.

Zmiana:

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

do

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

Wskazówka usunięcie @ -znak? Potrzebujesz tylko znaku @ podczas przekazywania zmiennych do szablonu za pomocą parametru variables.

+0

Jak już powiedziałem, nie rozwiązuje to problemu; Problem polega na tym, że w Chef 11 poziom pierwszeństwa musi być ustawiony jako –

+0

z jakiegoś dziwnego powodu, który wydaje się działać teraz tak, jak powiedziałeś. To, co czytałem w notatkach do wydania, dotyczyło niejawnych zapisów, a nie czyta. A więc jedzenie z pokornego ciasta po pewnym opóźnieniu. –

+2

Odpowiedź Setha zadziałała dla mnie. Pomijając, pomyłkowo użyłem '<% = ...' zamiast '<% ​​= ...". –

Powiązane problemy