Chef - 从先前 运行 的状态跳过资源

Chef - Skip resources from status of previous run

对于服务器重建,我想根据之前 运行 的结果跳过我的食谱的某些部分。

例如,我们有启动 Weblogic 服务器的资源。

weblogic_server "server_name" do 
    action :start
end

这些初创公司在构建过程中花费了大量时间。如果在上次构建中 运行 成功,我想跳过这个,以避免重建等待太多。像这样:

weblogic_server "server_name" do 
    action :start
    not_if { it_was_run_successfully_during_the_previous_run }
end

我知道最好的方法是用脚本检查 weblogic 服务器的状态,但这取决于另一个团队,我需要一个临时解决方案。

我想到了一个 JSON 格式的日志文件来引用构建的不同步骤。

例如:

{
    "provisioning"          : true,
    "start_weblogic_servers : true,
    "configuring_ohs"       : false
}

在这种情况下,我将拥有此日志文件的模板资源,然后在 运行 期间更新值。然后在每个 运行 中我会先检查这个文件并根据我找到的值跳过正确的部分。

还有更好的方法吗?

我过去所做的只是创建一个空文件,如果它存在则跳过它 (not_if do ::File.exists?('/path/to/some_empty_file') end)。然后,当构建成功或不成功时,您可以使用一些代码来创建或删除这些文件,我意识到这可能不是最好的方法,但只要我记得它就对我有用。

如果你真的想要,那么你可以让一些脚本检查服务器状态(比如每隔 5 分钟),然后相应地调整那个空文件(通过删除或保留它)。

Nabeel Amjad 解决方案对我有用。请按照以下步骤操作:

使用 action :nothing

创建 file 资源
file '/tmp/logfile' do
    action: nothing
end

将您的资源设置为在 运行

之后通知 file 资源
weblogic_server 'server_name' do 
    action   :start
    notifies :create, 'file[/tmp/logfile]', :immediately
end

添加一个守卫 not_if,如果文件存在于服务器上,它将跳过此资源的未来执行

weblogic_server 'server_name' do 
    action   :start
    notifies :create, 'file[/tmp/logfile]', :immediately
    not_if   { ::File.exist?('/tmp/logfile') }
end