Puppet 3.6.2中Hiera数组结果未换行问题求助
问题诊断与解决
1. 先排查Hiera数组定义格式
确保patches.yml中的数组遵循YAML规范,每个元素前必须加- ,示例正确写法:
windows::patches: - KB123456.msu - KB789012.msu - KB345678.msu
如果写成单行逗号分隔的字符串(如windows::patches: "KB123456.msu,KB789012.msu"),Hiera返回的会是单个字符串而非数组,直接输出自然会连在一起。
2. Puppet 3.x中实现数组多行输出的两种方式
Puppet 3.x默认会将数组转换为逗号分隔的字符串输出,要实现每行显示一个补丁名,可通过以下两种方式处理:
方式一:遍历数组生成独立notify资源
在windowspatches.pp中遍历数组,为每个补丁创建单独的notify:
$patches = hiera('windows::patches') $patches.each |$patch| { notify { "patch_${patch}": message => $patch, } }
每个补丁会生成一条独立的输出,自然按行显示。
方式二:用join函数拼接换行符
如果希望用单个notify输出所有补丁,用join函数将数组元素用换行符连接:
$patches = hiera('windows::patches') $patch_list = join($patches, "\n") notify { 'patch_list': message => $patch_list, }
3. 验证Hiera返回的变量类型
可通过type()函数确认Hiera返回的是否为数组,排查定义问题:
$patches = hiera('windows::patches') notify { 'patch_type_check': message => "Patches variable type: ${type($patches)}", }
若输出为String,说明Hiera数组定义错误;若为Array,则是Puppet默认的数组转字符串行为导致的,用上述方法处理即可。
4. 离线环境额外检查
- 确认
hiera.yaml中已启用yaml后端,示例配置:
--- :backends: - yaml :yaml: :datadir: /etc/puppet/hieradata :hierarchy: - "%{clientcert}" - "%{environment}" - common
- 确保
patches.yml放在Hiera配置的datadir目录下,且Puppet master拥有读取权限。
内容的提问来源于stack exchange,提问作者cstewart28
相关产品推荐
相关产品推荐

