Chef infra 厨师组织节点
我一直在组织我的托管节点,比如说我有12台机器,5台app,5台db和2台memcache。我有3个角色。这是开发环境。我有大量机器的暂存和生产环境。因此,我创建了相应的厨师环境Chef infra 厨师组织节点,chef-infra,Chef Infra,我一直在组织我的托管节点,比如说我有12台机器,5台app,5台db和2台memcache。我有3个角色。这是开发环境。我有大量机器的暂存和生产环境。因此,我创建了相应的厨师环境 Role: app Nodes: 5 app nodes Cookbooks: tomcat, java override_attributes: { java_version: 1.6.0 } 同样,对于db和memcache 如果以后我们决定将java升级到1.7,只需将角色的overr
Role: app
Nodes: 5 app nodes
Cookbooks: tomcat, java
override_attributes: { java_version: 1.6.0 }
同样,对于db和memcache
如果以后我们决定将java升级到1.7,只需将角色的override_属性更新为1.7就可以影响所有5个节点
我的问题是,如果只有一台机器剩下1.6.0,剩下所有1.7,那么最佳实践是什么
我试过的选择,
A.在cookbook中有一个额外的if节点[fqdn]==硬编码的..else条件。但这种情况仅限于dev环境。暂存和生产都将具有相同的java版本。我不想有不同的食谱。
B覆盖_属性有一个java_版本:1.7,java_1.6_主机:“异常_主机”。但这使得角色过于复杂。
C要覆盖的数据包。但由于配置位于多个位置,因此配置容易出错
我知道这个问题没有明确的答案,但我想了解一下将类似配置应用于大量机器时的最佳做法,您有几个异常如何处理?我会选择使用节点强制覆盖属性来定义规则的异常。由于节点强制覆盖属性是,您应该能够在需要保留在1.6的一个节点上设置它,然后更新环境以将其他节点移动到1.7。chef的问题是您有太多选项。。。选择哪一个 我建议尽可能多地使用cookbooks来控制版本控制 因此,在烹饪书的1.0版中,说明应安装Java6:
node.override[:java][:jdk_version] = '6'
include_recipe "java"
但在烹饪书的2.0版中,将其更改为Java7
node.override[:java][:jdk_version] = '7'
include_recipe "java"
将这两个cookbook版本加载到chef服务器中,然后使用环境控制要在运行时使用的cookbook版本:
{
"name": "myapp-dev",
"json_class": "Chef::Environment",
"description": "For use by development servers",
"cookbook_versions": {
"myapp-java": "= 2.0"
},
"chef_type": "environment"
}
}
{
"name": "myapp-prod",
"json_class": "Chef::Environment",
"description": "For use by production servers",
"cookbook_versions": {
"myapp-java": "= 1.0"
},
"chef_type": "environment"
}
}
这种技术的优点是它更适合现代CI技术。您可以开发一个单独的ALM工作流来测试和验证cookbook修订版,然后在运行时部署它们。Berkshelf是实现这一点的工具