Chef infra 与厨师动态食谱

Chef infra 与厨师动态食谱,chef-infra,Chef Infra,我试图创建一个解压一些文件的方法,然后行为取决于zipfile的内容。 但我不知道如何克服编译与收敛阶段 在执行配方之前,目录不存在,因此获取子目录的命令必须位于ruby块中,以便在运行时获取数据 但是一旦命令进入ruby块,我就无法“读取”变量或属性的新值 以下是一个示例: ruby_block 'update patch attributes' do block do OPatchPath="#{node[:oracle][:rdbms][:ora_home]}/OPatc

我试图创建一个解压一些文件的方法,然后行为取决于zipfile的内容。 但我不知道如何克服编译与收敛阶段

在执行配方之前,目录不存在,因此获取子目录的命令必须位于ruby块中,以便在运行时获取数据

但是一旦命令进入ruby块,我就无法“读取”变量或属性的新值

以下是一个示例:

ruby_block 'update patch attributes' do
   block do
      OPatchPath="#{node[:oracle][:rdbms][:ora_home]}/OPatch/#{Patch_No}"
      Subdir_list = Dir.glob("#{OPatchPath}/*/")

      Subdir_list.each do |dir|
         Subdir_list.map! {|dir| dir.sub("#{OPatchPath}/", "")}
         Subdir_list.map! {|dir| dir.sub('/', "")}
      end

      node.set[:oracle][:rdbms][:oracle_patch_list]=Subdir_list
   end
end

## if there are no directories with numberes 
if Subdir_list.find { |e| /^\d+$/ =~ e } == nil
   do something
else 
   if Subdir_list.count == 2
      do something else
   else
      do some other something
   end
end
我在网上做了深入的研究,并尝试了很多建议,包括使用lazy、node.set、node.default node.run_state而没有运气。 我错过了什么? 有什么建议吗


谢谢,Ofir.

这是一个编译与聚合的问题,您可以查看更详细的概述,但tl;dr是指ruby_块内的代码发生在ruby_块外的代码之后,即使这可能与文件中的顺序不匹配。您可能需要创建一个自定义资源。

您能举例说明如何使用自定义资源来解决此问题吗?我可以在ruby代码中使用自定义资源吗?