5

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

以下是我想做的例子。

在我的基类中/libraries

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"

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

deploy_revision "/my/deployment/directory/#{deployment[:project]}" do
  # Magically mixin the code from libraries
  environment "RAILS_ENV" => node[:chef_environment]
  restart_command "rake torquebox:deploy"
end

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

谁能指出我正确的方向?我缺少的地方有文档吗?

4

1 回答 1

8

Chef 会在运行时自动将 LWRP DSL 转换为成熟的 Ruby 类。这由菜谱名称后跟文件名称确定(这与创建实际资源名称的方式相同)。

因此,如果您有一本名为的食谱bacon和一个 LWRP bacon/resources/eat.rb,则关联的 LWRP 是bacon_eat. 关联的是该类的驼峰式、常量化版本——在本例中Chef::Resource::BaconEat也是Chef::Provider::BaconEat如此。

这种模式有一个例外 - default. “默认”在 Chef 领域很特殊,因为它没有前缀。因此,如果您有一本名为的食谱bacon和一个位于 中的 LWRP bacon/resources/default.rb,则关联的 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在你的食谱中使用。

于 2013-12-22T17:24:57.237 回答