使用Puppet填充含非ASCII字符密码失败问题求助
问题
尝试通过Puppet将包含非ASCII字符的密码写入模板文件,已将密码Base64编码后存储在hiera-esecrets中,但模板解码时失败,最终生成的配置文件仅显示Base64编码值,无法得到实际密码。
Puppet代码
class abc::container ( $key_encrypt = hiera('abc::configs::key_encrypt', undef), ){ @docker_container { "${app}:${version}": files => { 'configuration.properties' => { destination => '/opt/configuration.properties', mount_mode => 'rw', owner => 'root', group => 'root', mode => '0755', content => template('abc/configuration.properties.erb'), }, }, } }
ERB模板代码(原错误版本)
<% require 'base64' key_encrypt = @key_encrypt key_encrypt_d = Base64.decode64(key_encrypt) %> master.key.2024-08-22-02-05=<%= @key_encrypt_d %>
错误信息
Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Failed to parse inline template: invalid byte sequence in US-ASCII
解决方案
1. 修正模板变量引用
模板中定义的key_encrypt_d是局部变量,输出时误用了实例变量语法@key_encrypt_d,需改为直接使用局部变量名。
2. 强制UTF-8编码处理
Ruby默认以US-ASCII编码解析字符串,解码非ASCII字符时会触发错误,需要在模板开头声明编码,并对解码后的字符串强制设置UTF-8编码。
修正后的ERB模板:
<% # 声明模板使用UTF-8编码 # encoding: utf-8 require 'base64' key_encrypt = @key_encrypt key_encrypt_d = Base64.decode64(key_encrypt).force_encoding('UTF-8') %> master.key.2024-08-22-02-05=<%= key_encrypt_d %>
3. 验证Base64编码的正确性
确保hiera-esecrets中存储的Base64值是基于UTF-8编码的原始密码生成的,可通过以下命令生成正确的编码值:
echo -n "包含非ASCII的密码" | base64
4. 配置Puppet服务器的Ruby编码
在Puppet主配置文件(如/etc/puppetlabs/puppet/puppet.conf)中添加编码设置,确保Ruby环境默认使用UTF-8:
[main] ruby_encoding = UTF-8
问题根源
- 变量引用错误:模板输出的是未解码的
@key_encrypt(原始Base64值)而非解码后的局部变量 - 编码不兼容:Ruby默认US-ASCII编码无法处理解码后的非ASCII字符,触发解析错误
内容的提问来源于stack exchange,提问作者jaya
相关产品推荐
相关产品推荐

