我想应用一个新的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
如何根据资源的退出代码设置适当的防护?
答案 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,如果成功,则服务将重新启动。