2012-03-30 6 views
26

A continuación se muestra mi templete para nginx.Chef, cómo ejecutar una plantilla que crea una secuencia de comandos init.d antes de que se cree el servicio

Estoy frente a una captura 22. Necesito instalar una plantilla init.d. Así que tengo una plantilla nginx erb que coloco en /etc/init.d/nginx.

I Incluso intenté colocar el código en la parte superior de la receta. La receta depende del archivo de init.d pero no es exectued hasta que es demasiado tarde y como resultado me sale este error:

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 

En la siguiente ejecución del cliente cocinero, las cosas funcionan porque entonces el templete fue creado.

¿Cómo ejecuto una plantilla inmediatamente antes de registrar el recurso de servicio para nginx? Una solución rápida es que creo una receta que ejecutará la plantilla antes de nginx para instalar la plantilla, pero parece bastante absurdo.

Este tempate debe instalarse antes de que se registre el servicio.

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

A continuación, registre el servidor.

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 

Gracias

Respuesta

44

Puede configurar la acción en el servicio a: nada. Luego haga que la plantilla notifique al servicio para que lo habilite. De esta forma se procesará la plantilla y luego se habilitará el servicio:

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 

Luego el servicio esperará hasta que la plantilla haya sido procesada.

+4

Si el recurso de plantilla decide que no necesita ejecutar (es decir, si el archivo no se puede cambiar) entonces los 'notifies' no lo hacen ocurrir. Por lo tanto, con este enfoque es posible, dependiendo de su aplicación, que su servicio nunca se configure o inicie incluso con su aplicación completamente configurada y lista para funcionar. – wberry

+0

, para evitar eso tendrías otra llamada de "servicio" nginx "do..' debajo de la llamada de plantilla que hace una acción' iniciar' ¿no? ¿Es esa la forma preferida de manejar el posible problema que describió o hay una manera más elegante? – red888

-2

Al usar notifies es mejor en este caso, en otros casos no tiene ese lujo. Así es como para instruir cocinero para crear la plantilla de inmediato:

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

La razón por la que no se recomienda es que invocar el método 'run_action' de un recurso ejecuta ese recurso antes de que los recursos e incluso los atributos del nodo estén completamente * definidos *. Esto podría conducir a problemas verdaderamente extraños. – wberry

+0

Esto es altamente desaconsejado. Causará que el recurso de plantilla se ejecute en tiempo de compilación en lugar de tiempo de convergencia, por lo que se ejecutará antes que todos los demás recursos, incluidos los recursos de los libros de cocina y recetas que vienen antes de esto en la lista de ejecución. La ejecución del tiempo de compilación es necesaria para que chef_gem se instale antes de que se evalúen las líneas de ruby ​​'require' y, por lo tanto, sea necesario que se instale build-essentials antes de ejecutar chef_gems. Fuera de los casos de uso en los que se le obliga a hacerlo, el tiempo de compilación nunca debe ser utilizado. – 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 
Cuestiones relacionadas