Chef infra 如果厨师长资源退出失败,如何设置适当的防护?

Chef infra 如果厨师长资源退出失败,如何设置适当的防护?,chef-infra,Chef Infra,我想应用一个新的httpd配置文件,然后重新加载它。但是,在重新加载httpd之前,我想运行一个“apachectl configtest(httpd-t)”来确认所有配置看起来都很好 我将配置文件与cookbook_文件资源一起安装,并且仅在主机上存在httpd/conf.d目录时安装: cookbook_file '/etc/httpd/conf.d/web.conf' do action :create source 'web.conf' owner 'root'

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

我将配置文件与cookbook_文件资源一起安装,并且仅在主机上存在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
执行'apache_configtest'do
命令'/usr/sbin/apachectl configtest'
通知:操作“资源[httpd],立即”
结束
服务“httpd”do
订阅:重新加载,'file[/etc/httpd/conf.d/],:立即
如果没有
结束

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

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

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
和execute应该将
:nothing
作为操作,原因与服务相同,并且应该调用服务上的
:restart
如果configtest失败,则不会发送通知。但是,此时将更改配置

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

service "httpd" do
  action :nothing
end

总而言之。若您的配置发生更改,cookbook_文件将通知configtest,若成功,服务将重新启动

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

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
和execute应该将
:nothing
作为操作,原因与服务相同,并且应该调用服务上的
:restart
如果configtest失败,则不会发送通知。但是,此时将更改配置

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

service "httpd" do
  action :nothing
end

总而言之。若您的配置发生更改,cookbook_文件将通知configtest,若成功,服务将重新启动

中使用的另一个选项是将服务资源上的防护配置为在配置错误时不采取任何操作:

代码如下:

因此,当您通知服务重新启动(例如)时,它首先测试only_if-guard,它在这里被分解为
apache2ctl-t
,如果命令以非0退出,则操作不会发生,并且当前状态保持不变


另一方面,对于常见的apache配置,我强烈建议您使用社区烹饪书(搜索),而不是自己动手,这样您就可以节省大量时间,而不必重新发明轮子。

中使用的另一个选项是在服务资源上配置卫士,以便在配置错误时不采取任何行动:

代码如下:

因此,当您通知服务重新启动(例如)时,它首先测试only_if-guard,它在这里被分解为
apache2ctl-t
,如果命令以非0退出,则操作不会发生,并且当前状态保持不变


另一方面,对于常见的apache配置,我强烈建议您使用社区烹饪书(搜索),而不是自己动手,这样您就可以节省大量时间,不必重新发明轮子。

很有可能我甚至没有正确使用/理解警卫。如果是这样的话,我不介意任何关于正确流程的输入。据我所知,每个资源都是线性执行的,所以apache_configtest资源不是以任何方式运行的,还是仅在运行时才运行,因为它是在cookbook_文件资源中声明的?您应该将您的问题包括在这篇评论中,很可能我甚至没有正确使用/理解这些防护。如果是这样的话,我不介意任何关于正确流程的输入。据我所知,每个资源都是线性执行的,所以apache_configtest资源不会以任何方式运行,或者只在运行时运行,因为它在cookbook_文件资源中有说明?您应该将您的问题包括在这个注释中。谢谢您的回答。不幸的是,在这个用例场景中,apache cookbook不是一个选项。然而,它提供了一个很好的信息来源,我完全忘记了调查。我很想知道为什么它不是一个选项。谢谢你的回复。不幸的是,在这个用例场景中,apache cookbook不是一个选项。然而,它提供了一个很好的信息来源,我完全忘记了调查。我很想知道为什么它不是一个选项。谢谢你的解释。将动作设置为:nothing,并调用它是我一直在寻找的答案之一。你用一个非常有帮助的详细回答结束了我的问题。干杯谢谢你的解释。将动作设置为:nothing,并调用它是我一直在寻找的答案之一。你用一个非常有帮助的详细回答结束了我的问题。干杯