解析chef-client的JSON文件时出现词法错误问题排查
解决Chef Client解析PowerShell生成JSON时的YAJL语法错误
嘿,我看你在通过PowerShell生成JSON属性文件给Chef Client用的时候,碰到了YAJL解析的语法错误,这就帮你捋捋问题出在哪,怎么解决~
先把你的现有代码和报错信息整理出来,方便排查:
你的现有代码
PowerShell生成JSON文件
New-Item $ATTRIBUTESFILE -ItemType file $jsonInput = @{param1=@{subparam=$attribute}} $ATTRIBUTE = $jsonInput | ConvertTo-Json $ATTRIBUTE | Out-File $ATTRIBUTESFILE
调用Chef Client命令
chef-client -o 'recipe[cookbook]' -j $ATTRIBUTESFILE
报错片段
c:/chef/embedded/lib/ruby/gems/1.9.1/gems/yajl-ruby-1.1.0-x86-mingw32/lib/yajl.rb:36:in `parse': lexic...
问题分析&解决方案
最常见的原因有两个:PowerShell输出JSON的编码不对,或者JSON生成时因为嵌套深度被截断导致格式错误。咱们一步步来修正:
1. 修复编码与JSON生成逻辑
PowerShell的Out-File默认用UTF-16编码,而Chef的YAJL解析器认的是UTF-8(不带BOM),这会直接导致解析失败。同时如果你的$attribute是嵌套对象,默认的ConvertTo-Json深度只有2,会截断数据。
修正后的PowerShell代码:
# 直接构建JSON对象,指定足够的深度避免截断(这里设为10,可根据实际调整) $jsonInput = @{param1=@{subparam=$attribute}} $ATTRIBUTE = $jsonInput | ConvertTo-Json -Depth 10 # 用UTF-8无BOM编码输出,-Force会自动创建/覆盖文件,不用单独New-Item $ATTRIBUTE | Out-File -FilePath $ATTRIBUTESFILE -Encoding utf8 -Force
2. 验证生成的JSON是否有效
生成文件后,先自己验证下JSON格式对不对,避免白跑Chef:
# 读取文件并转成PowerShell对象,成功的话说明JSON没问题 Get-Content $ATTRIBUTESFILE -Raw | ConvertFrom-Json
如果这一步报错,那肯定是$attribute里有特殊字符(比如未转义的双引号、反斜杠),得先把这些字符处理好,比如用[System.Web.HttpUtility]::JavaScriptStringEncode($attribute)来转义字符串。
3. 确保Chef能正确找到文件
调用Chef的时候,最好用绝对路径,避免路径解析出问题:
# 先转成绝对路径 $ATTRIBUTESFILE = Resolve-Path $ATTRIBUTESFILE chef-client -o 'recipe[cookbook]' -j $ATTRIBUTESFILE
额外排查小技巧
- 如果还是报错,把生成的JSON文件内容贴出来看看,大概率能一眼找到语法问题(比如缺引号、逗号错放)。
- 旧版本的YAJL对某些JSON格式支持有限,要是上面的方法都没用,可以试试升级Chef Client到稳定版。
内容的提问来源于stack exchange,提问作者Ayush
相关产品推荐
相关产品推荐

