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

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解析器严格性提升,旧版本允许的不规范格式会触发此类错误。

解决步骤

  1. 导出ENC返回的YAML内容
    执行你的ENC脚本,获取目标节点的YAML输出:

    # 替换为实际ENC脚本路径
    /path/to/your/enc_script mynode > node_yaml_output.txt
    
  2. 定位并修复YAML格式错误
    打开生成的node_yaml_output.txt,跳转到第138行检查第39列附近内容:

    • 块标量以|或>开头后,后续行必须保持统一缩进,或用...标记结束块
    • 移除意外出现的无关字符(如h),修正缩进格式
      示例修复:
    # 错误格式
    notes: |
    Server configuration details
    h # 此处非法字符导致解析失败
    
    # 正确格式(保持缩进)
    notes: |
      Server configuration details
    

    或

    # 正确格式(使用截断标记)
    notes: |
      Server configuration details
    ...
    
  3. 验证YAML格式有效性
    使用Ruby内置工具校验修复后的内容:

    ruby -ryaml -e 'YAML.load_file("node_yaml_output.txt")'
    

    无报错则说明格式正确。

  4. 重启服务并测试
    重启Puppetserver后验证节点分类:

    systemctl restart puppetserver
    puppet node find mynode --environment production
    

额外排查方向

  • 检查ENC脚本是否在升级过程中被修改,或其依赖的库版本变化导致YAML输出格式改变
  • 若使用第三方ENC服务,确认服务返回的YAML符合最新规范

内容的提问来源于stack exchange,提问作者Cifrax777

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 18:13:09