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

Chef infra 如何在Chef中扩展轻量级提供程序,chef-infra,Chef Infra,我正在创建一组不同的Chef提供者来部署不同类型的应用程序。厨师的文档表明这是可能的,但实际上并没有说明该怎么做。该页面表明可能需要调用mixin,但我不知道我的代码应该在/libraries下的文件中具有什么结构,也不知道如何将该代码实际包含在/providers下的某些内容中 下面是我想做的例子 在我的基类中的/libraries: repository "http://my.svn.server/#{deployment[:project]}/branches/#{node[:chef_e

我正在创建一组不同的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"
在Torquebox Rails应用程序部署的my provider中:

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
当然,还有针对不同类型应用程序的其他类型的提供者

有人能给我指出正确的方向吗?有我遗漏的文档吗?

厨师会在运行时提供。这是由cookbook的名称后跟文件名决定的(这与创建实际资源名称的方式相同)

因此,如果您有一本名为
培根
的烹饪书和
培根/resources/eat.rb
中的LWRP,那么相关的LWRP就是
培根吃
。在本例中,关联的类是该类的驼峰大小写、常量化版本-
Chef::Resource::BaconEat
Chef::Provider::BaconEat

此模式有一个例外-
default
。“Default”在Chef-land中是特殊的,因为它没有前缀。因此,如果您有一本名为
bacon
的烹饪书和
bacon/resources/default.rb
中的LWRP,那么关联的LWRP就是
bacon
(不是
bacon\u default
)。在本例中,关联的类是该类的驼峰大小写、常量化版本-
Chef::Resource::Bacon
Chef::Provider::Bacon
(不是“BaconDefault”)

好吧,那为什么是幕后故事?为了扩展LWRP,您需要继承LWRP的类(rubysm)。因此,在
库/
目录中,您希望扩展自定义资源:

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

课堂资源::MyResourcesimple\u iptables
LWRPs…似乎很感兴趣。因此,
Resource::DeployRevision
尚未定义。我发现唯一的方法是将其放入
definitions/
目录中,因为定义是在LWRPs之后加载的。而且,从Chef 12.4.0开始,您需要使用
Chef::ResourceResolver.resolve(:deploy\u revision)
而不是直接引用
Chef::Resource::DeployRevision
。看见
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