如何在库模块中使用Chef资源? (或者我应该......)?

时间:2014-04-11 19:33:31

标签: chef chef-recipe

我试图通过在帮助程序库中收集常见的Ruby逻辑来更好地组织一些Chef食谱。我已经看到了在库中声明一个类的示例(即类Chef :: Recipe :: MyHelper),其中包含一些可重用的方法。我也看到了以类似方式使用模块的示例。在我的情况下,我想在其中一些方法中使用资源。

例如,假设我想提供一个帮助方法,该方法通过使用服务资源停止每个服务名称和循环来获取服务名称和循环。我想尽可能地清理配方文件,并通过调用“stopServices(serviceList)”方法保留一些逻辑。

如果我将助手库定义为:

class Chef::Recipe::MyHelper
  def self.stopServices(serviceList)
    serviceList.each do |svc|
      service "#{svc}" do
        action :stop
      end
    end
  end
end

然后在我的食谱中我使用:

MyHelper.stopServices(serviceList)

我收到错误:“Chef :: Recipe :: MyHelper:Class”的未定义方法'服务'。

是否有一种简单的方法可以在这样的库中使用资源? (库是否包含MyHelper作为类或模块)?这只是我违反的不良做法吗?我已经做了很多搜索,找不到有人问过类似的东西让我相信我可能正在做一些我不应该做的事情,所以任何其他的建议都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

Libraries是一种从菜谱配方中抽象出复杂的Ruby代码的方法。

要对资源(Chef DSL代码)进行分组,您应该使用

  • Definitions(最简单的选项),您可以像食谱中的常规Chef资源一样使用它;或
  • LWRPs更复杂但支持不同的操作(请考虑service:start:stop:restart资源;或{{ 1}}您可以package:install:upgrade等资源。

<强>更新

可以解决您的示例问题的定义:

:remove

然后像这样使用它:

# cookbooks/common/definitions/common_stop_services.rb
define :common_stop_services, :services => [] do
  params[:services].each do |svc|
    service svc do
      action :stop
    end
  end
end

Obs:可能值得问一下你是否真的想要在一个常用方法中包含多个服务停止。通常,某些其他资源会通知服务操作(典型示例是配置文件更改通知重新配置的服务重新启动,但其他模式也适用)。

Obs2:CamelCase仅用于Ruby代码中的# my_cookbook/recipes/my_recipe.rb common_stop_services "my_recipe_services" do services [ 'svc1', 'svc2' ] end Classes。我建议您阅读style guide

Obs3:即使您要在库中实现该代码,您也可能不想使用Modules。您永远不会实例化Class,所以您想要的是MyHelper