Databag定义了与策略文件一起使用的环境属性

时间:2017-03-26 00:41:41

标签: chef chef-recipe

使用策略文件,我正在尝试运行使用数据库来定义特定于环境的设置的配方。

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

{
    "id": "enviornment_local",
    "filename": "environment_local.json",
    "efs": {
        "database_mount": "fs-c2fa7d8b"
    }
}

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

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

关于我做错的任何想法?

1 个答案:

答案 0 :(得分:0)

所以首先想到的是获取组名的正确方法可能是node.policy_group,除非你使用的是旧版本的Chef。下一个问题是您可能希望合并到node.env_default,具体取决于您希望如何订购。鉴于你编写代码的方式,我猜你已经熟悉了我的poise-hoist库,所以请看其余的例子。

那说,哪一行正是提出异常?您可以使用node.debug_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]]