Ruby / Chef:有没有办法引用资源' name'并传递给一个函数?

时间:2016-08-19 11:40:27

标签: ruby chef cookbook recipe

请使用chef中的log资源查看以下代码。

log 'Hello there' do
  level :info
  notifies :run, "log_to_chat('Hello there')"
end

当我将资源传递给函数name时,有没有办法引用资源log_to_chat(在这种情况下:' Hello there')。

我想象的是:

log 'Hello there' do
  level :info
  notifies :run, "log_to_chat(#{name})"
end

添加我对log_to_chat的尝试。

尝试1:

resource_name :log_to_chat

property :message, kind_of: String, name_property: true

chat_url = 'https://chat.server/abcdef'

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

问题:如何将:message参数作为notifies行的单行传递?

notifies :run, "log_to_chat[message]", --pass :message how??--

尝试2:

module Chat
  def log_to_chat(message)
    chat_url = 'https://chat.server/abcdef'
    action :run do
      execute "curl" do
        command "curl -m 5 -i -X POST -d \"payload={...}\" #{chat_url}"
        ignore_failure true
      end
    end
  end
end

编辑:尝试2无法正常工作,因为您无法在定义中使用资源

2 个答案:

答案 0 :(得分:2)

您可以参考name变量。从documentation您可以看到“name是资源块的名称”。请注意,您要使用块名称(在您的情况下为Hello there)而不是资源名称(在问题的代码段中为log

答案 1 :(得分:1)

如果您想通知资源log_to_chat[some message](尝试1),您必须在:nothing之前使用操作log 'Hello there'明确声明它。所以看起来应该是这样的:

log_to_chat 'some message' do
  action :nothing
end

log 'Hello there' do
  level :info
  notifies :run, "log_to_chat[some message]"
end

如果它是有效的代码,那么它不是最佳解决方案。要获得100%厨师方式解决方案,您应该实施新的log resource提供商,默认情况下,Chef::Provider::ChefLog。你应该实施旧学校LWRP'提供者提到here。在新的提供程序中,您可以替换标准的自定义日志资源功能,或者只需通过curl调用或本机net/http(或任何其他网络gem)ruby调用(首选)进行扩展。