如何在Chef中扩展轻量级提供程序

时间:2013-04-19 22:35:18

标签: chef

我正在创建一堆不同的Chef提供程序来部署不同类型的应用程序。 Chef Extend a Lightweight Provider的文档表明它是可能的,但实际上并没有说明该怎么做。该页面表明可能需要调用mixin,但我不知道我的代码在/libraries下的文件中应该具有什么结构,或者如何在{{1}下的某些内容中实际包含该代码}}

以下是我想要做的例子。

在我/providers下的基类:

/libraries

在我的Torquebox Rails应用部署提供商中:

repository "http://my.svn.server/#{deployment[:project]}/branches/#{node[:chef_environment]}/"
user "deploy"
scm_provider Chef::Provider::Subversion
svn_username "svn_user"
svn_password "password"

当然还有其他类型的提供商用于不同类型的应用程序。

有人能指出我正确的方向吗?是否有我遗失的文件?

1 个答案:

答案 0 :(得分:7)

厨师将在运行时automatically convert the LWRP DSL into a full-blown Ruby class。这取决于cookbook的名称,后跟文件名(这与创建实际资源名称的方式相同)。

因此,如果您有一个名为bacon的食谱和bacon/resources/eat.rb中的LWRP,则相关的LWRP为bacon_eat。关联的是驼峰式的,已经过组织化的版本 - 在这种情况下为Chef::Resource::BaconEatChef::Provider::BaconEat

此模式有一个例外 - default。 “默认”在Chef土地上是特殊的,因为得到前缀。因此,如果您有一个名为bacon的食谱和bacon/resources/default.rb中的LWRP,则关联的LWRP为bacon(不是bacon_default)。在这种情况下,关联的是驼峰式的,已经过组织化的版本 - Chef::Resource::BaconChef::Provider::Bacon(不是“BaconDefault”)。

好的,为什么背景故事呢?为了扩展LWRP,您希望继承LWRP的类(Rubyism)。因此,在libraries/目录中,您希望扩展自定义资源:

class Chef
  class Resource::MyResource < Resource::Bacon # <- this
  end
end

所以,在你的例子中:

class Chef
  class Resource::MyDeployRevision < Resource::DeployRevision
    def initialize(name, run_context = nil)
      super

      # This is what you'll use in the recipe DSL
      @resource_name = :my_deploy_revision

      # Things like default action and parameters are inherited from the parent

      # Set your default options here
      @repository = "http://my.svn.server/#{node['deployment']['project']}/branches/#{node.chef_environment}/"
      @user = 'deploy'
      @scm_provider = Chef::Provider::Subversion
      @svn_username = 'svn_user'
      @svn_password = 'password'
    end
  end
end

然后在食谱中使用my_deploy_revision