在调试厨师食谱中的错误时,我通常喜欢登录有问题的机器,输入“shef -z”。如果之前有一次成功运行,注册的 run_list 会自动加载所有相关的属性和配方,以便我可以直接跳进去尝试有问题的行。
问题是,如果chef-client 在第一次运行时失败,run_list 是空的,shef 甚至会从缓存中删除(非常需要的)食谱,说“这个客户端不再需要它的食谱”。有什么方法可以强制shef让我使用我的run_list?
官方维基 mentions:
但尝试“-j”似乎没有帮助。
我还尝试运行单人模式(“-s -j”),如 blog post 中所述。它加载 run_list (没有扩展它,这很奇怪),但是当我尝试做任何事情时,我得到如下内容:
请注意,我的配方有几十个 3 级深度的依赖项,因此将所有代码手动粘贴到 shef 并不是一个真正的选择。我目前的解决方法是上传一个修改过的配方,其中所有可能有问题的部分都被注释掉了(并从那里手动继续),但我希望有一个更好的选择。
最佳答案
当您在客户端或单人模式下启动 shef 时,默认情况下不包含配方,因为 shef 的一个用例是确定配方可能根本没有加载的原因,例如导致某些异常的编译时错误。
因此,您需要使用 include_recipe 来包含您希望使用的食谱。您可以使用以下命令为节点运行列表中的所有角色/配方自动执行此操作:
node.run_list.expand(node.chef_environment).recipes.each do |r|
include_recipe r
end
有关这方面的更多信息,以及使用 Shef 调试厨师客户端运行的许多其他重要技巧,请参阅 Steven Danna's blog post
关于chef-infra - 是否可以在 shef 的(chef shell)客户端模式下强制加载 run_list,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12843144/