Chef - 用于设置角色特定属性的模式
Chef - Pattern for setting role specific attributes
我们有一本包含三个食谱的特定应用食谱
秘诀 1. 在服务器上创建存储
秘诀 2. 安装 ngnix
秘诀 3. 安装 JBOSS
方案 1,需要属性来告诉它应该为 ngnix 创建多少个逻辑卷和 Jboss 以及大小。
我们还有三个角色,分别是网络服务器、应用服务器和独立服务器。 standalone 角色将所有 3 个配方集中在同一个 VM 上。但是我们想在生产环境中使用 web-server 和 app-server 角色。
现在的问题是如何拆分存储属性,因为我们不想为 Web 服务器角色提供 Jboss 文件系统。
我们想将存储属性放在角色中,但这显然是一种反模式。
将属性放在食谱中意味着我们必须将食谱 1 包含在食谱 2 和 3 中,这并不优雅,因为 Jboss 食谱只是应该安装 Jboss 而无需担心存储,对吧?
有什么好的方法可以实现吗?
假设web-server
、app-server
和standalone
都是单独的cookbook,只需将数据放在web-server
和app-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 这样的工具可以帮助您维护具有版本约束的整个链。
一开始听起来很复杂,但随着时间的推移,它可以避免生产中的意外更改,因为您对暂存进行了更改,却忘记了它会被传播(通过角色)。
我们有一本包含三个食谱的特定应用食谱
秘诀 1. 在服务器上创建存储
秘诀 2. 安装 ngnix
秘诀 3. 安装 JBOSS
方案 1,需要属性来告诉它应该为 ngnix 创建多少个逻辑卷和 Jboss 以及大小。
我们还有三个角色,分别是网络服务器、应用服务器和独立服务器。 standalone 角色将所有 3 个配方集中在同一个 VM 上。但是我们想在生产环境中使用 web-server 和 app-server 角色。
现在的问题是如何拆分存储属性,因为我们不想为 Web 服务器角色提供 Jboss 文件系统。
我们想将存储属性放在角色中,但这显然是一种反模式。
将属性放在食谱中意味着我们必须将食谱 1 包含在食谱 2 和 3 中,这并不优雅,因为 Jboss 食谱只是应该安装 Jboss 而无需担心存储,对吧?
有什么好的方法可以实现吗?
假设web-server
、app-server
和standalone
都是单独的cookbook,只需将数据放在web-server
和app-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 这样的工具可以帮助您维护具有版本约束的整个链。
一开始听起来很复杂,但随着时间的推移,它可以避免生产中的意外更改,因为您对暂存进行了更改,却忘记了它会被传播(通过角色)。