使用Puppet写入hiera-eyaml解密内容失败,求解决方案
问题描述
我已经用hiera-eyaml加密了配置内容,在Hiera文件中以如下形式引入:
mymodule::config_file: ENC[PKCS7,...]
接着用这段Puppet代码尝试把解密后的字符串写入文件:
class mymodule ( String $config_file ) { file { '/etc/agent_config.json': content => $config_file, mode => '0644', } }
预期输出文件是解密后的内容,但实际写入的还是加密的eYAML字符串。想知道这种操作在Puppet里是不是无法实现?
补充信息
- 用
eyaml edit查看加密文件内容显示正常,示例:
itglue::fireeye::fireeye_config: DEC(1)::PKCS7[{ "serverlist": { "servers": [ ... ] } }]!
- 我的
hiera.yaml配置:
--- :backends: - yaml - eyaml :yaml: :datadir: /etc/puppet/hiera/hieradata :eyaml: :datadir: /etc/puppet/hiera/hieradata :pkcs7_private_key: /var/lib/puppet/keys/private_key.pkcs7.pem :pkcs7_public_key: /var/lib/puppet/keys/public_key.pkcs7.pem :hierarchy: - secure - "%{::clientcert}" - "node_role/%{::node_role}" - "env/%{::environment}" - "node_types/%{nodetype}" - global :logger: console
解决方案
这种操作完全可以实现,问题出在Hiera配置和调用逻辑上,按以下步骤排查修复:
1. 调整Hiera后端优先级
你的hiera.yaml把yaml放在eyaml前面,如果加密内容存放在yaml格式文件(比如secure.yaml)中,Hiera会直接读取原始加密字符串,不会触发eyaml解密。需把eyaml移到后端列表最前面:
:backends: - eyaml - yaml
这样Hiera会优先用eyaml后端处理所有文件,即使是yaml后缀的文件,也会自动识别并解密其中的ENC[...]块。
2. 检查变量类型约束
你在类里把$config_file声明为String类型,虽然解密后的JSON本质是字符串,但如果解密过程中出现类型解析异常,可能导致Puppet直接传递原始加密串。可以暂时去掉类型约束测试:
class mymodule ( $config_file ) { file { '/etc/agent_config.json': content => $config_file, mode => '0644', } }
3. 验证Hiera lookup解密结果
在Puppet master上执行以下命令,手动测试变量是否能正确解密:
puppet lookup mymodule::config_file --node <你的节点名> --environment <环境名>
如果输出是解密后的JSON内容,说明Hiera配置没问题;如果还是加密字符串,继续检查:
- 确认目标层级文件(如
secure.yaml)的加密格式正确,确实是ENC[PKCS7,...]格式 - 检查Puppet运行用户(通常是
puppet)对私钥文件/var/lib/puppet/keys/private_key.pkcs7.pem的读取权限,确保权限为0600,属主属组为puppet:puppet
4. 确认版本兼容性
确保hiera-eyaml版本与Puppet、Hiera版本兼容,避免因版本不匹配导致解密失败。可通过以下命令查看版本:
gem list hiera-eyaml puppet --version
内容的提问来源于stack exchange,提问作者Joseph Quinn
相关产品推荐
相关产品推荐

