厨师组织节点

时间:2014-04-21 19:12:14

标签: chef

我一直在组织我的托管节点说我有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。数据包覆盖。但由于配置在多个地方,因此配置容易出错。

我知道对此没有明确的答案,但我想了解一下将类似配置应用于大量机器时的最佳实践,并且您有几个例外如何处理它们?

2 个答案:

答案 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是使这成为可能的工具。