【问题标题】:How to use variables in chef resource http_request如何在厨师资源 http_request 中使用变量
【发布时间】:2020-07-01 06:11:56
【问题描述】:

我在厨师食谱中使用 http_request 资源来发出需要代理用户和密码的 http 请求。我面临替换属性中定义的变量或实际上任何变量的问题 例如以下代码工作正常,其中用户名和密码是硬编码的。

http_request 'get-info' do
  url "http://host:8080/v123/orgs/abc"
  headers({ 'AUTHORIZATION' => "Basic #{ Base64.encode64('user1:pwd123')}",
    'Content-Type' => 'application/json'  }  )
  message ( "{ } " )
  action :get
end

但是如果我使用变量而不是像下面这样的硬编码凭据

u_name=node['mychef']['username']
pwd=node['mychef']['password']

http_request 'get-info' do
  url "http://host:8080/v123/orgs/abc"
  headers({ 'AUTHORIZATION' => "Basic #{ Base64.encode64('#{u_name}:#{pwd}')}",
    'Content-Type' => 'application/json'  }  )
  message ( "{ } " )
  action :get
end

然后我得到以下错误

    ================================================================================
    Error executing action `get` on resource 'http_request[get-info]'
    ================================================================================

    Net::HTTPServerException
    ------------------------
    401 "Unauthorized"

当然,凭据没有被正确读取。感谢有关如何在厨师资源 http_request 中替换变量的帮助。

【问题讨论】:

    标签: ruby automation chef-infra devops chef-recipe


    【解决方案1】:

    与此同时,我已经解决了我的问题。如果我像下面这样提前单独构建 Base64 编码,那么我可以很容易地替换 http_request 中的值

    sys_admin_creds = Base64.encode64("#{node['mychef']['username']}:#{node['mychef']['password']}")
    

    然后我可以像下面这样替换值

    headers({ 'AUTHORIZATION' => "Basic #{sys_admin_creds}",
        'Content-Type' => 'application/json'  }  )
    

    我认为可能还有其他方法可以解决此问题。当我直接替换 http_request 标头中的值时,我认为引号和双引号的数量变得难以管理。但我相信这也可以解决。但现在我将继续我的解决方案。如果有人有更好的解决方案,仍然发布。所以我们总是可以改进我们的社区成员:)。

    【讨论】:

    • 这是因为: 1. 嵌套插值不起作用。 2. 插值只能用双引号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 2014-05-28
    • 2016-12-30
    • 2013-04-24
    • 2016-04-10
    • 1970-01-01
    相关资源
    最近更新 更多