厨师自定义属性

Chef custom attributes

我正在编写自定义 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"] 属性的值可用并且按预期工作。

显然,我在这里遗漏了一些东西买不出来:(

将其写为通用答案(这样可以避免在列表中也保留未回答的问题 ;))

在资源内部时,您可以使用 lazy attribute evaluation 在收敛时评估属性值。

正确的用法是

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

常见的错误是使用惰性内插,因为我们只想对变量进行惰性求值,而只有一个。

根据设计,lazy 旨在评估属性值,它可以包含 Ruby 代码来计算先前资源所做的值。