首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Chef LWRP -defs/资源执行顺序

Chef LWRP -defs/资源执行顺序
EN

Stack Overflow用户
提问于 2013-05-14 21:28:47
回答 1查看 1.6K关注 0票数 1

我在LWRP中有以下代码,它所做的就是分解一个.ear文件:

代码语言:javascript
复制
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

当我运行这个Chef Vagrant provide/时,输出显示/using并行地启动'expand_ear‘和'expand_wars’。因此,expand_wars定义无法找到仍在提取的所有.wars /they。我尝试将'expand_ear‘设置为布尔值,并将'expand_wars’包装在:

代码语言:javascript
复制
if expand_ear?(src,dest) 
   expand_war 
end

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-18 15:01:44

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

如果看到纯ruby代码,则执行

  1. 。如果看到资源定义,则执行
  2. ,编译后放入资源集合中。

您的问题是,expand_ear中的代码会被编译-因为它是一种资源,而explode_wars中的代码会立即执行-因为它是纯ruby。有两种可能的解决方案:

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

代码语言:javascript
复制
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 -因此将被执行而不是编译。

将explode_wars中的ruby代码放入ruby_block资源中。

代码语言:javascript
复制
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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16544534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档