【发布时间】:2015-05-08 00:04:39
【问题描述】:
我正在编写一个自定义 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"] 属性的值可用并且按预期工作。
显然,我在这里遗漏了一些东西,买不出来是什么:(
【问题讨论】:
-
对属性使用惰性求值。该值在编译时读取,但在收敛时设置(在 ruby_block 内)。有关更详细的说明,请参阅this answer。 (即你的 uri 属性应该是:
uri "127.0.0.1/vedsdk/certificates/retrieve?apikey=#{lazy { node["server"]["apikey"] } }" -
谢谢刚刚尝试过,但这只会返回一个延迟的评估器,例如<:delayedevaluator:0x007fd0152b4458>
-
确实,抱歉,做了更多搜索并找到this one 这正是您的情况
-
天啊,对不起,我完全错了。试试这个:
uri lazy {"127.0.0.1/vedsdk/certificates/retrieve?apikey=#{node["server"]["apikey"]}"}(我已经测试过了) -
那行得通:) 非常感谢。这似乎相当晦涩难懂,天知道如果没有你的帮助我怎么会找到它。这是它应该如何设计的吗?
标签: attributes chef-infra cookbook