厨师自定义属性
Chef custom attributes
我正在编写自定义 Chef Cookbook 并定义了一个名为 default["server"]["apikey"] = nil
的自定义属性,该属性已在该食谱中的单独属性文件中定义,如下所示:
#Default Attributes
default["webhooks"]["get_response"] = ""
default["webhooks"]["put_response"] = ""
default["webhooks"]["post_response"] = ""
default["server"]["username"] = "user"
default["server"]["password"] = "123"
default["server"]["apikey"] = nil
在我的食谱中,我会这样做:
webhooks_request "Request an API key from TPP " do
uri "172.16.28.200/sdk/authorize/"
post_data (
{ 'Username' => node["server"]["username"], 'Password' => node["server"]["password"]}
)
header_data (
{ 'content-type' => 'application/json'}
)
expected_response_codes [ 200, 201, 400 ]
action :post
end
然后我在 ruby_block
之后使用 API 键更新 ``default["server"]["apikey"]` 属性的值,如下所示:
ruby_block "Extract the API Key" do
block do
jsonData = JSON.parse(node["webhooks"]["post_response"])
jsonData.each do | k, v |
if k == 'APIKey'
node.overide["server"]["apikey"] = v
end
end
end
action :run
end
然后我可以用这个来验证它:
ruby_block "Print API Key" do
block do
print "\nKey = : " + node["server"]["apikey"] + "\n"
end
action :run
end
但是,如果我随后尝试在以下块中使用 node["server"]["apikey"]
属性,如下所示:
webhooks_request "Get data from TPP" do
uri "127.0.0.1/vedsdk/certificates/retrieve?apikey=#{node["server"]["apikey"]}"
post_data (
{ 'data' => "NsCVcQg4fd"}
)
header_data (
{ 'content-type' => 'application/json', 'auth' => node["server"] ["username"]}
)
expected_response_codes [ 200, 201, 400, 401 ]
action :post
end
node["server"]["apikey"]}
的值始终为空。有趣的是,node["server"] ["username"]
属性的值可用并且按预期工作。
显然,我在这里遗漏了一些东西买不出来:(
将其写为通用答案(这样可以避免在列表中也保留未回答的问题 ;))
在资源内部时,您可以使用 lazy attribute evaluation 在收敛时评估属性值。
正确的用法是
resource "name" do
attribute lazy {"any value #{with interpolation} inside"}
end
常见的错误是使用惰性内插,因为我们只想对变量进行惰性求值,而只有一个。
根据设计,lazy 旨在评估属性值,它可以包含 Ruby 代码来计算先前资源所做的值。
我正在编写自定义 Chef Cookbook 并定义了一个名为 default["server"]["apikey"] = nil
的自定义属性,该属性已在该食谱中的单独属性文件中定义,如下所示:
#Default Attributes
default["webhooks"]["get_response"] = ""
default["webhooks"]["put_response"] = ""
default["webhooks"]["post_response"] = ""
default["server"]["username"] = "user"
default["server"]["password"] = "123"
default["server"]["apikey"] = nil
在我的食谱中,我会这样做:
webhooks_request "Request an API key from TPP " do
uri "172.16.28.200/sdk/authorize/"
post_data (
{ 'Username' => node["server"]["username"], 'Password' => node["server"]["password"]}
)
header_data (
{ 'content-type' => 'application/json'}
)
expected_response_codes [ 200, 201, 400 ]
action :post
end
然后我在 ruby_block
之后使用 API 键更新 ``default["server"]["apikey"]` 属性的值,如下所示:
ruby_block "Extract the API Key" do
block do
jsonData = JSON.parse(node["webhooks"]["post_response"])
jsonData.each do | k, v |
if k == 'APIKey'
node.overide["server"]["apikey"] = v
end
end
end
action :run
end
然后我可以用这个来验证它:
ruby_block "Print API Key" do
block do
print "\nKey = : " + node["server"]["apikey"] + "\n"
end
action :run
end
但是,如果我随后尝试在以下块中使用 node["server"]["apikey"]
属性,如下所示:
webhooks_request "Get data from TPP" do
uri "127.0.0.1/vedsdk/certificates/retrieve?apikey=#{node["server"]["apikey"]}"
post_data (
{ 'data' => "NsCVcQg4fd"}
)
header_data (
{ 'content-type' => 'application/json', 'auth' => node["server"] ["username"]}
)
expected_response_codes [ 200, 201, 400, 401 ]
action :post
end
node["server"]["apikey"]}
的值始终为空。有趣的是,node["server"] ["username"]
属性的值可用并且按预期工作。
显然,我在这里遗漏了一些东西买不出来:(
将其写为通用答案(这样可以避免在列表中也保留未回答的问题 ;))
在资源内部时,您可以使用 lazy attribute evaluation 在收敛时评估属性值。
正确的用法是
resource "name" do
attribute lazy {"any value #{with interpolation} inside"}
end
常见的错误是使用惰性内插,因为我们只想对变量进行惰性求值,而只有一个。
根据设计,lazy 旨在评估属性值,它可以包含 Ruby 代码来计算先前资源所做的值。