Puppet7中如何通过Hiera与EYaml存储密钥配置Cloudflare
配置问题排查与修正指引
现有配置核心错误
- eyaml文件路径不匹配:hiera.yaml配置的节点级eyaml查找路径为
secrets/nodes/%{trusted.certname}.eyaml,若web.my.company.eyaml未放在对应secrets/nodes目录下,Hiera扫描时根本不会读取该文件。 - eyaml键名不符合自动绑定规则:
letsencrypt::plugin::dns_cloudflare类接收的token参数名为api_token,现有配置中写的private键无法被类识别,且没有使用Puppet自动参数绑定要求的<完整类名>::<参数名>键格式。 - eyaml加密值格式错误:标准
ENC[PKCS7,xxx]块不能用双引号包裹加密串,也不需要额外加YAML折叠符>,错误格式会导致eyaml后端无法识别加密块、解密失败。 - 类声明硬编码覆盖Hiera配置:现有
cloudflareDns.pp中手动给api_token传了固定字符串cloudflare-dns-my.company.com,资源显式传参优先级高于Hiera自动绑定,永远不会读取eyaml中存储的加密值。
正确配置步骤
1. 修正eyaml文件
将节点eyaml文件移动到hiera指定的data/secrets/nodes/目录(以datadir默认值为data为例),文件名和节点certname保持一致即web.my.company.eyaml,内容修改为如下格式:
--- letsencrypt::plugin::dns_cloudflare::api_token: ENC[PKCS7,替换为eyaml加密后的真实API token串]
注意:用eyaml encrypt -s '你的Cloudflare API token'命令生成加密串,输出的ENC块直接复制粘贴即可,不要加引号、不要调整缩进、不要额外套YAML标记。
2. 修正类声明写法
删除cloudflareDns.pp中硬编码参数的类声明块,改用include方式触发Hiera自动参数绑定:
# 删除原有硬传参的class块,替换为 include letsencrypt::plugin::dns_cloudflare
如果需要显式声明类,可通过lookup函数显式读取Hiera值,不要写死字符串:
class { 'letsencrypt::plugin::dns_cloudflare': api_token => lookup('letsencrypt::plugin::dns_cloudflare::api_token'), }
3. 配置有效性校验
在Puppet Server节点执行以下命令验证链路是否通畅:
# 替换为实际环境名、节点名 puppet lookup letsencrypt::plugin::dns_cloudflare::api_token --node web.my.company.com --environment production
根据输出结果排查问题:
- 返回解密后的明文API token:说明Hiera、eyaml、自动绑定全链路正常,可正常下发配置
- 提示找不到对应键:检查eyaml文件存放路径、文件名是否和hiera配置的查找规则一致,检查键名拼写是否正确
- 提示解密失败:检查hiera.yaml中配置的eyaml公私钥路径是否正确,Puppet Server运行用户是否有私钥文件读权限,检查ENC块是否被加了多余引号、空格
- 提示YAML语法错误:用
eyaml validate 你的eyaml文件路径命令校验语法,重点检查缩进、冒号后空格、ENC块格式
Hiera读取加密数据的逻辑说明
- hiera.yaml中eyaml后端优先级最高,查找键时会优先扫描所有配置的eyaml路径,只要匹配到对应键,eyaml后端会自动用配置的私钥解密ENC块返回明文,不需要额外编写解密逻辑,对上层Puppet代码完全透明。
- Puppet自动参数绑定规则为:类参数对应的Hiera键固定为
<完整类路径>::<参数名>,只要Hiera中存在该键,include类时不手动传参,Puppet会自动将查到的值传给对应参数,无论值存储在普通yaml还是eyaml中。
常见踩坑点
- eyaml文件必须严格放在hiera.yaml配置的paths对应目录下,和普通yaml混放会导致扫描不到
- 不要给ENC块加任何额外包裹标记,eyaml后端可直接识别标准格式的ENC块,额外标记会导致加密块被识别为普通字符串
- 类声明时手动传参的优先级高于所有Hiera层级,只要写死参数值就不会读取Hiera配置
- eyaml私钥权限必须严格控制,仅允许Puppet Server运行用户读取,避免密钥泄露
内容的提问来源于stack exchange,提问作者Callum McCrorie
相关产品推荐
相关产品推荐

