Kitchen测试中无法用未加密数据袋Stub Chef-Vault数据的问题
解决Kitchen-EC2驱动下测试未加密Chef-Vault数据袋的问题
先说说我的环境配置,方便大家参考:
- Chef Development Kit Version:
2.4.17 - chef-client version:
13.6.4 - delivery version:
master (73ebb72a6c42b3d2ff5370c476be800fee7e5427) - berks version:
6.3.1 - kitchen version:
1.19.2 - inspec version:
1.45.13
问题背景
我最近在尝试用kitchen-ec2驱动测试Chef-Vault的功能,目标是创建未加密的数据袋来验证基础逻辑。之前针对vagrant驱动的解决方案完全不管用,现在我搞不清楚到底是Kitchen在自动尝试启用Vault加密,还是它没有正确解析我设置的未加密数据袋配置。
一步步排查解决
我折腾了一阵,总结出几个有效的排查和解决步骤:
1. 强制在Kitchen配置里指定未加密模式
首先要在.kitchen.yml的provisioner块里明确告诉Chef Client不要启用Vault加密,直接明文处理数据袋。添加这些配置:
provisioner: name: chef_zero client_rb: chef_vault: default_mode: 'default' # 强制使用默认的明文模式 unencrypted_keys: ['*'] # 允许所有数据袋和密钥以明文加载
如果你是通过角色或者环境属性来配置Chef-Vault,一定要检查这些配置里有没有强制加密目标数据袋的规则,要是有的话先注释掉。
2. 确保数据袋是纯明文结构
不要用chef-vault create这类命令生成加密的数据袋项,直接在data_bags目录下手动创建明文JSON文件,结构要像这样:
data_bags/ my_test_bag/ plain_item.json # 这个文件就是普通的JSON,没有Vault加密的嵌套结构
如果之前生成过加密的数据袋或者对应的keys数据袋,记得全部删除,避免Kitchen加载到旧的加密内容。
3. 查看EC2实例上的Chef日志找线索
执行kitchen converge之后,登录到EC2实例,查看/var/log/chef/client.log,重点搜索这些关键字:
chef_vault:看看日志里有没有关于加密模式的输出,确认是否是我们设置的default模式data_bag:检查数据袋是被当作明文加载,还是在尝试解密
如果日志里出现ChefVault::Exceptions::KeysNotFound这类错误,说明Chef还是在尝试解密数据袋,这时候要回头检查client.rb或者角色里的Vault配置有没有覆盖我们的明文设置。
4. 让Cookbook兼容明文/加密两种模式
如果你的Cookbook里依赖了chef-vault,不要直接硬编码调用chef_vault_item,改成判断模式再加载:
# 在Cookbook的配方里这样处理 if node['chef_vault']['default_mode'] == 'default' my_item = data_bag_item('my_test_bag', 'plain_item') else my_item = chef_vault_item('my_test_bag', 'encrypted_item') end
这样不管是测试环境用明文,还是生产环境用加密,都能正常运行。
5. 清理Kitchen缓存后重新测试
有时候之前的缓存会导致配置不生效,先执行这些命令清理:
kitchen destroy rm -rf .kitchen/ kitchen create kitchen converge
然后再看是否能正常加载未加密的数据袋。
内容的提问来源于stack exchange,提问作者Said Masoud
相关产品推荐
相关产品推荐

