Chef infra 处理不同烹饪书和环境的凭据

Chef infra 处理不同烹饪书和环境的凭据,chef-infra,Chef Infra,我在EC2上有一个基于Vagrant和staging/production的开发环境。 供应由厨师完成。 我正在考虑为不同的环境组织凭证的最佳方式 例如,我有一本食谱数据库和应用程序。 我有一些属性,我可以轻松地将它们放入我的环境*.json文件中,因为它们适用于所有的烹饪书git_服务器例如。 但是我有一些属性,比如redis\u host,它们在不同的食谱中有所不同。 例如,我的应用程序应该使用app.redis.intern,数据库机器应该使用db.redis.intern 我可以创建属性

我在EC2上有一个基于Vagrant和staging/production的开发环境。 供应由厨师完成。 我正在考虑为不同的环境组织凭证的最佳方式

例如,我有一本食谱数据库应用程序。 我有一些属性,我可以轻松地将它们放入我的环境*.json文件中,因为它们适用于所有的烹饪书git_服务器例如。 但是我有一些属性,比如redis\u host,它们在不同的食谱中有所不同。 例如,我的应用程序应该使用app.redis.intern,数据库机器应该使用db.redis.intern

我可以创建属性,如redis\u host\u appredis\u host\u db,使它们仍在环境中,或者我可以在特定烹饪书的属性文件中设置它们。但接下来我必须检查哪个环境当前处于活动状态,以决定输入哪些值。所以每个属性文件都有一个switch/if块

我也可以使用每个环境的数据包,但最终也会将数据包命名为redis\u host\u app


处理这个问题的推荐方法是什么?

我想你可能会得到和其他人一样多的答案,但我的答案是:

1个具有不同属性文件的env cookbook

  • common.rb
    用于所有环境中通用的属性(假设为默认smtp服务器)
  • envA.rb
    顶部有一个防护装置,如
    return if node.chef_environment!='envA'
  • envB.rb
    也带有防护装置
在envA和envB中,a
redis\u host\u app
和a
redis\u host\u db
属性

这样,您就可以在每个env中锁定此食谱的正确版本(并且也可以轻松回滚)

缺点是您必须将此cookbook设置在每个节点运行列表的顶部(但可以在引导时完成),或者使您的cookbook依赖于它

在应用程序cookbooks中,有一个属性
default['my\u app']['redis\u host']=node['redis\u host\u app']

在db cookbook和attribute
default['my\u db']['redis\u host']='node['redis\u host\u db']


这样,您的应用程序cookbook上可能有一个包装器cookbook,它覆盖了
redis\u host
属性,而不必覆盖env属性。

凭据需要保护,因此我反对使用节点属性。相反,我将提供两种选择之一:

  • 您可以使用节点的环境来确定要查找的数据包:

    bag_item[node.chef_environment]["some_other_key"]
    

    如果您使用chef vault,请查看一种在资源调配期间使用chef vault项目的方法