我正在学习厨师,并且遇到了一些与我的团队合作的问题。
对于初学者来说,似乎应该创build一个厨师回购文件夹,您将在其中存储和修改用于pipe理节点的食谱。
我在各种项目上工作,他们每个人都已经在git源代码pipe理下。 理想情况下,我会保留一个厨师回购文件夹在我的每个项目与项目食谱对吗?
然而,在厨师回购文件夹中,我必须添加一个configuration文件夹(.chef)与我的刀的configuration和我的密钥validation,这些都是特定于我。 将.chef文件夹添加到gitignore文件是否正常?
我明白食谱上传到厨师服务器,然后部署。 其他团队如何在不重复大量工作的情况下从生产环境中分离出舞台? 我们有一个主分支是我们的生产分支,是我们的分支分支(接收不到5%的网站请求)和特色分支的开发分支。 大多数时候,稳定时的开发分支合并到主分支。 我们如何分别上传食谱,以便能够以单独的方式分配两种环境?
谢谢您的帮助!
我与多个项目合作,所以cjc的解决scheme不适合我。 还有一个常见的问题和自定义configuration(地址等是公司常见的,configuration中也有一些魔术)。 我最终决定的scheme有点破解,但这是一个方便使用的scheme。
而不是全局~/.chef
,我使用chef-repo中的'.chef'子目录,它不存储在git中(它被添加到.gitignore
)。 我也有文件config/knife.rb
文件被检入Git并包含共享configuration。 它从这个片段开始:
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
这会加载包含自定义configuration的文件.chef/knife-local.rb
(在基本版本中它只是OPSCODE_USER='username'
常量,但它可以包含任何刀形configuration)和.chef/knife-secrets.rb
其中包含共享的秘密(AWS密钥等)。
在这之下,有一些常规的刀具configuration使用这些文件中定义的常量,例如:
client_key "#{root_dir}/.chef/#{OPSCODE_USER}.pem"
这样,我就可以在整个公司实现刀片configuration的标准化,这意味着在wiki中共享的任何代码片段或刀片调用都适用于每个人。 刀本身有足够的困惑和魔力 – 不同的configuration只会使其变得更糟。 另外,每个人都可以获得小魔术片段的好处,就像这个使用knife ssh
使用loginconfiguration在用户的~/.ssh/config
还有共享秘密的问题:厨师服务器的validation密钥,存储在knife-secrets.rb
AWS密钥,EC2的SSH私钥,encryption的数据包密钥等等。 我们绝对不希望将它们存储在存储库中,或者实际上,它们不会被安全地encryption。 所以我们把这些文件分发成一个.tar.gz
文件,这个文件被GPGencryption到公司的每个人,并通过Dropbox共享。
configuration所有这些变得越来越复杂,我希望团队中的人员真正使用这个东西,所以最后一个元素是:创build.chef
目录的rake init
任务,在那里创buildsymlinks config/knife.rb
,解密和解密chef-secrets.tgz
文件,确保用户的私有Opscode平台键在那里,并且.chef/knife-local.rb
被正确configuration,符号链接刀片插件,并且在目录和文件里设置适当的权限。 这个任务的设置是为了在已经初始化的版本库上运行多次是安全的(例如更新机密或者刀片插件)。
还有一个帮手任务,重新包装所有的秘密,encryption到所有人的压缩包,并将其复制到保pipe箱,使其更容易添加新员工或更改秘密。
关于多种环境:厨师有一个称为环境的function。 我还没有使用它,但它应该做你所需要的。 你也可以通过两个独立的主办厨师组织或厨师服务器严格分离生产环境(以避免开发人员有任何与生产环境有关的任何密钥)。 这个knife.rb片段展示了如何基于当前签出的分支以不同的方式configuration刀 – 您可以使用它来设置环境以及厨师服务器的URL。 还有一个名为knife-flow的刀片插件 ,提供了更完整的双组织工作stream程。
您需要设置两个Chef服务器,一个用于生产,一个用于开发。 原因是没有一个厨师服务器可以支持分支开发; 即使有环境。
或者你可以放弃厨师服务器的概念,并使用厨师独奏。 你可以在Git中维护你的食谱。 你可以分支和合并。 您可以忽略刀凭证的问题,因为您不会再使用它们。
您将无法使用刀子search或数据包**。 但有些人不需要这些function。
**那你可以sorting: http : //wiki.opscode.com/display/chef/Data+Bags#DataBags-UsingDataBagswithChefSolo
我家有两个目录,.chef和chef-repo。 厨师回购在git。 .chef是一些私人目录,这是knife的默认目录。 你不必把.chef的秘密放到git中, 刀会寻找〜/ .chef。
你的〜/ .chef目录不应该在git仓库中。
我有一个〜/ projects /目录下,我保留我的厨师回购。 在这个去我的服务器的configuration。
我最后的工作是在Ruby-on-Rails商店担任系统工程师。 我们的nginx,varnish和railsconfiguration(除其他之外)进入厨师仓库,但Rails应用程序本身保存在单独的git仓库中,并单独部署。
我们的分段环境是运行整个分段环境的单个服务器。 这并不理想,因为它不像Rails和DB在单独的盒子上的生产。 我会推荐使用厨师的环境来区分舞台和制作。 (我到那儿的时候是这样的,在我离开之前我没有时间去解决这个问题。)