【发布时间】:2019-02-25 11:32:07
【问题描述】:
所以,第一段测试清单代码可以使用“parser validate”并成功验证:
$display = @("END")
Family ${facts['os']['name']}
Name ${facts['os']['family']}
Family ${facts['os']['name']}
Version ${facts['os']['release']['full']}
END
notify { $display : }
但是,下一段清单代码失败并出现以下错误:
Error: Could not parse for environment production: Syntax error at '['
(file: /home/vagrant/puppet/facts.pp, line: 4, column: 21)
此清单未通过上述错误验证:
$display = @("END")
Family ${facts['os']['name']}
Name ${facts['os']['family']}
Family ${facts['os']['family']}
Version ${facts['os']['release']['full']}
END
notify { $display : }
据我所知,既然这都是在一个变量中,只要事实的语法是正确的,应该没有问题。 “Family”、“Version”、“Name”字符串都不应该有所作为。我已经尝试了这些行的任意数量的不同组合,并看到了看起来像是非确定性行为的东西。例如,我无法弄清楚为什么有时它会验证,有时则不会。
我真的很困惑这里使用了什么神秘的验证逻辑。
另一个例子(这个工作和验证),唯一的变化是改变每个测试行的开始,事实部分没有改变。
$display = @("END")
Test ${facts['os']['name']}
Test ${facts['os']['family']}
Test ${facts['os']['family']}
Test ${facts['os']['release']['full']}
END
notify { $display : }
如果这很重要,这是在 VirtualBox vm (Centos 7) 内的 mac 上运行的。
【问题讨论】:
-
无论如何,我无法使用 Puppet 5.5.3 重现此内容。您能否确认您向我们提供了用于在“行:4,列:21”处生成语法错误的文件的确切内容?
-
刚出的Puppet 6我也试过了,都不错
-
@AlexHarvey 我可以在 5.5.6 上重现这个,它还没有绑定到 PE 版本(这就是为什么我猜你在 5.5.3 上测试,因为它是 2018.1.4)。但是,如果它不在这两个版本中,那么这可能是解析器中的回归,它被无意引入然后修复。
-
运行它的操作系统无关紧要,但 Puppet 的版本可能会起作用。如果相同版本的 Puppet,配置相同,有时接受有时拒绝相同的代码,那么很可能是代码上下文中的某些差异造成了差异。
-
好吧,我现在确实重现了它,到目前为止,我在所有版本的 Puppet >= 5 中都找到了它,包括 6。奇怪的是,如果代码被包装在一个类中,它就不会发生。
标签: linux validation parsing puppet