3

在调试厨师食谱中的错误时,我通常喜欢登录有问题的机器,输入“shef -z”。如果之前有一次成功运行,注册的 run_list 会自动加载所有相关的属性和配方,这样我就可以直接跳进去尝试有问题​​的行。

问题是如果 chef-client 在第一次运行时失败,run_list 是空的,shef 甚至从缓存中删除(非常需要的)食谱,说“这个客户端不再需要它的食谱”。有什么方法可以强制 shef 让我使用我的 run_list 吗?

官方wiki提到:

“运行列表的设置方式与普通厨师客户端运行的方式相同。”

但尝试“-j”似乎没有帮助。

我也尝试过运行单人模式(“-s -j”),正如这篇文中所解释的那样。它加载 run_list (没有扩展它,这很奇怪),但是当我尝试做任何事情时,我会得到类似的东西:

“找不到食谱 tomcat。如果您从另一个食谱加载 tomcat,请确保在元数据中配置依赖项”。

请注意,我的配方有几十个 3 级深的依赖项,因此手动将所有代码粘贴到 shef 并不是一个真正的选择。我目前的解决方法是上传一个修改过的配方,其中所有可能有问题的部分都被注释掉(并从那里手动继续),但我希望有一个更好的选择。

4

2 回答 2

2

当您在客户端或单人模式下启动 shef 时,默认情况下不包含配方,因为 shef 的一个用例是确定配方可能根本无法加载的原因,例如导致某些异常的编译时错误。

因此,您需要使用 include_recipe 来包含您希望使用的食谱。您可以对节点运行列表中的所有角色/配方自动执行此操作:

node.run_list.expand(node.chef_environment).recipes.each do |r|
  include_recipe r
end

有关这方面的更多信息,以及使用 Shef 调试 Chef-client 运行的许多其他重要技巧,请参阅Steven Danna 的博客文章

于 2012-10-12T00:13:57.910 回答
0

当 Chef 第一次运行时,它会创建 /etc/chef/first-boot.json 文件,其中包含运行列表。尝试运行:

shef -z -j /etc/chef/first-boot.json
于 2012-10-11T15:42:29.383 回答