使用策略文件,我正在尝试运行使用数据库来定义特定于环境的设置的配方。
我在名为“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
关于我做错的任何想法?
答案 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]]