Puppet从7.4升级至7.11后加载外部节点时出现YAML解析错误
Puppet升级后外部节点加载失败问题解决
错误日志
2024-02-06T12:50:38.562+01:00 ERROR [qtp488725606-52] [puppetserver] Puppet服务器错误:无法加载节点"mynode"的外部节点结果:(<unknown>):扫描块标量时,在第138行第39列预期找到截断或缩进指示符,但发现h(104) /opt/puppetlabs/puppet/lib/ruby/vendor_ruby/puppet/network/http/handler.rb:92:in `respond_to_errors' 2024-02-06T12:50:58.151+01:00 ERROR [qtp488725606-54] [puppetserver] Puppet搜索节点"my node"失败:无法加载节点"my node"的外部节点结果:(<unknown>):扫描块标量时,在第138行第39列预期找到截断或缩进指示符,但发现h(104)
相关代码片段
/opt/puppetlabs/puppet/lib/ruby/vendor_ruby/puppet/network/http/handler.rb:
def respond_to_errors(response) yield rescue Puppet::Network::HTTP::Error::HTTPError => e Puppet.info(e.message) respond_with_http_error(response, e) rescue StandardError => e http_e = Puppet::Network::HTTP::Error::HTTPServerError.new(e) Puppet.err([http_e.message, *e.backtrace].join("\n")) respond_with_http_error(response, http_e) end
环境版本
postgres --version postgres (PostgreSQL) 13.13 puppetdb --version puppetdb version: 7.13.0 puppetserver --version puppetserver version: 7.11.0 puppet --version 7.27.0
问题背景
将Puppet从7.4版本升级至7.11版本,并同步升级PuppetDB后,出现外部节点加载失败的错误。
问题分析
错误提示指向YAML解析失败:外部节点分类器(ENC)返回的YAML内容中,第138行第39列存在格式违规——块标量定义后未找到预期的缩进或截断标记,反而出现了字符h。Puppet 7.x升级后,YAML解析器严格性提升,旧版本允许的不规范格式会触发此类错误。
解决步骤
导出ENC返回的YAML内容
执行你的ENC脚本,获取目标节点的YAML输出:# 替换为实际ENC脚本路径 /path/to/your/enc_script mynode > node_yaml_output.txt定位并修复YAML格式错误
打开生成的node_yaml_output.txt,跳转到第138行检查第39列附近内容:- 块标量以
|或>开头后,后续行必须保持统一缩进,或用...标记结束块 - 移除意外出现的无关字符(如
h),修正缩进格式
示例修复:
# 错误格式 notes: | Server configuration details h # 此处非法字符导致解析失败# 正确格式(保持缩进) notes: | Server configuration details或
# 正确格式(使用截断标记) notes: | Server configuration details ...- 块标量以
验证YAML格式有效性
使用Ruby内置工具校验修复后的内容:ruby -ryaml -e 'YAML.load_file("node_yaml_output.txt")'无报错则说明格式正确。
重启服务并测试
重启Puppetserver后验证节点分类:systemctl restart puppetserver puppet node find mynode --environment production
额外排查方向
- 检查ENC脚本是否在升级过程中被修改,或其依赖的库版本变化导致YAML输出格式改变
- 若使用第三方ENC服务,确认服务返回的YAML符合最新规范
内容的提问来源于stack exchange,提问作者Cifrax777
相关产品推荐
相关产品推荐

