我正试图围绕Chef及其许多配置构造:
所以我们有:
这有点压倒性。在深入阅读Chef文档之后,我对以下内容进行了以下理解:
节点(devmyapp01
)是Chef将管理配置的计算机。该节点属于环境(myapp-dev
),并且有一个运行列表,这是一组角色({{1 }})。每个角色都有一个配方,它本身可以有0个可参数化的属性,这些可能在不同的环境中有所不同。例如,mysql-database
角色可能有一个包含mysql-database
属性的配方,该属性是特定表可以增长到的最大大小。也许在DEV中它设置为256 MB但在PROD中它是16 GB等。但是,这与数据包不同,数据包,它像属性一样属于食谱,但不是键值对,基本上是一个JSON球。 Cookbook 是食谱的集合,它以某种方式超越了角色。 模板是一个模板化的Cookbook,它允许某种额外的参数化/自定义层。
现在我确信我的理解要么是错误的,要么至少有些误导。一些厌倦战斗的厨师老手可以采用上述每个概念,并为实际使用中的每一个提供具体的具体例子吗?如果您想坚持我的MySQL数据库示例,可能会有所不同:节点,运行列表,角色,配方,属性,环境,食谱,模板和数据包看起来像是管理MySQL数据库的Chef配置?如果我能看到所有这些结构的实际的,实际的,具体的例子,我实际上可以把我的头围绕着Chef: - )。
答案 0 :(得分:2)
我会去看看。
首先,我将详细介绍您对高级厨师概念的定义,然后尝试解释一下。我认为您对节点和环境的理解是正确的。
run_list 不一定是一组角色。它是要执行的配方和角色的有序列表。可以将角色视为一类节点,但节点可以具有多个角色。它定义了run_list和一组属性。将角色放入运行列表时,所有配方都将添加到节点run_list和应用于节点的属性中。请注意,属性有一个复杂的优先顺序,因为它们可以在多个位置定义(请参阅有关属性的主厨文档)。
食谱应该配置一个软件。为此,您可以定义属性(数据),模板(将数据注入文件,例如配置文件),食谱(您指定的位置)安装软件需要做些什么,以及其他一些我现在要省略的方法。至关重要的是,你没有提到的是资源。配方(应该)是声明性的,因此您声明应该对资源执行的操作。例如,创建模板或重新启动服务。
数据包有点奇怪。首先,它们不属于配方。他们是全球性的。它们横切了烹饪书和环境。有可用的普通和加密数据包。我建议你在使用数据包之前先考虑一下。使用它们的主要原因是存储敏感数据,如密码,尽管有更新的工具来处理这些数据(太多无法覆盖)。当它圆顶结构数据袋包含数据袋项目。这些项是json对象,可以存储为json。
现在,一个快速的mysql焦点示例。我们可以有一个节点dev_db_01,它可以属于dev环境。为了论证,我们可以运行chef-client,其中包含my_org_common角色的run_list和mysql默认配方。这是一个角色和一个食谱。该角色可能包含各种食谱。在所有配置通用事物,用户/访问权限,包管理器等的服务器上运行基本角色是很常见的。然后你的mysql :: default recipe会安装mysql。 Mysql是包含配方的食谱(顺便说一下,我不是在看这个例子的开源mysql食谱,但如果你要管理mysql,你应该使用一组默认属性和一些模板。你可以在一个默认属性和一些模板中覆盖这些属性。您还可以将密码存储在加密的数据包中(简单,但是大厨中的安全数据管理本身就是一个主题)。运行配方时,它可以渲染模板以生成配置文件,其中包含密码或在环境中存储密码。配置值由chef属性参数化。您还可以安装mysql包并使用包和服务资源启动服务。
我希望有所帮助。我已经掩盖了很多细节,但我认为这对于高级概述是必要的。厨师有更多的概念/工具/实践,但我认为你需要阅读/写一些简单的食谱来先感受一下。
答案 1 :(得分:2)
你在食谱中有很多部分,对应于目录:
node['cpu']['real']*3
在食谱的根目录中,您将找到一个名为metadata.rb
的强制文件,它定义了烹饪书名称,版本及其依赖关系。
让我们选择database
和mysql cookbooks
。
在mysql cookbook中,定义了mysql_user
,mysql_database
等特定资源。数据库cookbook使用这些资源,它取决于mysql cookbook中的代码。
这就是为什么你会在metadata.rb
这样的depends 'mysql', '>= 5.0.0'
中找到一条线。my-mysql
。该行告诉chef在加载数据库cookbook时加载版本5.0.0或更高版本的mtsql cookbook(如果在chef-server上可用)。
简短的一个:运行chef-client的计算机。 长一个:运行chef-client的目标系统,使系统处于所需状态。该节点也是chef中的对象,我们存储run_list,并存储有关节点的属性(ram,cpu,jdk version,mysql version等)。
节点上的属性来自不同的源,ohai(ram,cpu,disk,os type等)收集的自动属性与加载的cookbook中的属性,来自角色的属性和来自环境的属性合并属于。 See here了解此部分的详细信息;
运行列表是节点的一个属性,列出了我们要应用于此节点的配方和角色。
角色是一种帮助,它为您提供了一种定义属性的方法,以及一个应用于一个或多个节点的运行列表。共识是避免在角色中设置属性,因为它们在服务器端不受版本控制,并且通常是跨环境的。
一个易于理解的缺点是,当你已经在线设置时,mysql上的密码更改。你有dev / QA和PROD 3服务器。如果您对角色进行了更改,那么当您可能希望在测试结果正常后限制为开发然后QA然后PROD时,它将应用于所有环境。
解决方法是使用食谱来做同样的事情,使用依赖于此包装器食谱中的metadata.rb和include_recipe来定义运行列表,并使用此cookbooks属性文件来设置公共属性在角色中。
环境是您的节点的逻辑组,您可以按照dev / QA / PROD作为您的工作环境,或者您可以使用某种系统(Web服务器/数据库服务器)并最终混合使用(Dev_web-服务器,Dev_db-server等)。节点只能属于一个环境。
环境也可以托管属性,通常是dns服务器,特定于此环境的smtp服务器等。与角色相同的警告,它们不受版本控制,但范围较小,因为它的目标是逻辑组节点。
环境的主要兴趣是食谱版本限制。您可以控制每个环境中哪个版本的菜谱可用。当您正在使用新版本的食谱但不希望它应用于您的所有服务器时,这会很方便。如果您更改my-mysql
食谱属性文件中的某个myslq参数,您希望限制何时对所有环境进行更改,限制将帮助您,QA和PROD限制您的{{1当您的开发环境允许使用版本B时,版本A中的cookbook。
正如其名称暗示的那样,数据库是一种数据存储。它是一组Json文件,每个文件都是一个DataBagItem,并且包含转换为mash的json,以便在加载时用于配方。
DataBags的目标是存储只读数据,从配方更新数据库是危险的,每个项目都作为一个整体保存,两个试图同时写入同一个对象的节点将进入竞争状态而另一个改变将会失去。
数据库的主要目的是存储您不希望在食谱/角色中设置的常用对象(管理员用户列表等)。
我尝试在此段落上简单介绍此documentation on the chef-run here。
我们有一个运行chef-client的节点,它会询问厨师服务器(或阅读命令行)以了解它的运行列表。然后将扩展此运行列表(搜索要在角色中加载的配方)。在这个早期阶段,ohai将被执行以收集自动属性。
之后从服务器(或以独奏/本地模式的磁盘)加载所有烹饪书,处理限制和依赖性并读取所有属性文件。
现在编译配方,在此阶段执行配方的ruby代码,并构建资源集合。此时机器上没有任何变化。
编译完所有配方后,资源集合就绪,请检查并尝试将每个资源置于所需状态。我; e:收敛阶段。
如果目录不存在,将创建目录。模板将被渲染,然后与目标进行比较,如果它们不匹配,目标将被替换。检查服务的状态,如果所需状态为:start
且服务停止,厨师将尝试启动它。
收敛完成后,节点状态将保存在chef-server上。