Ruby / Chef:有没有办法引用资源 'name' 并传递给函数?
Ruby / Chef: is there a way to refer to the resource 'name' and pass to a function?
请查看以下代码,使用 chef 中的 log
资源。
log 'Hello there' do
level :info
notifies :run, "log_to_chat('Hello there')"
end
当我将它传递给函数 log_to_chat
.
时,有没有办法引用资源 name
(在本例中:'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
问题:如何从 notifies
行将 :message
参数作为一个衬里传递?
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 失败,因为您不能在定义中使用资源
可以参考name
变量。从 documentation 你可以读到“name
是资源块的名称”。请记住,您要使用块名称(在您的情况下为 Hello there
)而不是资源名称(在问题片段中为 log
)
如果您想通知资源 log_to_chat[some message]
(尝试 1),您必须在 log 'Hello there'
之前使用操作 :nothing
显式声明它。所以它应该是这样的:
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 provider, by default it's Chef::Provider::ChefLog
. You should implement 'Old School LWRP' provider mentioned here。在您的新提供商中,您可以替换标准的 Chef 日志资源功能,或者仅通过您的 curl 调用或本机 net/http
(或任何其他网络 gem)ruby 调用(首选)扩展它。
请查看以下代码,使用 chef 中的 log
资源。
log 'Hello there' do
level :info
notifies :run, "log_to_chat('Hello there')"
end
当我将它传递给函数 log_to_chat
.
name
(在本例中:'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
问题:如何从 notifies
行将 :message
参数作为一个衬里传递?
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 失败,因为您不能在定义中使用资源
可以参考name
变量。从 documentation 你可以读到“name
是资源块的名称”。请记住,您要使用块名称(在您的情况下为 Hello there
)而不是资源名称(在问题片段中为 log
)
如果您想通知资源 log_to_chat[some message]
(尝试 1),您必须在 log 'Hello there'
之前使用操作 :nothing
显式声明它。所以它应该是这样的:
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 provider, by default it's Chef::Provider::ChefLog
. You should implement 'Old School LWRP' provider mentioned here。在您的新提供商中,您可以替换标准的 Chef 日志资源功能,或者仅通过您的 curl 调用或本机 net/http
(或任何其他网络 gem)ruby 调用(首选)扩展它。