2012-03-30 10 views
26

Poniżej znajduje się moje templete dla nginx.Szef kuchni, jak uruchomić szablon, który tworzy skrypt init.d zanim usługa zostanie utworzona

Mam do czynienia z hakiem 22. Potrzebuję zainstalować szablon init.d. Więc mam szablon erb nginx, który umieszczam w /etc/init.d/nginx.

Próbowałem nawet umieścić kod na górze receptury. Przepis jest zależny od pliku init.d ale jej nie exectued dopóki nie jest za późno iw rezultacie otrzymuję ten błąd:

STDERR: update-rc.d: /etc/init.d/nginx: file does not exist 
---- End output of "bash" "/tmp/chef-script20120330-26326-3ologp-0" ---- 
Ran "bash" "/tmp/chef-script20120330-26326-3ologp-0" returned 1 
[Fri, 30 Mar 2012 06:22:15 +0000] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out 
[Fri, 30 Mar 2012 06:22:15 +0000] ERROR: Sleeping for 60 seconds before trying again 

Na następnej perspektywie klienta kucharz, wszystko działa, bo wtedy był templete stworzony.

Jak wykonać szablon natychmiast przed zarejestrowaniem zasobu usługi dla nginx? Szybką poprawką jest to, że tworzę recepturę, która uruchomi szablon przed nginxem, aby zainstalować szablon, ale wydaje się to raczej absurdalne.

Ten tempate należy zainstalować przed zarejestrowaniem usługi.

template "nginx" do 
     path "/etc/init.d/nginx" 
     source "nginx.erb" 
     owner "root" 
     group "root" 
     mode "0755" 
    end 

Następnie zarejestruj serwer.

service "nginx" do 
     supports :restart => true, :start => true, :stop => true, :reload => true 
     action [ :enable, :start] 
    end 







#################################### 
#Install Nginx 
#################################### 
#http://wiki.nginx.org/HttpLuaModule#Installation 
version = node[:nginx][:version] 
package "libpcre3" do 
    action :install 
end 
package "libpcre3-dev" do 
    action :install 
end 
package "libpcre++-dev" do 
    action :install 
end 
package "openssl" do 
    action :install 
end 

template "nginx" do 
    path "/etc/init.d/nginx" 
    source "nginx.erb" 
    owner "root" 
    group "root" 
    mode "0755" 
end 

#mkdir /var/log/nginx 
directory "/var/log/nginx" do 
    owner "root" 
    group "root" 
    mode "0755" 
    action :create 
    #not_if "test -f /etc/nginx/lock" 
end 

remote_file "/tmp/nginx-#{version}.tar.gz" do 
    source "http://nginx.org/download/nginx-#{version}.tar.gz" 
    checksum node[:nginx][:checksum] 
    action :create_if_missing 
    notifies :run, "bash[install_nginx]", :immediately 
end 


bash "install_nginx" do 
    user "root" 
    cwd "/tmp" 
    code <<-EOH 
    tar -xvf nginx-#{version}.tar.gz 
    cd nginx-#{version} 
    ./configure --with-http_stub_status_module 
    make -j2 
    make install 
    ln -s /usr/local/nginx/conf/ /etc/nginx 
    /usr/sbin/update-rc.d -f nginx defaults 
    EOH 
    action :nothing 
    creates "/usr/sbin/nginx" 
    notifies :restart, "service[nginx]" 
    #not_if "test -f /etc/redis/lock" 
end 


service "nginx" do 
    supports :restart => true, :start => true, :stop => true, :reload => true 
    action [ :enable, :start] 
end 

#ln -s /usr/local/nginx/conf/ /etc/nginx 
#link "/usr/local/nginx/conf/" do 
# to "/etc/nginx" 
# link_type :hard 
#end 

link "/usr/local/nginx/logs/access.log" do 
    to "/var/log/nginx/access.log" 
end 

link "/usr/local/nginx/logs/error.log" do 
    to "/var/log/nginx/error.log" 
end 

file "/etc/nginx/lock" do 
    owner "root" 
    group "root" 
    mode "0755" 
    action :create_if_missing 
end 

template "nginx.conf" do 
    path "/etc/nginx/nginx.conf" 
    source "nginx.conf.erb" 
    owner "root" 
    group "root" 
    mode "0644" 
    #notifies :reload, "service[nginx]" 
    notifies :reload, resources(:service => "nginx"), :immediately 
end 

Dzięki

Odpowiedz

44

Można ustawić działanie na służbie: niczego. Następnie poproś szablon o powiadomienie usługi, aby umożliwić. W ten sposób szablon zostanie przetworzony, a następnie usługa zostanie włączona:

service "nginx" do 
    supports :restart => true, :start => true, :stop => true, :reload => true 
    action :nothing 
end 

template "nginx" do 
    path "/etc/init.d/nginx" 
    source "nginx.erb" 
    owner "root" 
    group "root" 
    mode "0755" 
    notifies :enable, "service[nginx]" 
    notifies :start, "service[nginx]" 
end 

Następnie usługa będzie czekać, aż szablon zostanie przetworzony.

+4

Jeśli zasób szablon zdecyduje, że nie potrzebuje do wykonania (czyli jeśli plik nie zostanie zmieniona) wówczas 'notifies' nie zdarzyć. Dzięki takiemu podejściu, w zależności od aplikacji, możliwe jest, że twoja usługa nigdy nie zostanie skonfigurowana lub uruchomiona, nawet jeśli aplikacja jest w pełni skonfigurowana i gotowa do użycia. – wberry

+0

, więc aby obejść, będziesz miał kolejne 'service" nginx "do..' wywołanie poniżej wywołania szablonu, które robi' action: start' w prawo? Czy jest to preferowany sposób radzenia sobie z możliwym problemem, który nakreśliłeś, czy jest bardziej wdzięczny? – red888

-2

Podczas korzystania z notifies jest lepiej w tym przypadku, w innych przypadkach nie masz tego luksusu. Oto jak instruować Chef stworzyć szablon natychmiast:

tpl = template "nginx" do 
    action :nothing 
    path "/etc/init.d/nginx" 
    source "nginx.erb" 
    owner "root" 
    group "root" 
    mode "0755" 
end 
tpl.run_action(:create) 
+2

Powód, dla którego nie jest to zalecane, polega na tym, że wywołanie metody 'run_action' zasobów powoduje, że zasób przed zasobami, a nawet atrybuty węzłów, jest w pełni * zdefiniowany *. Może to prowadzić do naprawdę dziwnych problemów. – wberry

+0

To jest bardzo odradzane. Spowoduje to, że zasób szablonu zostanie wykonany w czasie kompilacji zamiast czasu konwergencji, więc będzie działał przed wszystkimi innymi zasobami, w tym zasobami w książkach kucharskich i recepturami, które pojawią się wcześniej na liście uruchamiania. Wykonanie kompilacji jest konieczne, aby chef_gem został zainstalowany, zanim ruby ​​"wymaga" linii zostaną ocenione, a zatem niezbędne do zainstalowania niezbędnych elementów przed uruchomieniem programu chef_gems. Poza tymi przypadkami użycia, w których jest się do tego zmuszonym, nigdy nie należy używać czasu kompilacji. – lamont

4
template "nginx" do 
    path "/etc/init.d/nginx" 
    source "nginx.erb" 
    owner "root" 
    group "root" 
    mode "0755" 
end 

service "nginx" do 
    supports :restart => true, :start => true, :stop => true, :reload => true 
    action [ :enable, :start ] 
    subscribes :restart, "template[nginx]", :immediately 
end 
Powiązane problemy