【问题标题】:How to extend a lightweight provider in Chef如何在 Chef 中扩展轻量级提供程序
【发布时间】:2013-04-13 10:16:40
【问题描述】:

我正在创建一堆不同的 Chef 提供程序来部署不同类型的应用程序。 Extend a Lightweight Provider 的 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 应用部署提供商中:

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

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

谁能指出我正确的方向?是否有我遗漏的文档?

【问题讨论】:

    标签: chef-infra


    【解决方案1】:

    主厨将在运行时automatically convert the LWRP DSL into a full-blown Ruby class。这由食谱名称后跟文件名确定(这与创建实际资源名称的方式相同)。

    因此,如果您有一本名为 bacon 的食谱和一个位于 bacon/resources/eat.rb 中的 LWRP,则关联的 LWRP 为 bacon_eat。关联的 class 是骆驼大小写的常量化版本 - 在本例中为 Chef::Resource::BaconEatChef::Provider::BaconEat

    这种模式有一个例外 - default。 “默认”在 Chef 领域很特殊,因为它没有 加前缀。因此,如果您有一本名为bacon 的食谱和bacon/resources/default.rb 中的LWRP,则关联的LWRP 是bacon(不是bacon_default)。关联的 class 是骆驼大小写的常量版本 - 在这种情况下是 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

    【讨论】:

    • 太棒了,谢谢你的来信。我会尽快抽出时间再次冒险回到 Chef-land 并尝试一下。
    • @sethvargo 您在这里的回答似乎与您关于extending a LWRP 的另一个回答相冲突,您说扩展 LWRP 非常困难。你能澄清一下吗?我对使用simple_iptables LWRP 进行此操作非常感兴趣...
    • 它出现在Chef loads libraries before it loads LWRPs。因此,Resource::DeployRevision 尚未定义。我发现让它工作的唯一方法是将它放在definitions/ 目录中,因为定义是在 LWRP 之后加载的。
    • 另外,从 Chef 12.4.0 开始,您需要使用 Chef::ResourceResolver.resolve(:deploy_revision) 而不是直接引用 Chef::Resource::DeployRevision。见"LWRPs are no longer automatically placed in the Chef::Resource namespace" here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2014-03-06
    相关资源
    最近更新 更多