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