Chef infra 与策略文件一起使用的数据包定义的环境属性

Chef infra 与策略文件一起使用的数据包定义的环境属性,chef-infra,chef-recipe,Chef Infra,Chef Recipe,使用policyfile,我尝试运行一个使用数据包定义特定于环境的设置的配方 我在名为“env”的数据包中有以下数据包项: 我的食谱中定义了以下内容: environment = data_bag_item('env', "environment_#{Chef::Config.policy_group}") Chef::Mixin::DeepMerge.hash_only_merge!(node.role_default, environment) efs_database_mount = n

使用policyfile,我尝试运行一个使用数据包定义特定于环境的设置的配方

我在名为“env”的数据包中有以下数据包项:

我的食谱中定义了以下内容:

environment = data_bag_item('env', "environment_#{Chef::Config.policy_group}")
Chef::Mixin::DeepMerge.hash_only_merge!(node.role_default, environment)

efs_database_mount = node['efs']['database_mount']
在此代码中未提取该属性:

az = node['ec2']['placement_availability_zone']
region = az[0..-2] # trim last char
file_system_id = efs_database_mount #'fs-c2fa7d8b'
efs_uri = "#{az}.#{file_system_id}.efs.#{region}.amazonaws.com:/" 
错误是:

   NoMethodError
   -------------
   undefined method `[]' for nil:NilClass

有没有关于我做错了什么的想法?

因此,第一个想法是获取组名的正确方法可能是
node.policy\u group
,除非您使用的是非常旧版本的Chef。下一个问题是您可能希望合并到
节点.env_default
,具体取决于您希望排序的工作方式。考虑到您编写代码的方式,我猜您对我的poise起重机库很熟悉,所以请查看其余部分的示例

也就是说,哪一行提出了例外?您可以使用
node.debug\u value
检查在每个级别上如何设置值:

require 'pp'
# For node['foo']['bar']
pp node.debug_value('foo', 'bar')
# Output
[["set_unless_enabled?", false],
 ["default", "attributes default"],
 ["env_default", :not_present],
 ["role_default", "role default"],
 ["force_default", :not_present],
 ["normal", "attributes normal"],
 ["override", "attr override"],
 ["role_override", "role override"],
 ["env_override", :not_present],
 ["force_override", :not_present],
 ["automatic", :not_present]]

efs_database_mount=节点['efs']['database_mount']引发异常。我想你是说我应该试试Chef::Mixin::DeepMerge.hash\u only\u merge!(node.policy\u group,environment)或Chef::Mixin::DeepMerge.hash\u only\u merge!(node.env_默认值,环境)?看来我在这件事上比我聪明多了。。。我一直在读-这是我得到原始值的地方。我似乎没有任何定义。。。[[“默认设置”、“不在场”、“环境默认设置”、“不在场”、“角色默认设置”、“不在场”、“强制默认设置”、“不在场”、“正常设置”、“不在场”、“覆盖”、“不在场”、“角色覆盖”、“不在场”、“不在场”]、“环境覆盖”、“不在场”、:不在场”]、“强制覆盖”、“不在场”,[“自动”:不存在]]…很抱歉输出太多…也许我仍然不明白我应该如何在这个论坛上回复。如果评论没有格式化,请通过编辑将输出添加到您的问题中,使其可读。是否有原因让您尝试做一些超级高级的事,而不仅仅是正常使用数据包项目?您正在与interna进行混战l API,如果您知道自己在做什么,并且可以处理故障,这很好,但听起来情况并非如此。我只是希望找到一种方法,从我的策略文件中删除特定于环境的属性。我有很多这样的属性,它将更干净,更不容易出错,不必将它们复制并粘贴到新的策略文件中。
require 'pp'
# For node['foo']['bar']
pp node.debug_value('foo', 'bar')
# Output
[["set_unless_enabled?", false],
 ["default", "attributes default"],
 ["env_default", :not_present],
 ["role_default", "role default"],
 ["force_default", :not_present],
 ["normal", "attributes normal"],
 ["override", "attr override"],
 ["role_override", "role override"],
 ["env_override", :not_present],
 ["force_override", :not_present],
 ["automatic", :not_present]]