与厨师的动态食谱

时间:2017-03-31 09:39:34

标签: chef

我试图创建一个解压缩一些文件的配方,然后行为取决于zipfile的内容。 但我无法想象如何克服Compile vs Converge阶段。

在执行配方之前目录不存在,因此获取子目录的命令必须位于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。

1 个答案:

答案 0 :(得分:0)

这是一个编译与收敛问题,您可以看到https://coderanger.net/two-pass/以获得更详细的概述,但是tl; dr是ruby_block中的代码发生在ruby_block之外的代码之后,即使它可能与在文件中订购。您可能需要制作自定义资源。