ubuntu – Chef’通知’无法重启或重新加载服务

我正在使用chef-solo v10.12.0来配置Ubuntu 12.04 VM,并且我一直遇到一个问题,即当配置文件发生变化时,服务不会按预期重新启动或重新加载.

日志中没有错误,尽管它显然正在执行配方中的所有其他操作.作为一种解决方法,每次配方执行时我都会手动重启服务或强制重新加载/重启,但我更愿意弄清楚出了什么问题,让它按预期工作.

一个无法按预期工作的示例配方:

package "pgbouncer"

cookbook_file "/etc/default/pgbouncer" do
    source "pgbouncer/pgbouncer"
    owner "root"
    group "root"
    mode 0644
end

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

cookbook_file "/etc/pgbouncer/userlist.txt" do
    source "pgbouncer/userlist.txt"
    owner "postgres"
    group "postgres"
    mode 0640
    notifies :restart, "service[pgbouncer]"
end

template "/etc/pgbouncer/pgbouncer.ini" do
    source "pgbouncer/pgbouncer.ini"
    owner "postgres"
    group "postgres"
    mode 0640
    variables :postgres_host => node[:postgres_host]
    notifies :restart, "service[pgbouncer]"
end
最佳答案
我要检查的第一件事是运行chef-client的用户有权启动/重启服务(通常不是问题).

接下来我会检查没有其他配方正在运行,这会抵消这个配方的逻辑(有时是问题,但不常见).

我真正想到的是导致你的问题是大厨处理它需要通过shell执行的队列的方式.对同一服务的多次和有些冲突的调用可能会导致意外行为(正如您已经看到的那样).默认情况下,所有“shell”调用都作为chef-client运行中收敛阶段的最后一部分处理.此外,厨师不保证任何特定的执行顺序,因此事情可能经常发生故障,并可能产生不良行为,具体取决于您正在操作的服务的软件.通常用下面的技术来克服这些就是你所需要的.

您的问题的快速和肮脏的答案是为您的通知调用添加:timer参数.
DOC:http://docs.opscode.com/resource_common.html#notifications-timers

这是上面示例代码的建议更新:

package "pgbouncer"

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

cookbook_file "/etc/default/pgbouncer" do
    source "pgbouncer/pgbouncer"
    owner "root"
    group "root"
    mode 0644
end

cookbook_file "/etc/pgbouncer/userlist.txt" do
    source "pgbouncer/userlist.txt"
    owner "postgres"
    group "postgres"
    mode 0640
    notifies :restart, "service[pgbouncer]", :immediately
end

template "/etc/pgbouncer/pgbouncer.ini" do
    source "pgbouncer/pgbouncer.ini"
    owner "postgres"
    group "postgres"
    mode 0640
    variables :postgres_host => node[:postgres_host]
    notifies :restart, "service[pgbouncer]", :immediately
end

这不是最有效的方法,因为它可能导致您的守护进程执行太多冗余操作(最多3’开始就像’一次运行中的’调用:启动,重启,重启).通过利用定义(DOC:http://docs.opscode.com/essentials_cookbook_definitions.html),厨师可以采用另一种更加OOP友好的方式.这本质上是您定义的pgbouncer服务资源的自定义包装器,用于降低执行冗余调用的低效率,同时确保它们有效执行,但我会留给您决定什么是最适合您的用例.

转载注明原文:ubuntu – Chef’通知’无法重启或重新加载服务 - 代码日志