Chef - 如何编写包含DSL的自定义资源,用于"执行"

时间:2016-09-14 11:04:01

标签: chef chef-recipe chatops

我写了一个厨师definition,发布到我们的聊天服务器。

由于不再推荐定义,如何将其重写为资源?我对如何使用" event"特别感兴趣触发代码的方法。

档案chat\definitions\post.rb

define :chat_post do

  chat_url = 'https://chat.our.company/hooks/abcdef1234567890'
  message = params[:name]

  execute "echo" do
    command "curl -m 5 -i -X POST -d \"payload={"text": "#{message}"\" #{chat_url}"
    ignore_failure true
  end
end

调用食谱中的代码:

artifacts.each do |artifactItem|
  # deploy stuff
  # ...

  chat_post "#{node['hostname']}: Deployed #{artifact_name}-#{version}"
end

现在,我已经阅读了厨师文档并尝试了各种事情(确切地说:Modulelibraryresource)并阅读有关chef custom resources的文档但是没有成功。

有人可以指导我:如何将此代码转换为resource,如果这是正确的方法(厨师12.6+)?

我很高兴知道

  • 食谱中的食谱资源去哪里(chat/recipes或其他地方?)
  • 代码的外观(从我上面的定义转换)
  • 如何调用新代码(来自另一个食谱),我是否需要任何包含

1 个答案:

答案 0 :(得分:3)

来自the custom_resource doc这样的事情应该做(未经测试):

chat/resources/message.rb中的

property :chat_url, String, default: 'https://chat.our.company/hooks/abcdef1234567890'
property :message, String, name_property: true

action :send
  execute "echo #{message}" do
    command "curl -m 5 -i -X POST -d \"payload={"text": "#{message}"\" #{chat_url}"
    ignore_failure true
  end
end

现在在另一本食谱中:

artifacts.each do |artifactItem|
  # prepare the message:

  chat_message "#{node['hostname']}: Deployed #{artifact_name}-#{version}" do
    action :nothing
  end

  # deploy stuff
  # dummy code follow
  deploy artifactItem['artifact_name'] do
    source "whatever_url/#{artifactItem}
    notifies :send,"chat_message[#{node['hostname']}: Deployed #{artifactItem["artifact_name"]}-#{artifactItem['artifact_name']}]"
  end
end

默认情况下,通知会延迟,因此chat_message资源只会在运行结束时触发。

您在depends食谱上部署食谱必须chat才能调用其custom_resource。