Chef - 用于设置角色特定属性的模式

Chef - Pattern for setting role specific attributes

我们有一本包含三个食谱的特定应用食谱

方案 1,需要属性来告诉它应该为 ngnix 创建多少个逻辑卷和 Jboss 以及大小。

我们还有三个角色,分别是网络服务器、应用服务器和独立服务器。 standalone 角色将所有 3 个配方集中在同一个 VM 上。但是我们想在生产环境中使用 web-server 和 app-server 角色。

现在的问题是如何拆分存储属性,因为我们不想为 Web 服务器角色提供 Jboss 文件系统。

我们想将存储属性放在角色中,但这显然是一种反模式。

将属性放在食谱中意味着我们必须将食谱 1 包含在食谱 2 和 3 中,这并不优雅,因为 Jboss 食谱只是应该安装 Jboss 而无需担心存储,对吧?

有什么好的方法可以实现吗?

假设web-serverapp-serverstandalone都是单独的cookbook,只需将数据放在web-serverapp-server的属性文件中即可。

web-server 中你会得到类似的东西:

# attributes/default.rb
default['mystorage']['nginxdata'] = 2 # Some size

# recipes/default.rb
include_recipe 'myapp::storage'
include_recipe 'myapp:nginx'

并且在 app-server 中你可能有这样的东西:

# attributes/default.rb
default['mystorage']['jboss1'] = 2 # Some size
default['mystorage']['jboss2'] = 2 # Some size

# recipes/default.rb
include_recipe 'myapp::storage'
include_recipe 'myapp:jboss'

在您的存储配方中,只需遍历数据即可创建您的卷:

node['mystorage'].each do |volume_name, size|
   # Something ...
end

由于评论的格式不够清晰,因此将其写为答案。

我非常怀疑 nginx 或 jboss 安装方法因您的应用而异,因此您只需要覆盖应用说明书中的属性即可。

所以你最终得到了 coderanger 的回答:每个基础设施工作 1 本说明书(nginx、jboss、存储)

然后 1 个应用食谱 - 将此应用程序的属性值提供给基础设施说明书。 - 取决于特定版本的基础设施说明书 - 有 3 个食谱: - 1 个包括存储和 nginx - 1 个包括存储和 jboss - 1 包括之前的两个(别麻烦,2 include_recipe 同一个不会有问题,厨师很聪明,只包括一次)

在您的节点上,您将使用其中一个配方设置运行列表。 您可以控制在特定时间为您的应用实际设置的 jboss 或 nginx 版本(您不能使用 role)

属性加载和配方编译的工作方式将使您的应用程序说明书属性覆盖 nginx 说明书中的属性(例如),然后将为 nginx 编译配方。

只需确保 include_recipe nginx/jboss 在您的应用程序部署代码之前,这样您就可以确定 nginx/jboss 在您尝试部署到它之前已经设置好。

揭露我的案子(我想离你的不远):

我们有 53 个内部应用程序,53 个食谱设置属性(例如 jvm 选项)。 我们有 20 个应用服务器对,所以大约有 60 本说明书(1 本用于集群,1 本用于集群中的每个实例)

每个实例说明书设置服务器名称和部署目录。 每个集群说明书都依赖于应用程序说明书并包含它们的食谱(使用前面提到的部署目录)

像 berkshelf 这样的工具可以帮助您维护具有版本约束的整个链。

一开始听起来很复杂,但随着时间的推移,它可以避免生产中的意外更改,因为您对暂存进行了更改,却忘记了它会被传播(通过角色)。