2015-03-24 221 views
2

我正在嘗試爲廚師的公衆Aws食譜寫一個包裝食譜。我正在製作一個安裝CodeDeploy代理的配方,它可以根據地區進行更改。我寫了幾個庫來幫助我做到這一點,但是當我的包裝食譜中的庫取決於原始食譜中的庫時,我陷入了困境。我不確定是否需要在這裏做一個require + include(如果我這樣做,我不知道需求的路徑)。廚師圖書館其他食譜圖書館依賴

我在我的metadata.rb文件中有'depends「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 

回答

0

您可能需要與已知從廚師緩存路徑到食譜庫內的已知路徑。

這樣的事情應該做的:

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

謝謝,這似乎工作(與::配置,而不是::配置)。一般來說有沒有更好的方法來做到這一點?當Chef擁有自己的結構和加載庫的方式時,使用像普通ruby這樣的文件路徑似乎很有趣。我認爲Chef可能有某種內置的方法來查找庫依賴關係,特別是對於像這樣的子模塊。 – yoshiwaan 2015-03-25 16:13:41

+0

事實上,是一個錯字,爲糾正編輯 – Tensibai 2015-03-25 16:14:36