如果Chef资源退出失败,如何设置适当的保护措施?

时间:2018-08-23 19:32:13

标签: chef

我想应用一个新的httpd配置文件,然后重新加载它。但是,我想在重新加载httpd之前运行“ apachectl configtest(httpd -t)”以确认所有配置看起来都不错。

我已经使用cookbook_file资源安装了配置文件,并且仅在主机上存在httpd / conf.d目录的情况下安装:

cookbook_file '/etc/httpd/conf.d/web.conf' do
    action :create
    source 'web.conf'
    owner 'root'
    group 'root'
    mode '0640'
    only_if { ::Dir.exist?("/etc/httpd/conf.d/") || !::File.symlink?("/etc/httpd/conf.d/") }
notifies :action, 'resource[apache_configtest], immediate'
end

在重新加载httpd服务之前,我要执行apache配置测试以确认所有配置均已通过验证:

execute 'apache_configtest' do
    command '/usr/sbin/apachectl configtest'
    notifies :action, 'resource[httpd], immediate'
end

service 'httpd' do
    subscribes :reload, 'file[/etc/httpd/conf.d/]', :immediately
    not_if <apache_configtest exit fails or only_if it passes>
end

如何根据资源的退出代码设置适当的防护?

2 个答案:

答案 0 :(得分:2)

apache2 cookbook中使用的另一个选项是在服务资源上配置防护措施,以在配置错误时不采取任何措施:

代码如下:

service 'apache2' do
  service_name apache_platform_service_name
  supports [:start, :restart, :reload, :status]
  action [:enable, :start]
  only_if "#{apache_binary} -t", environment: { 'APACHE_LOG_DIR' => node['apache']['log_dir'] }, timeout: node['apache']['httpd_t_timeout']
end

因此,当您通知服务重新启动(例如)时,它将首先测试only_if防护,此处将其归结为apache2ctl -t,如果命令以非0退出,则该操作不会发生,并且当前状态被保留。

另一方面,对于apache配置之类的常见问题,我强烈建议您使用社区食谱(在https://supermarket.chef.io上进行搜索)而不是自己动手编写书,这样可以节省大量时间,而无需重新发明轮子。

答案 1 :(得分:1)

您的食谱文件应通知执行:

PKCS1_v1_5

出于与服务相同的原因,execute应该将cookbook_file '/etc/httpd/conf.d/logs/web.conf' do mode '0640' only_if { ::Dir.exist?("/etc/httpd/conf.d/logs/") || !::File.symlink?("/etc/httpd/conf.d/logs/") } notifies :run, 'execute[apache_configtest]', :immediate end 作为操作,并应在服务上调用:nothing如果configtest失败,则不会发送通知。但是,此时配置将更改

:restart

您不需要任何服务保护措施,只需要执行操作execute 'apache_configtest' do command '/usr/sbin/apachectl configtest' action :nothing notifies :restart, 'service[httpd]', :immediately end ,即可确保服务资源在收到通知之前不会做任何事情:

:nothing

总而言之。如果您的配置更改,cookbook_file将通知configtest,如果成功,则服务将重新启动。