【问题标题】:Accessing template attributes in Chef在 Chef 中访问模板属性
【发布时间】:2019-02-18 11:06:25
【问题描述】:

我在Chef/Ruby 中声明一个变量并为其赋值。对于不同的环境,该值是不同的。我在相应的环境文件中设置值,如下所示:

region = us-west-1 

在模板文件中我是这样使用的

region =<%= @region %>

在配方中

:region =>node.region

当我的修复被合并时,实例没有出现。 这是正确的做法还是我错过了什么?

【问题讨论】:

    标签: ruby chef-infra


    【解决方案1】:

    这是我最喜欢的两种方法:

    • 使用厨师属性。

    在属性文件中定义属性的默认值。所以在&lt;cookbook_name&gt;/attributes/default.rb文件中添加这一行:

    default['instance_region'] = 'us-west-1'
    

    然后在您添加模板的配方中:

    variables(region: node['instance_region'])
    

    您可以在您提到的模板中访问它:

    region =<%= @region %>
    
    • 使用厨师库。

    为了更广泛的使用,您可以在厨师库中定义此类值。所以在&lt;cookbook&gt;/libraries/common.rb添加:

    module Common
       def instance_region
         # This will return the name of AWS region that the nodes is in.
         shell_out!('curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone/').stdout
       end
     end
    

    然后在你的食谱中你可以通过调用普通的instance_region来使用它

    【讨论】:

    • 感谢您的回复。不同环境的值不同。它是除一个之外的所有帐户的一个区域。我该如何处理属性文件中的这种情况?
    • 那么我认为第二个选项最适合您。因为它会自动了解您的实例所在的区域,并将该值放入变量中。在任何执行此操作的 AWS 中:curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone/ 将返回它所在的实例区域。
    • @spinnp 如果您觉得有帮助,请为答案投票
    • 我尝试投票但不能,因为我只有 13 个声望。此外,:region =>node.region --- 这种风格在 chef13 中被贬低和删除,我遇到了一个错误,但在此之后修复了它:docs.chef.io/deprecations_attributes.html
    猜你喜欢
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 2013-06-18
    • 2018-01-17
    相关资源
    最近更新 更多