在 Chef 中组织代码:库、类和资源

在 Chef 中组织代码:库、类和资源

我对 Chef 和 Ruby 都很陌生,我正在实现一些脚本来学习它们。现在我面临的问题是如何组织我的代码:我在库目录中创建了一个类,并使用了自定义命名空间来维护顺序。这是我的文件的一个简化示例:

# ~/chef-repo/cookbooks/mytest/libraries/MyTools.rb
module Chef::Recipe::EP
    class  MyTools
        def self.print_something( text )
            puts "This is my text: #{text}"
        end
        def self.copy_file( dir, file )
            cookbook_file "#{dir}/#{file}" do source "#{dir}/#{file}" end
        end
    end
end

根据我的菜谱,我将这两种方法称为:

# ~/chef-repo/cookbooks/mytest/recipes/default.rb
EP::MyTools.print_something "Hello World!"
EP::MyTools.copy_file "/etc", "passwd"

print_something 工作正常,但使用 copy_file 时出现此错误:

undefined method `cookbook_file' for Chef::Recipe::EP::FileTools:Class

对我来说,很明显我不知道如何在 Chef 中创建库,或者我不知道一些基本假设。有人能帮帮我吗?我正在寻找这个问题的解决方案(组织我的代码、库、在类中使用资源),或者更好的是,一个好的 Chef 文档,因为我发现文档非常缺乏清晰度和混乱,因此研究它很麻烦。

答案1

错误消息意味着您的类中没有 cookbook_file 方法。模块名称并不意味着类继承,它们仅提供独立的命名空间。如果您想要访问 Chef 方法,则需要对相应的 Chef 类进行子类化。一次性学习 Ruby 和 Chef 需要花费很多时间。编写有效的库需要一些时间,而且大多数情况下不需要。

Chef 中的工作流程尚未标准化。目前仍有许多不同的方法在争夺最佳实践。

不过,我建议你先从 Berkshelf 开始。它将为你构建一个基本的食谱结构。

http://berkshelf.com/

berkshelf 教程(由于限制,无法发布真实网址)

misheska.com/blog/2013/06/16/getting-started-writing-chef-cookbooks-the-berkshelf-way/

Chef 文档正在整理中。有一些旧的、不完整的文档,很难知道哪些是最新的。目前大部分工作都集中在这个网站上:

https://learnchef.opscode.com/

相关内容