我从事多个项目,因此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插件 ,可提供更完整的两组织工作流程。
.chef
使用环境变量什么文件夹?