You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 07:57:19