Я работаю над обычаем Chef Cookbook и определил пользовательский атрибут default["server"]["apikey"] = nil
то будет определенно в кулинарной книге в файле отдельных атрибутов, который выглядит так:Chef пользовательских атрибутов
#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
, который обновляет значение `` по умолчанию [ «сервер»] [ «apikey»] `атрибута с помощью ключа API, как это:
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). См. [Этот ответ] (http://stackoverflow.com/questions/28357365/when-are-default-node-attributes-set-during-a-chef-client-run/28361825#28361825) для более детального объяснения. (т. е. ваш атрибут uri должен быть: 'uri" 127.0.0.1/vedsdk/certificates/retrieve?apikey=#{lazy {node ["server"] ["apikey"]}} "' – Tensibai
Спасибо, просто попробовал это, но это просто возвращает задержанного оценщика, например –
user1513388
Действительно, извините, сделал немного больше search and foudn [this one] (http://stackoverflow.com/questions/20620724/how-to-lazily-evaluate-an-arbitrary-variable-with-chef), который является именно вашим случаем – Tensibai