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

时间:2015-04-02 15:46:18

标签: eclipse debugging puppet remote-debugging

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

我已经编写了调试器并了解了Eclipse SDK,但遗憾的是它没有完全映射到Puppet体系结构,这在某种意义上有点尴尬,因为它的运行时堆栈和执行流程不是按自然顺序发生的,也不是事实上,运行时需要目标机器来应用更改。

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

这仍然可能很尴尬,但是会让木偶开发者快速看到像我这样的东西..我无法创建这个目录,因为父路径不存在,等等......为什么这个if语句没有去就像我计划的那样,哦,我在这里看到Puppet在单引号或双引号上不是很清楚,或者现在我知道为什么这会失败,因为这个类没有先执行等等。

相反,我们得到的只是代理控制台上的一个很难看的输出,是的,它可以让我们对错误有所了解,但是并没有干净地将异常映射到我们的代码中,在我的视图中显示了Puppet潜在的痛苦和弱点,至少你能否给我一个堆栈跟踪和行号,所以我知道在哪里看?不,谢谢。

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

有没有人感到这种痛苦? - 邓肯克雷布斯

2 个答案:

答案 0 :(得分:1)

不可能逐步完成" puppet代码,除非你想针对ruby代码库本身进行调试。不仅仅是执行的顺序"目前尚不清楚,它的表现本身从未被一次性执行过。它们实际上在整个执行过程中分多个阶段进行评估。

虽然有很多方法可以简化问题。最大的一个是使用rspec-puppet编写单元测试。它允许你基本上测试puppet的编译阶段,帮助你捕获循环依赖,错误的条件逻辑等错误。

答案 1 :(得分:1)

有一个名为puppet-debugger的新工具,它允许您在puppet代码中设置断点以便逐步执行。所以这不再是“不可能的”#34;因为它可以使用大约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"