我是Chef的新手。我了解到Chef为资源提供了一个声明式接口。让我们说:
我有一个简单的recipe.rb文件,其中包含以下内容:
package 'foo'
这条线足以让Chef了解如何在运行配方的任何环境中安装包foo
。
所以我跑:
chef-apply recipe.rb
我的问题是..
厨师在内部做什么来翻译"声明"食谱进入"程序"在package
资源的上下文中有一个? (即将声明性配方命令转换为一系列获取和安装包的操作所需的步骤是什么)
P.S:
有关Chef如何解决此问题的详细信息很有趣,因为不同OS包管理器的包名称不必相同。 apt 索引中包含foo
的内容可能作为包bar
存在于 yum 索引中,或者可能根本不存在。并且Chef不会将配方强加给特定的操作系统或包管理器。所以我很好奇Chef在使用chef-apply时如何处理将这些声明性语句翻译成apt-get,yum或brew等命令。
答案 0 :(得分:2)
来自Chef documentation on the package resource
此资源是用于特定平台上的程序包管理的其他几种资源的基本资源。虽然可以使用这些特定资源中的每一种,但建议尽可能频繁地使用包资源。有关特定平台的特定资源的详细信息,请参阅以下主题:
- apt_package
- bff_package
- chef_gem
- dpkg_package
- easy_install_package
- freebsd_package
- ...
包资源根据需要委托给适当的操作系统级别包。如果各个操作系统之间的包名相同,那么您很幸运。 Chef将确定要使用的软件包管理器并安装该软件包。
在您提到的情况下,包的名称为foo
为apt,bar
为yum,您必须添加一些额外的逻辑。
case node[:platform]
when "ubuntu", "debian"
package "foo" do
action :install
end
when "centos"
package "bar" do
action :install
end
end
Chef仍将处理确定要使用的基础软件包管理器,因此您不必指定apt_package
或yum_package
资源,但必须为每个平台提供正确的名称