等到Chefs编译阶段结束才运行代码块?

时间:2015-06-10 07:07:55

标签: chef

我想检查配方中resource_collection的内容,看看在节点运行期间是否正在调用特定的LWRP。但是由于编译加载逻辑和菜谱名称排序等等,很难做到这样的事情:

if run_context.resource_collection.any?{|r| r.resource_name.to_s == 'my_lwrp_resource'}

    template "/tmp/example.rb" do
      source      "test.erb"
      action      :nothing
    end.run_action(:create)

end

因为在将所有资源添加到resource_collection之前可能会运行此代码。

有没有办法在编译阶段结束之前推迟运行此代码,以确保完全填充resource_collection并且查询将正确查找资源?

感谢

1 个答案:

答案 0 :(得分:1)

您可以定义将在收敛期间执行的ruby_block资源。您无法访问配方DSL,使用DSL定义模板资源,但在ruby中定义模板资源同样容易:

ruby_block 'run_my_template_resource' do
  action :create
  block do
    r = Chef::Resource::Template.new('template_name', run_context)
    r.path       '/path/to/write.to'
    r.source     'source.erb'
    r.cookbook   'cookbook-name'
    r.owner      'root'
    r.group      'root'
    r.mode       00600
    r.variables  my: 'variables'
    r.run_action :create
  end
end