2015-03-06 2 views
0

Я работаю над обычаем 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"] доступно и работает как ожидалось.

Очевидно, я что-то здесь купить не может работать, что :(

+0

Используйте ленивую оценку для этого атрибута. Значение считывается во время компиляции, но устанавливается на время схождения (внутри 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

+0

Спасибо, просто попробовал это, но это просто возвращает задержанного оценщика, например user1513388

+0

Действительно, извините, сделал немного больше search and foudn [this one] (http://stackoverflow.com/questions/20620724/how-to-lazily-evaluate-an-arbitrary-variable-with-chef), который является именно вашим случаем – Tensibai

ответ

2

Записав его как общий ответ отсутствует (это позволит избежать держать его без ответа в списке тоже;))

Когда внутри ресурс, вы можете оценить значение атрибута при времени схождения с lazy attribute evaluation.

Правильное использование является

resource "name" do 
    attribute lazy {"any value #{with interpolation} inside"} 
end 

Распространенная ошибка заключается в использовании ленивым внутри интерполяции, как мы только хотим, чтобы переменная лениться оценена, и есть только один.

По дизайну lazy предназначен для оценки значения атрибута, он может содержать код Ruby для вычисления значения из чего-либо, сделанного предыдущим ресурсом.

Смежные вопросы