厨师LWRP - DEFS /资源执行顺序(Chef LWRP - defs/resources

2019-10-18 03:56发布

我已经在LWRP以下,它是所有爆炸的.ear文件::

action :expand do
    ear_folder = new_resource.target_folder
    temp_folder = "#{::File.join(ear_folder, 'tmp_folder')}"

    expand_ear(new_resource.source, ear_folder)
    expand_wars(ear_folder,temp_folder)

end

def expand_ear(src,dest)
   bash "unzip EAR" do
     cwd dest
     code <<-EOF
     pwd
     ls -l
     jar -xvf #{src}         
     EOF
   end
end

def explode_wars(src,dest)
    Dir.glob("#{basepath}/*.war") do |file|
           ......... ###crete tmp folder, move .war there then unzip it to 'dest'
        end
end

当我运行这个/使用流浪提供/输出显示开始厨师“expand_ear”和并联“expand_wars”。 作为结果,expand_wars高清未能找到所有.wars /他们仍然被提取。 我试图在做“expand_ear”布尔和包裹“expand_wars”:

if expand_ear?(src,dest) 
   expand_war 
end

但这产生同样的结果???。

Answer 1:

厨师运行由2个阶段, 编译执行 。 在第一阶段的厨师经过配方和:

  1. 如果看到纯Ruby代码 - 它被执行。
  2. 如果看到资源定义 - 它被编译并投入资源集合。

你的问题是,在代码expand_ear被编译-因为它是一个资源,但在代码explode_wars马上被执行-因为它是纯Ruby。 有2个可能的解决方案:

更改expand_ear动态定义的bash资源:

res = Chef::Resource::Bash.new "unzip EAR", run_context
res.cwd dest
res.code <<-EOF
  pwd
  ls -l
  jar -xvf #{src}         
  EOF
res.run_action :run

这是纯粹的红宝石 - 因此将被执行,而不是编译。

OR放在explode_wars Ruby代码为ruby_block资源。

ruby_block do
  block do
    Dir.glob("#{basepath}/*.war") do |file|
       ......... ###crete tmp folder, move .war there then unzip it to 'dest'
    end
  end
end

这样,它也将被编译,并且仅在第二阶段执行。



文章来源: Chef LWRP - defs/resources execution order
标签: chef vagrant