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

5 chef-infra

我正在创建一堆不同的Chef提供程序来部署不同类型的应用程序.Chef的扩展轻量级提供商的文档表明它是可行的,但实际上并没有说明要做什么.该页面表明可能需要调用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"
Run Code Online (Sandbox Code Playgroud)

在我的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
Run Code Online (Sandbox Code Playgroud)

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

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

set*_*rgo 7

Chef将在运行时自动将LWRP DSL转换为完整的Ruby类.这取决于cookbook的名称,后跟文件名(这与创建实际资源名称的方式相同).

因此,如果你有一个名为bacon和LWRP 的食谱bacon/resources/eat.rb,相关的LWRP是bacon_eat.关联是将骆驼套管,constantized版本- Chef::Resource::BaconEat并且Chef::Provider::BaconEat在这种情况下.

这种模式有一个例外 - default."默认"在Chef土地上是特殊的,因为它没有前缀.因此,如果您有一个名为bacon和LWRP 的食谱bacon/resources/default.rb,相关的LWRP是bacon(不是bacon_default).在这种情况下,相关的是骆驼式的,并发化的版本 - Chef::Resource::Bacon而且Chef::Provider::Bacon(不是"BaconDefault").

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

class Chef
  class Resource::MyResource < Resource::Bacon # <- this
  end
end
Run Code Online (Sandbox Code Playgroud)

所以,在你的例子中:

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
Run Code Online (Sandbox Code Playgroud)

然后my_deploy_revision在你的食谱中使用.