Пользовательские атрибуты шеф-повара

Я работаю над пользовательской поваренной книгой шеф-повара и определил пользовательский атрибут с именем 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 для вычисления значения из того, что было сделано предыдущим ресурсом.

Другие вопросы по тегам