Шеф-повар, как запустить шаблон, который создает сценарий init.d до создания службы - PullRequest
28 голосов
/ 30 марта 2012

Ниже мой шаблон для nginx.

Я столкнулся с проблемой 22. Мне нужно установить шаблон init.d. Итак, у меня есть шаблон nginx erb, который я помещаю в /etc/init.d/nginx.

Я даже пытался поместить код поверх рецепта. Рецепт зависит от файла init.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

При следующем запуске клиента chef все работает, потому что тогда был создан шаблон.

Как выполнить шаблон непосредственно перед тем, как зарегистрировать ресурс службы для nginx? Быстрое решение состоит в том, что я создаю рецепт, который будет запускать шаблон перед nginx, чтобы установить шаблон, но это кажется довольно абсурдным.

Этот шаблон должен быть установлен до регистрации службы.

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]
    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

Спасибо

Ответы [ 3 ]

45 голосов
/ 30 марта 2012

Вы можете установить действие на сервисе: ничего. Затем попросите шаблон уведомить службу для включения. Таким образом, шаблон будет обработан, а затем услуга будет включена:

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

Тогда служба будет ждать, пока шаблон будет обработан.

5 голосов
/ 12 декабря 2013
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 
0 голосов
/ 24 апреля 2013

Хотя использование notifies лучше в этом случае, в других случаях у вас нет такой роскоши. Вот как поручить Chef немедленно создать шаблон:

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)
...