我一直在组织我的托管节点说我有12台机器5个app,5个db和2个memcache。我有相应的3个角色。这是Dev环境。我有大量机器的登台和生产环境。所以我相应地创建了厨师环境。
Role: app
Nodes: 5 app nodes
Cookbooks: tomcat, java
override_attributes: { java_version: 1.6.0 }
和db和memcache类似......
如果稍后我们决定将java升级到1.7,只需将角色的override_attribute更新为1.7应该影响所有5个节点。
我的问题是,如果我的情况是只有一台机器可以留下1.6.0并且所有1.7都是最佳实践。
我试过的选项, 一个。在cookbook中有一个额外的if节点[fqdn] == HARD_CODED..else条件。但这种情况仅适用于开发环境。暂存和生产都将具有相同的Java版本。我不想要不同的食谱。 湾Override_attributes有一个java_version:1.7,java_1.6_hosts:" exceptional_host"。但是使角色过于复杂。 C。数据包覆盖。但由于配置在多个地方,因此配置容易出错。
我知道对此没有明确的答案,但我想了解一下将类似配置应用于大量机器时的最佳实践,并且您有几个例外如何处理它们?
答案 0 :(得分:1)
我会选择使用节点force_override属性来定义规则的例外。由于node force_override属性为after environment overrides in order of precedence,因此您应该能够在需要保留1.6的一个节点上设置它,然后更新环境以将其他节点移动到1.7。
答案 1 :(得分:0)
厨师的问题是你有很多选择......可供选择吗?
我建议尽可能使用与Berkshelf一致的烹饪书来控制版本控制。
因此,在您的食谱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版本加载到您的厨师服务器中,然后使用环境来控制在运行时使用的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工作流来测试和验证菜谱修订,然后在运行时进行部署。 Berkshelf是使这成为可能的工具。