在厨师环境食谱中管理应用程序配置

时间:2014-06-27 19:33:46

标签: deployment configuration chef

我是厨师新手,一直在努力寻找有关如何在环境食谱中配置应用程序配置的最佳实践[来源#1]。

我正在研究的环境食谱应该做到以下几点:

  • 通过创建仅适用于此部署的目录,用户等,为自定义应用程序部署准备节点。
  • 添加特定于应用程序部署的初始化和监视脚本。
  • 定义应用程序配置设置。

这最后的责任是一个特别难以破解的难题。

应用程序部署的示例配置文件可能如下所示:

{
    "server": {
        "port": 9090
    },
    "session": {
        "proxy": false,
        "expires": 100
    },
    "redis": [{
        "port": 9031,
        "host": "rds01.prd.example.com"
    }, {
        "port": 9031,
        "host": "rds02.prd.example.com"
    }],
    "ldapConfig": {
        "url": "ldap://example.inc:389",
        "adminDn": "CN=Admin,CN=Users,DC=example,DC=inc",
        "adminUsername": "user",
        "adminPassword": "secret",
        "searchBase": "OU=BigCustomer,OU=customers,DC=example,DC=inc",
        "searchFilter": "(example=*)"
    },
    "log4js": {
        "appenders": [
            {
                "category": "[all]",
                "type": "file",
                "filename": "./logs/myapp.log"
            }
        ],
        "levels": {
            "[all]": "ERROR"
        }
    },
    "otherService": {
        "basePath" : "http://api.prd.example.com:1234/otherService",
        "smokeTestVariable" : "testVar"
    }
}

此部署配置文件的某些部分比其他部分更稳定。虽然这可能会因应用程序和设置而异,但端口号和用户名之类的东西我更喜欢在环境中保持相同,以简化起见。

让我对配置设置进行分类:

稳定属性

  • 会话
  • 服务器
  • log4js.appenders
  • ldapConfig.adminUsername
  • ldapConfig.searchFilter
  • otherService.basePath
  • redis.port

特定于环境的属性

  • log4js.levels
  • otherService.smokeTestVariable

特定于环境的属性

  • redis.host:rds01.[environment].example.com
  • otherService.basePath:http://api.[environment].example.com:1234/otherService

加密环境特定属性

  • ldapConfig.adminPassword

问题

  1. 我应该如何创建配置文件?一些选项:1)使用应用程序部署本身附带的文件,2)使用cookbook文件模板,3)使用JSON blob作为属性之一[source#2],4)... other?
  2. 配置文件中存在多种多样的可变性;如何最好地使用Chef来管理这些?角色,环境,每节点配置,数据包,加密数据包......?或者我应该选择环境变量吗?
  3. 该方法的一些关键问题:

    • 我更希望只有一种方法来设置配置设置。
    • 更改开发人员的配置文件应该相当简单(他们在推送测试之前在本地计算机上使用Vagrant)。
    • 密码必须安全。
    • 厨师食谱在与源代码相同的git存储库中进行管理。
    • 某些配置设置需要很大的灵活性;例如,我的示例配置中的log4js设置可能包含更多带有数十个非结构化变量的appender

    任何经历都会非常感激!

    来源

    1. http://blog.vialstudios.com/the-environment-cookbook-pattern/
    2. http://lists.opscode.com/sympa/arc/chef/2013-01/msg00392.html
    3. http://jtimberman.housepub.org/blog/2013/01/28/local-templates-for-application-configuration/
    4. http://realityforge.org/code/2012/11/12/reusable-cookbooks-revisited.html

1 个答案:

答案 0 :(得分:3)

Jamie Winsor在chefconf发表演讲,进一步解释environment cookbook pattern's理由和用法:

在我看来,此模式引入的一个关键概念是使用chef environments来控制每个应用程序实例的设置。使用berkshelf更新环境,以及应用程序正在使用的cookbook的运行时版本。

不太明显的是,如果您决定为使用单个应用程序实例保留一个厨师环境,那么使用该环境配置应用程序的全局运行时设置就变得安全了。

如果在berkshelf-api installation instructions中给出的示例。在那里,您将看到正在使用各种运行时设置编辑的生产环境(对于应用程序):

knife environment edit berkshelf-api-production

总之,厨师为我们提供了很多选择。我会提出以下通用建议:

  1. 捕获应用程序指南中的默认值
  2. 为每个应用程序实例创建一个环境(按模式建议)
  3. 在环境中设置运行时属性覆盖
  4. 注意:

    • 另请参阅berksflow工具。旨在使环境菜谱模式更容易实现。
    • 我没有提到使用角色。这些也可用于在运行时覆盖属性,但可能更容易捕获专用厨师环境中的所有内容。角色似乎更适合捕获应用程序组件特有的信息。