【问题标题】:How does chef know how to install a package from its package name?厨师如何知道如何从包名安装包?
【发布时间】:2015-02-19 23:31:03
【问题描述】:

我是 Chef 的新手。我了解到 Chef 为资源提供了一个声明性接口。比方说:

我有一个简单的 recipe.rb 文件,后面有一行:

package 'foo'

这一行足以让 Chef 知道如何在运行配方的任何环境中安装包 foo

所以我跑了:

chef-apply recipe.rb

我的问题是..
厨师在内部做什么以在package 资源的上下文中将“声明性”配方转换为“程序性”配方? (即,将声明式配方命令转换为一系列操作以获取和安装包需要哪些步骤)

附注: 关于 Chef 如何解决这个问题的细节很有趣,因为不同操作系统包管理器的包名称不必相同。 apt 索引中作为包 foo 存在的内容可能存在于 yum 索引中作为包 bar 或可能根本不存在。而且 Chef 不会强制要求将食谱绑定到特定的操作系统或包管理器。所以我很好奇在使用 chef-apply 时 Chef 如何处理将此类声明性语句转换为 apt-get、yum 或 brew 等命令。

【问题讨论】:

    标签: chef-infra chef-recipe


    【解决方案1】:

    来自Chef documentation on the package resource

    此资源是用于特定平台上的包管理的其他几个资源的基础资源。虽然可以使用这些特定资源中的每一个,但建议尽可能频繁地使用包资源。有关特定平台的特定资源的更多信息,请参阅以下主题:

    • apt_package
    • bff_package
    • chef_gem
    • dpkg_package
    • easy_install_package
    • freebsd_package
    • ...

    包资源根据需要委托给适当的操作系统级包。如果各种操作系统之间的包名称相同,那么你很幸运。 Chef 将确定使用哪个包管理器并安装该包。

    在你提到的情况下,包被命名为foo for apt 和bar for yum,你必须添加一些额外的逻辑。

    case node[:platform]
    when "ubuntu", "debian"
      package "foo" do
        action :install
      end
    when "centos"
      package "bar" do
        action :install
      end
    end
    

    Chef 仍会处理确定要使用的底层包管理器,因此您不必指定 apt_packageyum_package 资源,但您必须为每个平台提供正确的名称。

    【讨论】:

    • 好的,有道理。事实上,我将package 'apache2' 放入配方中并在 OS X 上运行 chef-apply,它给出了一个错误:Apache2 没有可用的公式
    猜你喜欢
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多