2012-03-30 22 views
26

Dưới đây là templete của tôi cho nginx.Đầu bếp, cách chạy mẫu tạo tập lệnh init.d trước khi dịch vụ được tạo

Tôi đang đối mặt với giao lộ 22. Tôi cần cài đặt mẫu init.d. Vì vậy, tôi có một mẫu nginx erb mà tôi đặt trong /etc/init.d/nginx.

Tôi thậm chí đã thử đặt mã lên trên công thức. Công thức phụ thuộc vào file init.d nhưng nó không exectued cho đến khi nó là quá muộn và kết quả là tôi nhận được lỗi này:

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 

Trên đường chạy trốn tiếp theo của khách hàng đầu bếp, mọi thứ hoạt động bởi vì sau đó các templete là tạo.

Làm cách nào để thực thi mẫu ngay trước khi tôi đăng ký tài nguyên dịch vụ cho nginx? Một sửa chữa nhanh chóng là tôi tạo ra một công thức mà sẽ chạy các mẫu trước khi nginx để cài đặt các mẫu nhưng điều đó có vẻ khá vô lý.

Tempate này cần phải được cài đặt trước khi dịch vụ được đăng ký.

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

Sau đó đăng ký máy chủ.

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 

Cảm ơn

Trả lời

44

Bạn có thể thiết lập các hành động trên các dịch vụ để: không có gì. Sau đó, có mẫu thông báo cho dịch vụ để kích hoạt. Bằng cách đó, mẫu sẽ được xử lý và sau đó dịch vụ sẽ được bật:

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 

Sau đó, dịch vụ sẽ đợi cho đến khi mẫu được xử lý.

+4

Nếu tài nguyên mẫu quyết định rằng nó không cần phải thực hiện (ví dụ: nếu các tập tin sẽ không được thay đổi) thì 'notifies' không xảy ra. Vì vậy, với cách tiếp cận này có thể, tùy thuộc vào ứng dụng của bạn, rằng dịch vụ của bạn sẽ không bao giờ được thiết lập hoặc bắt đầu ngay cả khi ứng dụng của bạn được thiết lập đầy đủ và sẵn sàng hoạt động. – wberry

+0

vì vậy để có được xung quanh mà bạn sẽ có một "dịch vụ" nginx "do..' gọi bên dưới các cuộc gọi mẫu mà không một' hành động: bắt đầu' phải không? Đó có phải là cách ưu tiên để xử lý vấn đề có thể bạn vạch ra hoặc có cách nào duyên dáng hơn không? – red888

-2

Trong khi sử dụng notifies thì tốt hơn trong trường hợp này, trong các trường hợp khác bạn không có sự sang trọng đó. Dưới đây là cách hướng dẫn cho đầu bếp để tạo ra các mẫu ngay:

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

Lý do điều này không được khuyến khích là việc gọi phương thức 'run_action' của tài nguyên thực thi tài nguyên đó trước các tài nguyên và thậm chí các thuộc tính nút được định nghĩa đầy đủ *. Điều này có thể dẫn đến các vấn đề thực sự kỳ quái. – wberry

+0

Điều này là rất nản lòng. Nó sẽ làm cho tài nguyên mẫu được thực hiện tại thời gian biên dịch thay vì thời gian hội tụ, vì vậy nó sẽ chạy trước tất cả các tài nguyên khác, bao gồm tài nguyên trong sách dạy nấu ăn và công thức nấu ăn đến trước trong danh sách chạy. Biên dịch thời gian thực hiện là cần thiết cho chef_gem để cài đặt trước khi ruby ​​'yêu cầu' dòng được đánh giá và do đó cần thiết cho xây dựng-yếu tố cần thiết để cài đặt trước khi chef_gems được chạy. Ngoài những trường hợp sử dụng mà bạn bị ép buộc, thời gian biên dịch không bao giờ được sử dụng. – 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 
Các vấn đề liên quan