为什么我不能调试我的人偶代码?

Why can't I debug my puppet code?

我正在学习 Puppet,我对整个范例最大的挫折是 try/run/fix 我用来构建功能性 Puppet 代码的开发过程。我的背景是 Java,我自然习惯于调试我的代码以查找错误,而不仅仅是 运行 程序以查看它在哪里轰炸,从而使开发速度更快,但我似乎无法找到使用 Puppet 和 Eclipse 执行此操作的方法。我知道为 Puppet 编写调试器需要一些创造力,但我认为这是社区真正可以从中受益的东西。

我编写过调试器并了解 Eclipse SDK,但不幸的是,它没有完全映射到 Puppet 架构,从某种意义上说,它的运行时堆栈和执行流不是按自然顺序发生的,这有点尴尬事实上,运行时需要目标机器来应用更改。

我很好奇社区是否已完成任何开发工作来尝试创建某种可以步进代码的调试器。为了写这篇文章,我认为使用新的 Puppet 调试配置类型扩展 Eclipse 是有意义的,您可以在其中指定一个目标沙箱主机来测试您的代码以及您要调试的工作区中的一个 puppet 项目(利用现有的 Gepetto 工具)。然后,当您启动一个新的 Puppet 调试会话时,Eclipse 可以连接到远程主机,使用一些额外的调试参数执行 puppet apply,并以某种方式从运行时提供有关当前正在执行的代码行的反馈。

这仍然可能很尴尬,但可以让 puppet 开发人员快速看到诸如 oh duh.. 我无法创建此目录,因为父路径不存在,等等......为什么这个 if 语句不运行就像我计划的那样,哦,我在这里看到 Puppet 在单引号或双引号上不是很清楚,或者现在我明白为什么失败了,因为这个 class 没有首先执行等等

相反,我们得到的只是代理控制台上一个丑陋的大输出,是的,它可以让我们洞察错误,但没有将异常清楚地映射到我们的代码,在我看来,这显示了 Puppet 的潜在痛苦和弱点,你能至少给我一个堆栈跟踪和行号,这样我就知道去哪里找了?不,谢谢。

不要误会我的意思,我喜欢 Puppet 如何让我在整个工作周内看起来非常高效,而我所做的只是 运行 Puppet 应用于我的经理尚未想到的新机器出,但我认为 Puppet 真正有用,缺乏调试支持是需要解决的问题。

还有其他人感受到这种痛苦吗? - 邓肯克雷布斯

"step through" 木偶代码是不可能的,除非您想针对 ruby 代码库本身进行调试。不仅仅是 "execution" 的顺序不清楚,而且清单本身从来没有一次执行过。它们实际上在整个执行过程中分多个阶段进行评估。

虽然有一些方法可以简化查找问题的过程。最大的一个是使用 rspec-puppet 编写单元测试。它可以让您从根本上测试 Puppet 的编译阶段,帮助您捕获循环依赖、不正确的条件逻辑等错误。

有一个名为 puppet-debugger 的新工具,它允许您在 puppet 代码中设置断点以逐步执行它。所以这不再是 "impossible",因为它已经可用了大约 8 个月。

您首先需要安装 puppet-debugger gem https://github.com/nwops/puppet-debugger

然后安装调试模块,将其包含在您的装置中或确保它在您的模块路径中。

https://forge.puppet.com/nwops/debug

然后只需使用 debug::break() 函数在您的代码中设置一个断点。

Ruby Version: 2.0.0
Puppet Version: 4.9.4
Puppet Debugger Version: 0.6.0
Created by: NWOps
Type "exit", "functions", "vars", "krt", "whereami", "facts", "resources", "classes",
     "play", "classification", "types", "datatypes", "reset", or "help" for more information.

>> $vars = ['one', 'two', 'three']
 => [
  [0] "one",
  [1] "two",
  [2] "three"
]
>> $vars.each | String $var | {
  debug::break()
  notify{$var:}
}
From file: puppet_debugger_input20170417-97123-qjwbaj.pp
         1: $vars.each | String $var | {
      => 2:   debug::break()
         3:   notify{$var:}
         4: }
1:>> $var
 => "one"
2:>> exit
From file: puppet_debugger_input20170417-97123-qjwbaj.pp
         1: $vars.each | String $var | {
      => 2:   debug::break()
         3:   notify{$var:}
         4: }
1:>> $var
 => "two"
2:>> exit
From file: puppet_debugger_input20170417-97123-qjwbaj.pp
         1: $vars.each | String $var | {
      => 2:   debug::break()
         3:   notify{$var:}
         4: }
1:>> $var
 => "three"