Пользовательские атрибуты шеф-повара
Я работаю над пользовательской поваренной книгой шеф-повара и определил пользовательский атрибут с именем 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
который обновляет значение атрибута ``default["server"]["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"]
атрибут доступен и работает как положено.
Очевидно, я что-то здесь упускаю купить не могу понять, что:(
1 ответ
Написание этого как общий ответ (это также позволит не оставлять его без ответа в списке;))
Находясь внутри ресурса, вы можете оценить значение атрибута во время конвергенции с ленивой оценкой атрибута.
Правильное использование
resource "name" do
attribute lazy {"any value #{with interpolation} inside"}
end
Распространенной ошибкой является использование lazy внутри интерполяции, так как мы хотим, чтобы переменная оценивалась как lazy, а есть только одна.
По замыслу lazy предназначен для оценки значения атрибута, он может содержать код Ruby для вычисления значения из того, что было сделано предыдущим ресурсом.