【问题标题】:Why can't I debug my puppet code?为什么我不能调试我的 puppet 代码?
【发布时间】:2015-06-07 15:40:33
【问题描述】:

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

我已经编写了调试器并且知道 Eclipse SDK,但不幸的是它并没有清晰地映射到 Puppet 架构,这有点尴尬,因为它的运行时堆栈和执行流程不是按自然顺序发生的,而且事实上运行时需要目标机器来应用更改。

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

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

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

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

其他人有这种痛苦吗? - 邓肯·克雷布斯

【问题讨论】:

    标签: eclipse debugging puppet remote-debugging


    【解决方案1】:

    有一个名为 puppet-debugger 的新工具,它允许您在 puppet 代码中设置断点以单步执行它。所以这不再是“不可能的”,因为它已经推出了大约 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"
    

    【讨论】:

    • 谢谢,听起来值得一试!
    【解决方案2】:

    除非您想针对 ruby​​ 代码库本身进行调试,否则“单步执行”puppet 代码是不可能的。不仅仅是“执行”的顺序不明确,清单本身从来没有一次执行过。它们实际上在整个执行过程中分多个阶段进行评估。

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

    【讨论】:

      猜你喜欢
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      相关资源
      最近更新 更多