厨师LWRP - defs /资源执行顺序

时间:2013-05-14 13:28:47

标签: chef vagrant

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

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

1 个答案:

答案 0 :(得分:2)

Chef run由两个阶段组成,编译执行。在第一阶段,厨师通过食谱和:

  1. 如果它看到纯粹的ruby代码 - 它会被执行。
  2. 如果它看到资源定义 - 它被编译并放入资源集合中。
  3. 你的问题是expand_ear中的代码被编译 - 因为它是一个资源,但explode_wars中的代码会立即被执行 - 因为它是纯粹的红宝石。有两种可能的解决方案:

    更改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 将您在rubde_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
    

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