organizations
Chef 12 有、 和的概念environments
。
您将如何对不同的数据中心进行逻辑建模?
例如,如果您有两个数据中心,有 2 个环境。
us-datacenter
\_ production
\_ stage
eu-datacenter
\_ production
\_ stage
每个环境都有需要指向不同数据库的 Web 服务器
us-prod-web01 => us-prod-db01
eu-prod-web01 => eu-prod-db01
us-stage-web01 => us-stage-db01
eu-stage-web01 => eu-stage-db01
显而易见的答案是创建包含正确数据库的 IP 地址的嵌套数据包。
$datacenter/$environment/web
$datacenter/$environment/database
但是,数据包具有严格的 2 级层次结构,并且我找不到“数据中心”的概念。
如何最好地模拟这种情况?我能想到的两种方法。
使用 2 级数据包
$环境/us-web
$环境/us-database
$环境/eu-web
$环境/eu-database
这样做的缺点是将大量数据包放在一个目录中。即使您将 GUI 与托管 CHEF 一起使用,仍然很难滚动查看数据包。 (8 data centers * 4 environments * 6 types of webservers + 2 types of database servers = a lot )
- 将数据中心变量放在角色/节点属性中,并编写辅助方法来查找正确的数据包。
这是在 IRC 上提出的建议,但是编写辅助方法似乎非常复杂(我是 Chef 的新手,从未做过这样的事情)。此外,对于应该非常常见的用例,这似乎需要重新发明轮子。例如,这可以在 puppet+hiera 中轻松完成
当然,我不是第一个使用 chef 在不同的数据中心进行不同设置的人。
答案1
如果您正在规划单独的数据中心,您可能会遇到两个问题:
一个 Chef 的安装速度太慢,无法支持所有内容 - 您可能最终会每个 DC 安装一个。
很多各种用途的数据包。此时 GUI 和手动编辑不再是问题。每次更改时同步整个存储库会更容易,而不是处理单个文件或在 GUI 中执行任何操作。
你可能会发现有用的(如果你在每个 DC 都有类似的服务)是使用每个环境的全名 - 即“eu-test”、“eu-prod”等,并反转层次结构,这样你最终会得到
/ database
- eu-stage
- eu-prod
- us-prod
/ web
...
和访问/service/$environment
。
我相信不同组织的数据包也是分开的,所以如果你的us
和eu
完全不同,那么它可能很有用。如果它们相似,那么这种分离可能毫无意义。
PS:如果您刚开始使用 chef,请不要将您的服务称为“web”——您很可能很快就会得到另一个具有不同角色的 web 服务器... 给它一个更有意义的名字。“数据库”也一样。
答案2
我最终实施的解决方案是记录在我的博客上
基本上我有 3 个角色和 2 个环境。我根据服务器的位置和类型为其应用多个角色。
- 服务角色 (roleA)
- 覆盖角色(override-roleA)
- 数据中心角色 (datacenter-us-west)
- 生产环境(prod,stage)
层次结构最终看起来像这样: