我们的网站正在从 puppet6 迁移到 puppet8,我们遇到了在 hiera 中存储二进制数据的问题。
原始(二进制)数据文件已使用 eyaml 加密:
$ eyaml encrypt -f binary.data > binary.data.eyaml
生成的 eyaml 文件包含在 Hiera yaml 文件中,如下所示:
test::func::data: >
ENC[PKCS7,.....
...]
使用此代码时:
test::func{ 'hello':
data => lookup('binary::data')
}
与:
define test::func(
Binary $data
) {
}
导致错误:
Test::Func[hello]: parameter 'data' expects a Binary value, got String
但是使用“String”类型(适用于 puppet6)
define test::func(
String $data
) {
}
结果:
Error: Could not retrieve catalog from remote server: Error 500 on
SERVER: Server Error: Failed to serialize Puppet::Resource::Catalog
for 'puppetserver': Could not render to
Puppet::Network::Format[rich_data_json]: source sequence is
illegal/malformed utf-8
这是从 6 变为 8 的行为变化。
关于如何解决这个问题有什么建议吗?
YAML hiera 后端仅支持基本类型。由于 Binary 不是这些类型之一,因此您需要显式配置 hiera 以返回这样的值。
使用lookup_options配置 hiera 以将特定值转换为所需类型。
例如,根据您的用例,在“通用”control-repo hiera 文件中添加以下内容以确保查找值以二进制形式返回:
lookup_options:
binary::data:
convert_to: Binary