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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 03:42:16