厨师图书馆其他菜谱库依赖

时间:2015-03-24 23:07:24

标签: ruby chef

我正在尝试为厨师编写一本公共Aws食谱的包装食谱。我正在制作一个安装CodeDeploy代理的配方,它可以根据区域而改变。我已经编写了几个库来帮助我这样做,但是当我的包装菜谱中的库取决于原始菜谱中的库时,我会陷入困境。我不确定我是否需要在这里做一个require + include(如果我这样做,我不知道要求的路径)。

我的metadata.rb文件中有'依赖'aws“'。

如何正确设置依赖项以便这样做?目前我得到像这样的错误

undefined method `instance_availability_zone' for Chef::Resource::RemoteFile

或者我完全错了吗?

这是有问题的图书馆

module Opscode
  module Aws
    module Ec2
      module Region
        # require '?????' # Do I need this?
        # include Opscode::Aws::Ec2 # Do I need this?
        def instance_region
          # query instance region comes from Opscode::Aws::Ec2
          # this is the dependency. 
          # Using Opscode::Aws::Ec2.instance_availability_zone doesn't
          # work either.
          @@instance_region ||= query_instance_region 
        end
        def query_instance_region
          region = instance_availability_zone
          region = region[0, region.length - 1]
          region
        end
      end
    end
  end
end

这个库的工作原理我知道了需求路径

require File.join(File.dirname(__FILE__), 'ec2_region')
module Opscode
  module Aws
    module CodeDeploy
      include Opscode::Aws::Ec2::Region
      def codedeploy_region_url
        @@region_url ||= query_codedeploy_region_url
      end
      def query_codedeploy_region_url
        region = instance_region
        codeDeployPath = "https://s3.amazonaws.com/aws-codedeploy-#{region}/latest/codedeploy-agent.noarch.rpm"
        codeDeployPath
      end
    end
  end
end

这是食谱

Chef::Resource::RemoteFile.send(:include, Opscode::Aws::CodeDeploy)

remote_file "#{Chef::Config[:file_cache_path]}/codedeploy-agent.rpm" do
  source codedeploy_region_url
end

1 个答案:

答案 0 :(得分:0)

您可能需要使用chef-cache中的已知路径以及cookbook中库的已知路径。

这样的事情应该做:

require File.join(Chef::Config['chef_repo_path'],'cookbooks/aws/libraries/ec2_region')