我有一本食谱包含两个食谱:recipe/install.rb
和recipe/configure.rb
。
在install.rb
中,我在gem_package
中使用它们安装所有软件包,configure
和configure.rb
。我在gem_package
中安装了一个install.rb
,并在require <that-gem>
中将其用作configure.rb
。
无论运行列表的顺序如何,厨师 - 客户端执行都失败,提到<that-gem>
缺失。如果我先使用install
食谱运行然后运行configure
食谱,那么一切正常。难道没有一种方法可以让单个厨师按顺序运行这两个食谱?我尝试提及include_recipe
和所有可能的解决方案。
答案 0 :(得分:0)
Chef客户端运行有两个阶段。
首先是资源编译阶段,其中所有的ruby都是 加载,解析节点属性并生成运行列表。
接下来是执行阶段,其中运行列表中的配方 执行。
您的食谱所依赖的宝石需要在执行阶段可用,这会产生一些鸡肉或鸡蛋问题,因此您需要使用一些技巧来首先安装宝石。
在为Chef使用宝石时,请使用chef_gem
安装宝石。
chef_gem "your_gem"
require 'your_gem'
如果你开始在libraries中使用gems,这会有点棘手,因为在编译时需要库,并且你无法在编译时间之前进行操作。在这种情况下,您需要在负载上很好地失败,以便可以安装gem。
begin
require 'your_gem'
rescue LoadError
warn "Load of [your_gem] failed. Should be installed by install.rb"
end
然后确保在安装发生之前不要使用gem在Chef运行中提供的任何对象。