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

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

我正在学习厨师,但在构建与团队合作的一切方面遇到了问题。

首先,您似乎应该创建一个 chef-repo 文件夹,在其中存储和修改用于管理节点的食谱。

我从事多个项目,每个项目都已在 git 源代码控制下。理想情况下,我会在每个项目中保留一个 chef-repo 文件夹,其中包含该项目的食谱,对吗?

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

我知道菜谱会上传到 chef 服务器然后进行部署。其他团队如何将暂存环境与生产环境分开而不重复大量工作?我们有一个主分支,即我们的生产分支,一个开发分支,即我们的暂存分支(接收不到 5% 的网站请求)和功能分支。大多数情况下,稳定后的开发分支会合并到主分支。我们如何单独上传菜谱,以便能够以不同的方式拥有两个环境?

谢谢您的帮助!

答案1

我负责多个项目,所以 cjc 的解决方案对我来说不起作用。还有一个通用配置与自定义配置的问题(地址等对公司来说是通用的,配置中也有一些神奇之处)。我最终确定的方案有点儿像 hack,但使用起来很方便。

我没有使用global ,而是~/.chef在 chef-repo 中使用 '.chef' 子目录,该子目录不存储在 git 中(它被添加到.gitignore)。我还有一个文件config/knife.rbfile ,它已签入 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"

这样,我实现了整个公司的 Knife 配置标准化,这反过来意味着在 wiki 中共享的任何代码片段或 Knife 调用都适用于所有人。Knife 本身就有足够的混乱和魔力 - 不同的配置只会让情况变得更糟。此外,每个人都能从小魔法片段中受益,例如这个使用knife ssh用户配置的登录~/.ssh/config

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

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

还有一项辅助任务,可以重新打包所有秘密、将 tarball 加密给所有人并将其复制到 Dropbox,以便更轻松地添加新员工或更改秘密。

关于多个环境:Chef 有一个名为环境。我还没有用过,但它应该能满足你的需要。你还可以通过拥有两个独立的 Hosted Chef 组织或 Chef 服务器来严格分离生产环境(以避免开发人员拥有与生产环境相关的任何密钥)。这个 knife.rb 代码片段展示如何根据当前签出的分支以不同的方式配置 Knife - 你可以使用它来设置环境以及 Chef 服务器的 URL。还有名为 knife-flow 的 knife 插件 ,提供更加完整的双组织工作流程。

答案2

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

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

您将无法使用刀具搜索或数据包**。但有些人无论如何都不需要这些功能。

** 嗯,你可以:http://wiki.opscode.com/display/chef/Data+Bags#DataBags-UsingDataBagswithChefSolo

答案3

我家里有两个目录,.chef 和 chef-repo。chef-repo 在 git 中。.chef 是某个私有目录,是 knife 的默认目录。您不必将 .chef 中的机密放入 git;knife 会查找 ~/.chef。

答案4

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

我有一个 ~/projects/ 目录,我将 chef 存储库保存在此目录中。我的服务器配置就在这里。

我上一份工作是在 Ruby-on-Rails 商店担任系统工程师。我们的 nginx、varnish 和 rails 配置(以及其他配置)都放在 chef 存储库中,但 Rails 应用程序本身保存在单独的 git 存储库中,并单独部署。

我们的临时环境是一台运行整个临时环境的服务器。这并不理想,因为它与生产环境不同,生产环境的 Rails 薄和数据库位于不同的机器上。我建议使用 Chef 的环境来分离临时环境和生产环境。(我刚到那里时就是这样的,只是在离开之前没有时间解决这个问题。)

相关内容