使用Chef属性获取加密数据袋项时查询返回空值问题求助
嘿,我来给你几个实用的排查方向,应该能帮你定位问题:
先确认加密数据袋的解密是否正常:加密数据袋必须用对应秘钥才能解密,如果秘钥没配置对,就算语法正确也拿不到值。你可以检查节点上的秘钥文件(默认在
/etc/chef/encrypted_data_bag_secret)是否正确,或者在client.rb里的encrypted_data_bag_secret_path是不是指向了正确路径。要是用Chef Solo,记得启动时加上--encrypted-data-bag-secret-file参数指定秘钥文件。核对属性引用的拼写和层级:有时候看起来属性赋值对了,但引用时可能手滑写错了层级或者字段名。比如你赋值的是
node.default['myapp']['databag_name'],查询时却写成了node['myapp']['db_name'],这种小错误很容易漏。可以在配方里加个日志输出确认:log "当前databag名称:#{node['myapp']['databag_name']}" log "当前databag项名称:#{node['myapp']['databag_item']}"运行后看日志里的输出和你预期的是不是完全一致。
检查数据袋项的内部结构:可能你要取的API密钥的键名不对?比如数据袋里的密钥存在
['api_key']而不是你代码里写的['key'],或者有更深的嵌套层级。你可以在本地用Knife命令先看一下解密后的完整结构:knife data bag show --secret-file /path/to/your/secret 数据袋名称 数据袋项名称确认你代码里的键路径和实际结构匹配。
确认代码执行顺序:Chef是按配方的代码顺序执行资源的,如果你的数据袋查询写在了某个资源的块里(比如template的variables参数),而属性赋值是在这个资源之后,那查询的时候属性还没被赋值,自然返回空。比如这种错误顺序要避免:
# 错误:先定义模板,后给属性赋值 template '/etc/myapp/config.conf' do variables api_key: data_bag_item(node['myapp']['db_name'], node['myapp']['db_item'])['key'] end node.default['myapp']['db_name'] = 'api_keys' node.default['myapp']['db_item'] = 'prod'一定要把属性赋值的代码放在所有用到它的资源前面。
检查节点对数据袋的访问权限:如果是用Chef Server,节点需要有访问目标数据袋的权限才行。你可以用Knife命令查看节点能访问的数据袋列表:
knife node show 你的节点名称 -a data_bags确认目标数据袋在列表里,要是没有的话,得调整数据袋的权限设置。
内容的提问来源于stack exchange,提问作者prats09

