Chef infra 厨师组织节点

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

我一直在组织我的托管节点,比如说我有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,只需将角色的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是实现这一点的工具