我使用并喜欢 Puppet。我换了一家新公司,他们正在采用 Chef。所以我正在尝试学习 Chef,但很难将它们拼凑在一起,因为我仍然用 Puppet 思考 =)
这些是我的问题:
- 在 Ruby DSL、JSON 还是从管理控制台设置角色更好?为什么有多种方法可以做同一件事?
- 您可以将食谱整理到子目录中吗?例如:我们有一个定制软件,我想为其编写一本食谱,并将其放入:chef-repo/cookbooks/ourcompanystuff/customsoftwarecookbook 这是一种好的做法吗?
- 我是否为每种类型的角色创建一份说明书来指定其功能?我是否让这些说明书包含其他说明书(即我的 Web 服务器角色的说明书包含 Apache 说明书)。我不确定如何处理说明书的相互依赖性和继承性。
- 是否有类似 Puppet 的外部节点分类器的东西,以便节点可以自动确定其角色?
- 似乎你可以用 Knife 或管理控制台进行配置,或者编辑 JSON 文件?这让我非常困惑,为什么有这么多方法可以做事,真是让人不知所措!有什么理由只使用其中一种吗?从 Puppet 来看,使用这些工具似乎很容易意外错误配置某些东西(即遗漏某些东西)
- 如何在开发集群中使用 Chef 自动配置节点?使用 Puppet,我启动一个连接到 puppermaster 的 VM,启动 puppet 运行并自行设置(角色由外部节点分类器确定)。如何使用 Chef 执行此操作?使用 pem/rb 文件安装 chef,将其绑定到 chef 服务器,使用 knife 手动告知节点其角色或在管理界面中编辑它,然后启动 chef-client 运行以自行设置?
我完成了入门教程,并且我看到他们有 EC2 教程,但我从未使用过 EC2,因此很难理解。此时,我已经托管了 Chef 并开始尝试配置单个节点。我该从哪里开始?我需要开始查看公共手册吗?
Opscode 上的文档还不错,但远不如 Puppet 的文档。我在搜索中可能遗漏了其他哪些优秀的 Chef 资源?
答案1
编辑这个问题和答案已经存在好几年了。权威的最佳实践是通过学习 Chef RivalChef Software, Inc. 制作的自定进度培训模块。原始答案的大部分内容如下。
在这个答案中,“Chef”或“chef-client”通常指的是 Chef Infra 产品。Opscode2013 年更名为 Chef Software, Inc。 在2019年4月,Chef开放源代码为其所有产品创建一致的品牌名称。
不清楚在 ruby DSL、JSON 还是从管理控制台设置角色更好?为什么有多种方法可以做同一件事?
2019 年更新:策略文件是最佳工作流程。角色被视为一种低劣做法,Chef Software, Inc. 建议迁移到策略文件。
由于人们的工作流程不同,因此做同一件事的方法也有很多种。您可以选择最适合您环境的工作流程。让我解释一下它们之间的区别,以便您做出明智的决定。
角色的 Ruby DSL 可让您更轻松地编写角色,而无需了解 JSON 语法。这是开始使用角色的简单方法。进行更改后,您可以使用 Knife 将其上传到 Chef 服务器。
knife role from file myrole.rb
这会将角色转换为 JSON 并将其存储在服务器上。如果您的环境强制使用 Chef 存储库作为您的角色的真实来源,那么这种方法非常有效。
JSON 是 Chef Server 存储的内容,因此您也可以直接在管理控制台中编辑 JSON。它确实需要比 Ruby DSL 更多的字段,以便 Knife 正确识别并上传。这些详细信息在一定程度上通过 Web UI 隐藏。
使用 webui/管理控制台编辑角色的缺点是,除非您从服务器下载它们,否则它们不在您的本地版本控制系统中。您可以使用 Knife 执行此操作:
knife role show myrole -Fj
告诉-Fj
Knife“以 JSON 格式显示”。如果愿意,您可以将输出重定向到 .json 文件。
几年前的更新:还有其他用于处理本地 chef 存储库中文件的 knife 命令。目前这些命令仅支持 JSON 格式的文件。社区 RFC是开放的,它将解决为这些插件添加对 Ruby DSL 的支持。以下是工作流程的简要概述。
检查服务器和本地文件之间的内容差异。
knife diff roles/myrole.json
上传 JSON 格式的角色文件。roles/
路径是必需的。这会映射到服务器上的相同 API 端点。
knife upload roles/myrole.json
从服务器下载内容并覆盖存储库中文件的内容。
knife download roles/myrole.json
这些命令来自knife-essentials
,它内置于 chef 客户端包中。
您可以将食谱整理到子目录中吗?例如,我们有一些定制软件,我想为其编写一本食谱,并将其放入:chef-repo/cookbooks/ourcompanystuff/customsoftwarecookbook,这是一个好的做法吗?
否。Knife 对菜谱存放位置有一个预期,因为它使用 API 将菜谱上传到服务器。这是在knife.rb
with中设置的cookbook_path
。在旧版本的 Chef Infra 中,您可以为菜谱指定路径数组,但这种方法已被弃用,因为它需要更多维护,并且会让用户感到困惑。
按照惯例,我们会使用菜谱目录中的名称作为前缀来命名特定于客户或特定于站点的菜谱。例如,它将是:
chef-repo/cookbooks/ourcompany_customsoftware
根据您所做的事情,“ourcompany”可能有多本不同的食谱。
进一步参考:
我是否为每种类型的角色创建一份说明书来指定其功能?我是否让这些说明书包含其他说明书(即我的 Web 服务器角色的说明书包含 Apache 说明书)。我不确定如何处理说明书的相互依赖性和继承性。
角色和食谱之间没有直接的关系或依赖关系。
角色具有运行列表,其中指定应应用于具有该角色的任何节点的配方和其他角色。节点具有可包含角色或配方的运行列表。当 Chef 在节点上运行时,它将扩展其包含的所有角色和配方的运行列表,然后下载所需的食谱。在节点运行列表中:
recipe[apache2]
Chef 将下载apache2
该节点的食谱,以便可以应用该配方。
您可能有一本专门针对基础架构中某个角色的食谱。更常见的情况是,您会有用于设置某些类型的服务的食谱,例如 apache2、mysql、redis、haproxy 等。然后,您会将它们放入适当的角色中。如果您有需要完成特定于应用程序的自定义任务以履行某个角色,那么您可以将其写入自定义食谱(如我上面提到的)。
进一步参考:
是否有像木偶外部节点分类器这样的东西,以便节点自动确定其角色?
“是的。”Chef Infra Server 会自动存储节点数据(以 JSON 格式),并且服务器还会自动索引所有节点数据以供搜索。
进一步参考:
似乎你可以用 Knife 或管理控制台进行配置,或者编辑 JSON 文件?这让我非常困惑,为什么有这么多方法可以做事,真是让人不知所措!有什么理由只使用其中一种吗?
Chef Infra Server 具有用于发送和接收 JSON 响应的 RESTful API。从管理角度来看,Knife 和管理控制台是用于与 API 交互的用户界面。
您可以使用您更喜欢的工具,尽管管理控制台没有 Knife 那么多功能。大多数使用 Chef Infra 的人更喜欢命令行界面,因为它提供了强大而灵活的功能,即使是在 Windows 上使用 Chef Infra 的人也是如此。此外,它knife
是一种基于插件的工具,您可以创建新的插件来与 Chef Infra 服务器或基础设施的其他部分进行交互。
Chef Infra 是一组库、基元和 API。它让您能够灵活地构建最适合您的基础设施的配置管理系统。
进一步阅读:
如何在开发集群中使用 chef 自动配置节点?使用 puppet,我启动一个连接到 puppermatser 的 VM,启动 puppet 运行并自行设置(角色由外部节点分类器确定)。如何使用 chef 执行此操作?- 使用 pem/rb 文件安装 chef,将其绑定到 chef 服务器,使用 knife 手动告知节点其角色或在管理界面中编辑它,然后启动 chef-client 运行以自行设置?
您需要使用 knife bootstrap 插件。这是 knife 附带的内置插件。您可以像这样调用它:
knife bootstrap 10.1.1.112 -x root -i ~/.ssh/root_id_rsa -r 'role[webserver]'
这会:
- 以用户身份使用 SSH 密钥通过 SSH 连接到目标系统 (10.1.1.112)
root
(您可以以另一个用户身份 ssh 然后使用--sudo
)。 - 安装 Ruby
- 安装 Chef
- 为您的 Chef Server 创建 Chef 配置文件,读取 knife 的配置 (.chef/knife.rb)。
- 复制“验证”RSA私钥,节点将使用该私钥自动向Chef服务器注册。
chef-client
使用以逗号分隔的运行列表来运行指定的运行。在此示例中,仅webserver
应用了角色。
这假设目标系统已配置,具有 IP 地址,并且您可以以 root 身份通过 SSH 连接。根据您当地的政策和配置流程,您可能需要调整其工作方式。Wiki 上的 knife bootstrap 页面详细介绍了其工作方式。
Knife 还为许多公共云计算提供商提供插件,例如 Amazon EC2 和 Rackspace Cloud。还有适用于私有云环境的插件,例如 Eucalyptus 和 OpenStack。还有适用于 VMware、Vsphere 和其他公司的插件。您可以在文档中查看更多信息。
进一步阅读:
- https://docs.chef.io/knife_bootstrap.html
- http://docs.chef.io/chef_client.html
- https://speakerdeck.com/jtimberman/anatomy-of-a-chef-run-and-authentication-cycle-1
- https://docs.chef.io/auth.html
- http://lists.opscode.com/sympa/arc/chef-dev/2011-08/msg00055.html
- https://docs.chef.io/plugin_knife.html
- https://docs.chef.io/plugin_knife_custom.html
我在搜索中是否可能遗漏了其他优秀的厨师资源?
这Chef 文档主要文献来源。
这学习 Chef Rival是一系列自导模块,您可以通过这些模块了解 Chef Infra 和其他 Chef 产品的各个方面。
我曾经维护过一个博客,发布有关 Chef Infra 的提示、技巧和指南:http://jtimberman.housepub.org/我有一个名为“快速提示“。由于现实生活情况和其他承诺,我不再有时间维护该网站,但我将来可能会回来。
Chef 客户可以在支持网站上获得帮助和支持:
Chef 用户社区是获得额外帮助的极佳来源:
更多资源请访问Chef Software, Inc. 的网站。
我希望这有帮助。