在团队环境中管理厨师食谱


13

我正在学习厨师,在组织一切与团队合作方面遇到问题。

对于初学者来说,似乎应该创建一个Chef-repo文件夹,您将在其中存储和修改用于管理节点的食谱。

我从事各种项目,每个项目都已经在git源码控制下。理想情况下,我会在该项目的每个菜谱中都保留一个Chef-repo文件夹,对吗?

但是,在Chef-repo文件夹中,我必须添加一个配置文件夹(.chef),其中包含我的刀配置和我的密钥验证,这些是我特有的。仅将.chef文件夹添加到gitignore文件是否正常?

我了解这些菜谱已上传到厨师服务器,然后进行了部署。其他团队如何在不重复大量工作的情况下将阶段与生产环境分开?我们有一个master分支,这是我们的生产分支,一个dev分支,是我们的登台分支(接收不到网站请求的5%)和功能分支。大多数情况下,稳定时的dev分支会合并到master分支。我们如何分别上传食谱,以便能够以单独的方式拥有两个环境?

谢谢您的帮助!


您可以设置的.chef使用环境变量什么文件夹?
ceejayoz

您能否更详细地描述您的目标?您想使用Chef自动化哪种基础架构?您提到了不同的分支机构-如果您在谈论软件部署,那么像Jenkins这样的CI工具可能是更好的解决方案。
geewiz 2011年

木偶如何原生支持这样的环境真是太好了。
汤姆·奥康纳

Answers:


15

我从事多个项目,因此cjc的解决方案对我不起作用。相对于自定义配置,还有一个问题(地址等是公司通用的,配置中也有一些魔术)。我最终选择的方案有些破绽,但这是一种易于使用的方案。

而不是global ~/.chef,我在chef-repo中使用了“ .chef”子目录,该子目录未存储在git中(已添加到中.gitignore)。我还有一个文件config/knife.rb文件,该文件已签入Git,并包含共享配置。它从以下代码段开始:

root_dir = File.join(File.dirname(__FILE__), '..')
%w(knife-secrets.rb knife-local.rb).each do |conf_name|
  conf = File.join(root_dir, ".chef", conf_name)
  Kernel::load(conf) if File.exists? conf
end

这将加载.chef/knife-local.rb包含自定义配置的文件(在基本版本中,它只是OPSCODE_USER='username'常量,以后将使用,但是可以包含任何刀配置),并且.chef/knife-secrets.rb包含共享机密(AWS密钥等)。

在此之下,有一个常规的刀配置,它使用这些文件中定义的常量,例如:

client_key               "#{root_dir}/.chef/#{OPSCODE_USER}.pem"

这样,我实现了公司范围内刀配置的标准化,这反过来意味着Wiki中共享的任何代码片段或刀调用都将对所有人适用。刀本身有足够的困惑和魔力-不同的配置只会使情况更糟。此外,每个人都可以从小型魔术摘录中受益,例如,这样可以knife ssh利用在用户的~/.ssh/config

还存在共享机密问题:厨师服务器的验证密钥,存储在其中的AWS密钥knife-secrets.rb,EC2的SSH私钥,加密的数据包密钥等等。我们绝对不希望将它们存储在存储库中,或者实际上是在未对其进行安全加密的任何位置。因此,我们将这些文件作为.tar.gz文件分发,该文件经过GPG加密后发送给公司中的每个人,并通过Dropbox共享。

配置所有这些的过程变得越来越复杂,我希望团队中的人们可以实际使用它,所以有了最后一个元素:rake init创建.chef目录,config/knife.rb在其中建立符号链接,解密chef-secrets.tgz和解压缩文件的任务,确保用户的私有Opscode Platform密钥在那里并且.chef/knife-local.rb正确存在配置好后,用符号链接刀插件,并在其中的目录和文件上设置适当的权限。设置此任务是为了安全地在已初始化的存储库上多次运行它(例如,更新机密或小刀插件)。

还有一个帮助程序任务,它将所有秘密重新打包,加密给所有人的tarball,然后将其复制到保管箱,以使添加新员工或更改秘密变得更加容易。

关于多种环境:Chef具有一项称为环境的功能。我还没有使用过它,但是它应该可以满足您的需求。您还可以通过拥有两个单独的托管Chef组织或Chef服务器来严格分离生产环境(以避免开发人员拥有与生产环境有任何关系的任何密钥)。这个knife.rb片段显示了如何基于当前检出的分支以不同的方式配置knife-您可以使用它来设置环境以及Chef服务器的url。还有一个名为knife-flow的knife插件 ,可提供更完整的两组织工作流程。


感谢您的详细回答。至少看到要进行设置的工作意味着我没有错过任何显而易见的事情……
Alex Recarey 2012年

3

您需要设置两台Chef服务器,一台用于生产,一台用于开发。原因是,没有任何一个Chef服务器可以支持分支开发。即使在环境中。

或者,您可以放弃Chef服务器的概念并使用Chef-solo。您可以在Git中维护食谱。您可以分支和合并。您可以忽略刀具凭证的问题,因为您将不再使用它们。

您将无法使用刀具搜索或数据袋**。但是有些人还是不需要这些功能。

**好吧,您可以进行以下整理:http : //wiki.opscode.com/display/chef/Data+Bags#DataBags-UsingDataBagswithChefSolo


2

我家中有两个目录,.chef和chef-repo。Chef-repo在git中。.chef是一些专用目录,这是刀的默认目录。您不必将.chef中的秘密放入git;刀会寻找〜/ .chef。


2

您的〜/ .chef目录不应位于git repo中。

我有一个〜/ projects /目录,该目录下保存我的厨师仓库。这是我的服务器的配置。

我的最后一份工作是在Ruby-on-Rails商店担任系统工程师。我们的nginx,清漆和Rails配置(以及其他配置)都进入了厨师仓库,但是Rails应用程序本身保存在单独的git仓库中,并分别进行了部署。

我们的登台环境是运行整个登台环境的单个服务器。这是不理想的,因为它不像Rails变薄且DB在单独的盒子上的Production。我建议使用Chef的环境来分隔阶段和生产。(那是我到达那里时的样子,在离开之前我没有时间去修复它。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.