是否可以在shef(chef shell)客户端模式下强制运行run_list

时间:2012-10-11 15:25:31

标签: chef chef-recipe

在调整厨师食谱中的错误时,我通常喜欢登录有问题的机器,输入“shef -z”。在之前成功运行的情况下,已注册的run_list会自动加载所有相关属性和配方,以便我可以直接跳转到尝试违规行。

问题是如果chef-client在第一次运行时失败,则run_list为空,甚至从缓存中删除(急需的)食谱,说“此客户端不再需要它的食谱”。有没有办法强迫shef让我使用我的run_list?

官方维基mentions:

  

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

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

我也尝试过运行独奏模式(“-s -j”),如本blog post中所述。它加载了run_list(没有扩展它,这很奇怪),但当我尝试做任何事情时,我会得到类似的东西:

  

“找不到Cookbook tomcat。如果你从另一个加载tomcat   cookbook,确保在元数据中配置依赖项“。

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

2 个答案:

答案 0 :(得分: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's blog post

答案 1 :(得分:0)

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

shef -z -j /etc/chef/first-boot.json