1

我在 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

当我运行此/使用 Vagrant 提供/时,输出显示 Chef 并行启动了“expand_ear”和“expand_wars”。结果,expand_wars def 无法找到所有 .wars /它们仍在被提取。我尝试将“expand_ear”设为布尔值并将“expand_wars”包装在:

if expand_ear?(src,dest) 
   expand_war 
end

但这会产生相同的结果。???

4

1 回答 1

2

Chef run包含 2 个阶段,编译执行。在第一阶段,厨师会检查食谱并:

  1. 如果它看到纯 ruby​​ 代码 - 它会被执行。
  2. 如果它看到资源定义 - 它被编译并放入资源集合中。

您的问题是代码 inexpand_ear被编译 - 因为它是一种资源,但代码 inexplode_wars被立即执行 - 因为它是纯 ruby​​。有两种可能的解决方案:

更改您的 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

这是纯 ruby​​ - 因此将被执行而不是编译。

或者将您的 ruby​​ 代码放入 explode_wars 到 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

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

于 2013-05-18T07:01:44.350 回答