【问题标题】:Chef custom attributes厨师自定义属性
【发布时间】:2015-05-08 00:04:39
【问题描述】:

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

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

【问题讨论】:

  • 对属性使用惰性求值。该值在编译时读取,但在收敛时设置(在 ruby​​_block 内)。有关更详细的说明,请参阅this answer。 (即你的 uri 属性应该是:uri "127.0.0.1/vedsdk/certificates/retrieve?apikey=#{lazy { node["server"]["apikey"] } }"
  • 谢谢刚刚尝试过,但这只会返回一个延迟的评估器,例如<:delayedevaluator:0x007fd0152b4458>
  • 确实,抱歉,做了更多搜索并找到this one 这正是您的情况
  • 天啊,对不起,我完全错了。试试这个:uri lazy {"127.0.0.1/vedsdk/certificates/retrieve?apikey=#{node["server"]["apikey"]}"}(我已经测试过了)
  • 那行得通:) 非常感谢。这似乎相当晦涩难懂,天知道如果没有你的帮助我怎么会找到它。这是它应该如何设计的吗?

标签: attributes chef-infra cookbook


【解决方案1】:

将其写为通用答案(它也将避免在列表中保持未回答的状态;))

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

正确的用法是

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

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

懒惰的设计意味着评估属性值,它也可以包含 Ruby 代码来计算先前资源完成的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多