Chef 配置实例构建
Chef Configuration Constructs by Example
我正在努力思考 Chef 及其许多配置结构:
所以我们有:
- 节点
- 运行 列表
- 角色
- 食谱
- 属性
- 环境
- 食谱
- 模板
- 甚至还有 1 个东西不在该图上:数据包
这有点让人不知所措。在深入阅读 Chef 文档后,我对所有内容有了以下 理解:
A Node (devmyapp01
) 是 Chef 将为其管理配置的机器。该节点属于 Environment (myapp-dev
) 并且它有一个 运行 List 这是一组 角色 (mysql-database
)。每个角色都有一个 Recipe,它本身可以有 0+ 个可参数化的 Attributes,这在不同的环境中可能不同。例如,mysql-database
角色可能有一个包含 MAX_TABLE_SIZE
属性的食谱,这是特定 table 可以增长到的最大大小。也许在 DEV 中它被设置为 256 MB 但在 PROD 中它是 16 GB,等等。然而,这不同于 Data Bag ,它像属性一样属于配方,但是而不是键值对,基本上是一个 JSON 球。 Cookbook 是一组以某种方式超越角色的食谱。 Template 是一个模板化的 Cookbook,它允许 parameterization/customization.
的某种附加层
现在我确定我的理解要么完全错误,要么至少有点误导。一些厌倦战斗的 Chef 老手能否接受上述每个概念,并在实际使用中为每个概念给出具体的具体示例?如果您想坚持使用我的 MySQL 数据库示例,可能会有不同之处:节点、运行 列表、角色、食谱、属性、环境、食谱、模板和数据包看起来像厨师配置管理 MySQL 数据库?如果我能看到所有这些构造的真实、实用、具体的示例,我可能真的能够围绕 Chef :-).
我试试这个。
首先,我将仔细阅读您对高级厨师概念的定义,并尝试阐明一些知识。我认为您对 node 和 environment 的理解很好。
A run_list 不一定是一组角色。它是要执行的配方和角色的有序列表。一个角色可以被认为是一个class节点,尽管一个节点可以有多个角色。它定义了一个 run_list 和一组属性。当一个角色被放入 运行 列表时,所有的配方都被添加到节点 run_list 并且属性被应用到节点。请注意,属性的优先顺序很复杂,因为它们可以在多个地方定义(请参阅有关属性的厨师文档)。
一个cookbook应该配置一个软件。为此,您可以定义 attributes(数据)、templates(将数据注入文件,例如配置文件)、recipes (您可以在其中指定安装软件需要执行的操作)以及其他一些我暂时省略以保持简单的内容。至关重要的是,您没有提到的是 资源 。配方是(应该)声明性的,因此您可以声明应该对资源执行的操作。例如,创建模板或重启服务。
数据包有点奇怪。首先,它们不属于食谱。它们是全球性的。他们横切食谱和环境。有普通和加密的数据包可用。我建议您在使用数据包之前三思。使用它们的主要原因是存储密码等敏感数据,尽管有更新的工具来处理此类数据(太多无法涵盖)。当它指向结构数据包时包含数据包项。这些项目是 json 对象,可以存储为 json.
现在,一个快速 mysql 重点示例。我们可以有一个属于开发环境的节点 dev_db_01。出于争论的考虑,我们可以 运行 具有 my_org_common 角色和 mysql 默认配方的 run_list 厨师客户端。这是一种作用和一种方法。该角色可以包含各种食谱。在配置通用事物、users/access 权限、包管理器等的所有服务器上都有一个基本角色 运行 是很常见的。然后您的 mysql::default 配方将安装 mysql。 Mysql 是包含食谱的食谱(顺便说一句,我没有在看这个例子的开源 mysql 食谱,但如果你正在管理 mysql 你应该,一组默认属性和一些模板。您可以在角色或环境中覆盖这些属性。您还可以将密码存储在加密的数据包中(简单,但 Chef 中的安全数据管理本身就是一个主题)。当你 运行 它可以呈现模板以生成配置文件的配方,其中配置值由 chef 属性参数化。您还可以安装 mysql 包并使用包和服务资源启动服务。
希望对您有所帮助。我已经掩盖了很多细节,但我认为这对于高层次的概述是必要的。厨师中有更多 concepts/tools/practices,但我认为您需要 read/write 一些简单的食谱才能先了解一下。
什么是食谱?
你的菜谱有很多部分,对应目录:
- Attributes : 此目录将包含 ruby 文件以定义稍后在食谱中使用的默认属性。
- Recipes:包含 ruby 定义资源(目录、文件、服务)及其所需状态的文件。
- files :在这里你将存储你希望在 hosts 上部署的静态文件(例如登录横幅)
- resources and providers, library 它们用于定义自定义资源或助手在食谱中使用
- templates :在这里您将定义文件模板,它们是一种在 host 上定义文件的方法,这些文件是 host 相关的,您可以为模板提供变量并使用内部的节点属性(将 mysql 中的线程数设置为 cpu 数的 3 倍,例如可以像
node['cpu']['real']*3
在说明书的根目录下,您会找到一个名为 metadata.rb
的必需文件,它定义了说明书的名称、版本及其依赖项。
什么是依赖关系?
让我们以 database
和 mysql cookbooks
.
在 mysql 食谱中,定义了特定资源,如 mysql_user
、mysql_database
等。数据库说明书使用此资源,它取决于 mysql 说明书中的代码。
这就是为什么您会在其 metadata.rb
中找到这样一行的原因 depends 'mysql', '>= 5.0.0'
。此行告诉 chef 加载 5.0.0 或更高版本的 mtsql 说明书,如果在加载数据库说明书时在 chef-server 上可用。
什么是节点?
简而言之:chef-client 所在的计算机 运行。
长篇:一个目标系统,其中 chef-client 是 运行 使系统处于所需状态。该节点也是 chef 中的对象,我们在其中存储 run_list 以及关于节点的存储属性(ram、cpu、jdk 版本、mysql 版本等。 )
节点上的属性来自不同的来源,ohai 自动收集的属性(ram、cpu 的数量、磁盘、os 类型等)与加载的 cookbook 中的属性合并,来自角色的属性和来自节点所属环境的属性。 See here这部分的详细信息;
运行列表是什么?
运行列表是节点的一个属性,它列出了我们要应用到该节点的配方和角色。
什么是角色?
角色是一种帮手,它为您提供了一种定义属性和 运行列表以应用于一个或多个节点的方法。共识是避免在角色中设置属性,因为它们在服务器端不受版本控制,并且通常是 cross 环境。
一个容易理解的缺点是当您已经在线设置时在 mysql 上更改密码。您在 dev/QA 和 PROD 中有 3 个服务器。如果您对角色进行更改,当您可能希望限制为开发然后是 QA,然后是 PROD,一旦测试正常,它将应用于所有环境。
解决方法是使用食谱来做同样的事情,使用依赖于 metadata.rb 和 include_recipe 在此 wrapper 食谱中定义 运行list,并使用此 cookbooks 属性文件来设置角色中的公共属性。
什么是环境?
环境是您的节点的逻辑组,您可以按照 dev/QA/PROD 作为您的工作环境,或者您可以按系统类型 (web-servers/db-servers) 并最终混合两者 ( Dev_web-servers、Dev_db-server 等)。一个节点只能属于一个环境。
一个环境也可以host属性,通常是一个dns服务器,一个特定于这个环境的smtp服务器等。与角色一样的警告,它们不受版本控制,但范围较窄这里是因为它针对的是一组逻辑节点。
环境的主要兴趣是食谱版本限制。您可以控制在每个环境中可以使用哪个食谱的哪个版本。当您正在使用新版本的食谱但不希望它应用于您的所有服务器时,这会派上用场。如果您在 my-mysql
cookbook 属性文件中更改某些 myslq 参数,您将希望限制在所有环境中进行更改的时间,该限制将帮助您,让 QA 和 PROD 限制您的 my-mysql
当允许您的开发环境使用版本 B 时版本 A 中的说明书。
什么是数据包?
顾名思义,数据包是一种数据存储。它是一组 Json 个文件,每个文件都是一个 DataBagItem 并包含 json 转换为混搭以在加载时用于食谱。
DataBags 的目标是存储只读数据,从配方更新数据包是危险的,每个项目都作为一个整体保存,两个节点试图同时写入同一个对象将进入竞争状态一个变化是 lost。
databags 的主要用途ose 是存储您不想在 cookbook/role.
中设置的公共对象(管理员用户列表等)
所以都粘在一起了
我试图就这一段给出一个简单的看法documentation on the chef-run here。
我们有一个节点 运行ning chef-client,它会询问 chef-server(或读取命令行)以了解它的 运行list。然后将扩展此 运行 列表(搜索要在角色中加载的食谱)。前期会执行ohai收集自动属性。
之后从服务器(或 solo/local 模式下的磁盘)加载所有食谱,注意限制和依赖性并读取所有属性文件。
现在编译食谱,在此阶段执行食谱的 ruby 代码,并构建资源集合。此时机器上没有任何变化。
编译完所有配方后,资源集合就准备好了,检查它并尝试使每个资源都处于所需状态。 I;e:收敛阶段。
如果目录不存在,将创建目录。模板将被渲染,然后与它们的目标进行比较,如果它们不匹配,目标将被替换。检查服务的状态,如果所需状态是 :start
并且服务已停止,厨师将尝试启动它。
收敛完成后,节点状态将保存在 chef-server 上。
我正在努力思考 Chef 及其许多配置结构:
所以我们有:
- 节点
- 运行 列表
- 角色
- 食谱
- 属性
- 环境
- 食谱
- 模板
- 甚至还有 1 个东西不在该图上:数据包
这有点让人不知所措。在深入阅读 Chef 文档后,我对所有内容有了以下 理解:
A Node (devmyapp01
) 是 Chef 将为其管理配置的机器。该节点属于 Environment (myapp-dev
) 并且它有一个 运行 List 这是一组 角色 (mysql-database
)。每个角色都有一个 Recipe,它本身可以有 0+ 个可参数化的 Attributes,这在不同的环境中可能不同。例如,mysql-database
角色可能有一个包含 MAX_TABLE_SIZE
属性的食谱,这是特定 table 可以增长到的最大大小。也许在 DEV 中它被设置为 256 MB 但在 PROD 中它是 16 GB,等等。然而,这不同于 Data Bag ,它像属性一样属于配方,但是而不是键值对,基本上是一个 JSON 球。 Cookbook 是一组以某种方式超越角色的食谱。 Template 是一个模板化的 Cookbook,它允许 parameterization/customization.
现在我确定我的理解要么完全错误,要么至少有点误导。一些厌倦战斗的 Chef 老手能否接受上述每个概念,并在实际使用中为每个概念给出具体的具体示例?如果您想坚持使用我的 MySQL 数据库示例,可能会有不同之处:节点、运行 列表、角色、食谱、属性、环境、食谱、模板和数据包看起来像厨师配置管理 MySQL 数据库?如果我能看到所有这些构造的真实、实用、具体的示例,我可能真的能够围绕 Chef :-).
我试试这个。
首先,我将仔细阅读您对高级厨师概念的定义,并尝试阐明一些知识。我认为您对 node 和 environment 的理解很好。
A run_list 不一定是一组角色。它是要执行的配方和角色的有序列表。一个角色可以被认为是一个class节点,尽管一个节点可以有多个角色。它定义了一个 run_list 和一组属性。当一个角色被放入 运行 列表时,所有的配方都被添加到节点 run_list 并且属性被应用到节点。请注意,属性的优先顺序很复杂,因为它们可以在多个地方定义(请参阅有关属性的厨师文档)。
一个cookbook应该配置一个软件。为此,您可以定义 attributes(数据)、templates(将数据注入文件,例如配置文件)、recipes (您可以在其中指定安装软件需要执行的操作)以及其他一些我暂时省略以保持简单的内容。至关重要的是,您没有提到的是 资源 。配方是(应该)声明性的,因此您可以声明应该对资源执行的操作。例如,创建模板或重启服务。
数据包有点奇怪。首先,它们不属于食谱。它们是全球性的。他们横切食谱和环境。有普通和加密的数据包可用。我建议您在使用数据包之前三思。使用它们的主要原因是存储密码等敏感数据,尽管有更新的工具来处理此类数据(太多无法涵盖)。当它指向结构数据包时包含数据包项。这些项目是 json 对象,可以存储为 json.
现在,一个快速 mysql 重点示例。我们可以有一个属于开发环境的节点 dev_db_01。出于争论的考虑,我们可以 运行 具有 my_org_common 角色和 mysql 默认配方的 run_list 厨师客户端。这是一种作用和一种方法。该角色可以包含各种食谱。在配置通用事物、users/access 权限、包管理器等的所有服务器上都有一个基本角色 运行 是很常见的。然后您的 mysql::default 配方将安装 mysql。 Mysql 是包含食谱的食谱(顺便说一句,我没有在看这个例子的开源 mysql 食谱,但如果你正在管理 mysql 你应该,一组默认属性和一些模板。您可以在角色或环境中覆盖这些属性。您还可以将密码存储在加密的数据包中(简单,但 Chef 中的安全数据管理本身就是一个主题)。当你 运行 它可以呈现模板以生成配置文件的配方,其中配置值由 chef 属性参数化。您还可以安装 mysql 包并使用包和服务资源启动服务。
希望对您有所帮助。我已经掩盖了很多细节,但我认为这对于高层次的概述是必要的。厨师中有更多 concepts/tools/practices,但我认为您需要 read/write 一些简单的食谱才能先了解一下。
什么是食谱?
你的菜谱有很多部分,对应目录:
- Attributes : 此目录将包含 ruby 文件以定义稍后在食谱中使用的默认属性。
- Recipes:包含 ruby 定义资源(目录、文件、服务)及其所需状态的文件。
- files :在这里你将存储你希望在 hosts 上部署的静态文件(例如登录横幅)
- resources and providers, library 它们用于定义自定义资源或助手在食谱中使用
- templates :在这里您将定义文件模板,它们是一种在 host 上定义文件的方法,这些文件是 host 相关的,您可以为模板提供变量并使用内部的节点属性(将 mysql 中的线程数设置为 cpu 数的 3 倍,例如可以像
node['cpu']['real']*3
在说明书的根目录下,您会找到一个名为 metadata.rb
的必需文件,它定义了说明书的名称、版本及其依赖项。
什么是依赖关系?
让我们以 database
和 mysql cookbooks
.
在 mysql 食谱中,定义了特定资源,如 mysql_user
、mysql_database
等。数据库说明书使用此资源,它取决于 mysql 说明书中的代码。
这就是为什么您会在其 metadata.rb
中找到这样一行的原因 depends 'mysql', '>= 5.0.0'
。此行告诉 chef 加载 5.0.0 或更高版本的 mtsql 说明书,如果在加载数据库说明书时在 chef-server 上可用。
什么是节点?
简而言之:chef-client 所在的计算机 运行。 长篇:一个目标系统,其中 chef-client 是 运行 使系统处于所需状态。该节点也是 chef 中的对象,我们在其中存储 run_list 以及关于节点的存储属性(ram、cpu、jdk 版本、mysql 版本等。 )
节点上的属性来自不同的来源,ohai 自动收集的属性(ram、cpu 的数量、磁盘、os 类型等)与加载的 cookbook 中的属性合并,来自角色的属性和来自节点所属环境的属性。 See here这部分的详细信息;
运行列表是什么?
运行列表是节点的一个属性,它列出了我们要应用到该节点的配方和角色。
什么是角色?
角色是一种帮手,它为您提供了一种定义属性和 运行列表以应用于一个或多个节点的方法。共识是避免在角色中设置属性,因为它们在服务器端不受版本控制,并且通常是 cross 环境。
一个容易理解的缺点是当您已经在线设置时在 mysql 上更改密码。您在 dev/QA 和 PROD 中有 3 个服务器。如果您对角色进行更改,当您可能希望限制为开发然后是 QA,然后是 PROD,一旦测试正常,它将应用于所有环境。
解决方法是使用食谱来做同样的事情,使用依赖于 metadata.rb 和 include_recipe 在此 wrapper 食谱中定义 运行list,并使用此 cookbooks 属性文件来设置角色中的公共属性。
什么是环境?
环境是您的节点的逻辑组,您可以按照 dev/QA/PROD 作为您的工作环境,或者您可以按系统类型 (web-servers/db-servers) 并最终混合两者 ( Dev_web-servers、Dev_db-server 等)。一个节点只能属于一个环境。
一个环境也可以host属性,通常是一个dns服务器,一个特定于这个环境的smtp服务器等。与角色一样的警告,它们不受版本控制,但范围较窄这里是因为它针对的是一组逻辑节点。
环境的主要兴趣是食谱版本限制。您可以控制在每个环境中可以使用哪个食谱的哪个版本。当您正在使用新版本的食谱但不希望它应用于您的所有服务器时,这会派上用场。如果您在 my-mysql
cookbook 属性文件中更改某些 myslq 参数,您将希望限制在所有环境中进行更改的时间,该限制将帮助您,让 QA 和 PROD 限制您的 my-mysql
当允许您的开发环境使用版本 B 时版本 A 中的说明书。
什么是数据包?
顾名思义,数据包是一种数据存储。它是一组 Json 个文件,每个文件都是一个 DataBagItem 并包含 json 转换为混搭以在加载时用于食谱。
DataBags 的目标是存储只读数据,从配方更新数据包是危险的,每个项目都作为一个整体保存,两个节点试图同时写入同一个对象将进入竞争状态一个变化是 lost。
databags 的主要用途ose 是存储您不想在 cookbook/role.
中设置的公共对象(管理员用户列表等)所以都粘在一起了
我试图就这一段给出一个简单的看法documentation on the chef-run here。
我们有一个节点 运行ning chef-client,它会询问 chef-server(或读取命令行)以了解它的 运行list。然后将扩展此 运行 列表(搜索要在角色中加载的食谱)。前期会执行ohai收集自动属性。
之后从服务器(或 solo/local 模式下的磁盘)加载所有食谱,注意限制和依赖性并读取所有属性文件。
现在编译食谱,在此阶段执行食谱的 ruby 代码,并构建资源集合。此时机器上没有任何变化。
编译完所有配方后,资源集合就准备好了,检查它并尝试使每个资源都处于所需状态。 I;e:收敛阶段。
如果目录不存在,将创建目录。模板将被渲染,然后与它们的目标进行比较,如果它们不匹配,目标将被替换。检查服务的状态,如果所需状态是 :start
并且服务已停止,厨师将尝试启动它。
收敛完成后,节点状态将保存在 chef-server 上。