如何管理所有人使用的单个厨师服务器

时间:2014-08-29 15:45:39

标签: chef

我已经不再是厨师的新手了,尽管不是专家。使用开源厨师,我设置了一个单一厨师服务器,这将包含我公司的所有食谱,旨在将我们的产品应用程序安装在虚拟机上运行基本操作系统,比如RHEL 5.10。我在版本控制中隔离了cookbook文件,但是当我在ONE Chef服务器中将它们汇集时,如何隔离它们呢?以下是我的挑战:

  • 我的公司有不同的产品,比如ProdA,ProdB,ProdA和ProdB完全不同。
  • 尽管这两种产品可能共享共同的应用程序,但每种产品中应用程序的实现都是不同的。例如,即使我在两种产品上安装ActiveMQ,ActiveMQ在每种产品上的安装方式也不同。
  • 此外,我需要能够随心所欲地安装针对ProdA的VM上的不同版本的ProdA软件。与ProdB相同,适用于为ProdB设计的VM。我永远不会在为ProdB定位的VM上安装ProdA软件,反之亦然。
  • 某些烹饪书可能适用于ProdA软件的v1.0,而另一套可能适用于ProdA软件的v2.0
  • 一组开发人员可能会同时处理ProdA烹饪书;一组不同的开发人员可能会在ProdB烹饪书上工作,我希望将每个开发人员与他们隔离开来。他/她的食谱版本。
  • 我想隔离开发者'烹饪书,QA使用的食谱或客户

这是一个简单的工作流程,将我的ActiveMQ扩展到上面提到

  • Dev1在食谱上工作,在ProdA上安装ActiveMQ。此外,Dev11还可以在食谱上安装ProdB上的ActiveMQ。即使他们都是ActiveMQ,安装也是不同的。我们如何隔离两个ActiveMQ cookbook,给它们不同的名字 - ProdA_ActiveMQ与ProdB_ActiveMQ? 这只是看起来很糟糕!
  • Dev2想要调整Dev1的ProdA / ActiveMQ食谱,并在他的本地环境中进行测试。现在Dev2希望其他开发人员尝试它,以便将其上传到厨师服务器。我们怎样才能确保他不会破坏每个人的ActiveMQ安装?
  • ProdA版本1.0-1.4使用ActiveMQ cookbook 0.1.0版本,但ProdA版本1.4-1.20需要ActiveMQ版本0.2.0。我该如何建模?
  • 我正在研究ProdA 2.0版的功能。但我的经理 告诉我在1.44或我们的版本上处理热场问题 产品。我如何快速了解所使用的烹饪书集 安装ProdA的1.44版本?

我知道这可能是一个加载的帖子。有没有更好的论坛?有人能指出我的情景部分完成的链接吗?感谢。

2 个答案:

答案 0 :(得分:3)

大规模运行厨师时,有三种方法可以隔离用户之间的配置。

  1. 使用企业厨师并设立厨师"组织"用于功能组用户
  2. 使用开源厨师服务器并为每个功能用户组设置服务器。
  3. 创建厨师"环境"对于每个功能组,在一个厨师服务器的单个实例中。
  4. 我希望看到更多的讨论或来自大规模经营厨师的用户的出版物。我们中的一些人需要支持不使用厨师的开发团队,并且不能使用一个适合所有服务器设置的开发人员。

    选项1 + 2

    在实践中,我发现企业厨师"组织"在功能上与运行单独的服务器相同。您仍需要将烹饪书,角色,数据包分别加载到每个菜单中。

    我认为这种方法易于理解,但维护起来很复杂。厨师服务器/组织的每个实例都需要自己的厨师仓库,访问密钥和Jenkins加载工作。

    选项3

    使用厨师环境更难理解。一旦正确理解,我认为它实施起来更简单。 Berkshelf是让一切成为可能的工具。

    首先,不要被厨师文档误导。他们提供的环境示例具有全球性:

    • 开发
    • 测试
    • 制作

    这给人的印象是所有生产应用程序都会共享同一套烹饪书。一旦应用程序的数量开始增加,您就会遇到相互冲突的运行时间的麻烦。 Berkshelf v2.0在这里真的很糟糕......经常加载不一致的食谱套装,完全没有警告: - (

    所以.. Berkshelf v3.0拯救和Jamie Winsor的博客上发布的菜谱模式:

    环境菜谱模式为每个应用程序实例提供了一个厨师环境

    • APP1-dev的
    • APP1-测试
    • APP1-刺

    " Berkshelf.lock"已提交并保存到Environment cookbook版本中,用于加载特定环境的cookbook依赖项。这种模式的一个例子是berkshelf-api安装。

    我的灯泡然后我在haproxy cookbook

    中找到了以下厨师搜索条件
    pool_members = search("node", "role:#{node['haproxy']['app_server_role']} AND chef_environment:#{node.chef_environment}") || []
    

    负载平衡池的成员共享一个共同的角色和环境。所以......角色是特定于应用程序实例的,或者是环境!

答案 1 :(得分:1)

正如评论中所提到的,这通常通过使用库和包装器烹饪书来解决。您将拥有共享的activemq食谱(可能来自社区站点或内部编写),它为ActiveMQ提供了核心配置步骤。对于每个环境,您将拥有一个食谱/食谱,如prod_a::activemq,或者为该环境设置所需的任何特定属性或其他内容,然后使用include_recipeactivemq食谱中的LWRP 。您可以找到有关此环境菜谱模式on Jamie's blog的更多信息。如果您想要一个环境-y配置的中间层,您还可以查看poise-appenv。您可以使用knife-solve始终查看给定节点上每个菜谱的哪些版本处于活动状态。