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

时间:2014-09-04 13:59:03

标签: chef

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

例如,我有一本食谱数据库应用程序。 我已经拥有了可以轻松放入我的环境* .json文件的属性,因为它们适用于所有烹饪书。例如, git_server 。 但是后来我有了像 redis_host 这样的属性,这些属性与cookbook和cookbook不同。 我的应用程序例如应该使用 app.redis.intern ,数据库机器应该使用 db.redis.intern

我可以知道创建属性,例如 redis_host_app redis_host_db ,以使它们仍然在环境中,或者我可以将它们设置在特定食谱中的属性文件中。但后来我必须检查当前哪个环境处于活动状态以决定放入哪些值。因此每个属性文件都有一个switch / if块。

我也可以使用每个环境的数据包,但这也会在命名行包时结束,例如 redis_host_app

这是推荐的解决方法?

2 个答案:

答案 0 :(得分:1)

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

  1. Encrypted data bag
  2. Chef vault
  3. 您可以使用节点的环境来确定要查找的数据条:

    bag_item[node.chef_environment]["some_other_key"]
    

答案 1 :(得分:0)

我想你可能会得到尽可能多的答案,但这里有我的答案:

带有不同属性文件的1 env cookbook

  • common.rb表示所有环境中常见的属性(假设是默认的smtp服务器)
  • envA.rb有一个像return if node.chef_environment != 'envA'
  • 这样的警卫
  • envB.rb还有警卫

在envA中,并且envB为redis_host_appredis_host_db属性。

像这样你可以锁定每个env正确版本的这本食谱(并且也可以轻松回滚)。

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

在您的app cookbook中有一个属性default['my_app']['redis_host'] = node['redis_host_app']

并在db cookbook和属性default['my_db']['redis_host'] = 'node['redis_host_db']

像这样,您可能会在您的应用程序食谱上有一个包装器食谱,它会覆盖redis_host属性,而不必覆盖env属性。