【问题标题】:Managing application configuration in a chef environment cookbook在厨师环境食谱中管理应用程序配置
【发布时间】:2014-06-27 19:33:46
【问题描述】:

我是 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.admin用户名
  • 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) 使用说明书文件模板,3) 使用 JSON blob 作为属性之一 [来源 #2],4)... 其他?
  2. 配置文件的可变性非常多样化;如何最好地使用 Chef 管理这些?角色、环境、每个节点的配置、数据包、加密数据包……?还是我应该选择环境变量?

该方法中的一些关键问题:

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

任何经验将不胜感激!

来源

  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

【问题讨论】:

    标签: deployment configuration chef-infra


    【解决方案1】:

    Jamie Winsor 在 chefconf 上做了一次演讲,进一步解释了 environment cookbook pattern's 的原理和用法:

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

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

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

    knife environment edit berkshelf-api-production
    

    总之,厨师给了我们很多选择。我会提出以下一般性建议:

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

    注意事项:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      相关资源
      最近更新 更多