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