是否可以查看并使用include_recipe方法的返回值?

时间:2015-04-16 15:33:01

标签: ruby chef cookbook

我有2个烹饪书,第一个安装了一些RPM,第二个调整了一些配置。如果已经安装了正确的RPM并且最新的cookbook1没有做任何事情,但是cookbook2没有意识到这一点并且每次都会应用它。

include_recipe 'cookbook1'
include_recipe 'cookbook2'  # < this cookbook should run only if cookbook1 

是否可以根据cookbook1没有做任何更改的事实来应用cookbook2?

这是我目前的解决方案: 我正在检查当前安装的RPM版本是否符合我的要求,然后使用if语句来决定是否需要应用cookbook2:

version_match = system "rpm -qa | grep yum-3.2.22-40.el5.centos"
include_recipe 'cookbook1'

if !version_match 
  include_recipe 'cookbook2'
end

谢谢!

2 个答案:

答案 0 :(得分:1)

回答你的问题 - 不。 include_recipe是一种方法而不是资源。它在Chef-client运行的编译阶段消耗,并且在那时不知道机器的状态。

我的建议是在你的第二个食谱中使用not_if / only_if块。 https://docs.chef.io/resource_common.html#not-if-examples

原因是控制服务器状态。此外,“真实世界”的厨师客户端间隔运行,通常每隔几分钟运行数千台服务器。

如果有人要手动连接到任何一台服务器并对配置文件进行更改,那么大厨将无法知道它,因为整个配方都被跳过了。

另一方面,如果按照最佳实践编写配方/资源,则应该能够每次都运行整个run_list,并将系统置于已知状态,并将更改上传到chef服务器,并让您的整个基础架构在几分钟内达到合规性。

答案 1 :(得分:0)

在食谱之间传递瞬态数据的最佳选择是node.run_state (doc reference)。它不会被保存回Chef服务器,这比使用node对象更有优势。

然而,大多数厨师会指出你所做的并不是幂等的。您的第二个食谱应该描述服务器上资源的最终状态,然后您应该让主厨决定是否需要采取任何措施。因此,正如另一张海报所述,厨师方式&#39;完成您的任务是使用配置文件的模板。除非他们不符合期望的最终状态,否则他们不会被触动。