跨环境管理配置文件

35
你们(公司)如何管理所构建的应用程序/系统的配置文件?让我告诉你我们是如何做的,以及存在的问题。
我在一家有15名开发人员的公司工作,我们开发部署在托管服务提供商处的业务Web应用程序。我们主要应用包括一个网站和大约10个WCF服务,其中一些服务互相连接。
我不知道这算是一个大型系统还是小型系统,但我认为在不同环境(测试、验证和生产)中启动和运行这些应用程序需要花费太长时间了。
我们的Visual Studio项目中有每个环境的配置文件,例如web.test.config、web.acc.config、web.prod.config和开发环境下的web.config。它们都有相同的键,但其值可以根据所针对的环境而不同。
如果我快速统计一下Web应用程序的web.config文件中的appsettings,我会数到32个,并且有5个端点。我们有四个环境(开发、测试、验证和生产),这意味着对于一个Web应用程序,总共有128个appsettings和20个端点。我们很容易犯错,尤其是在截止日期逼近时。
我们都是人,任何人都可能出现以下情况:
- 我们更改了某个配置文件,但在构建和部署之前忘记提交。 - 或者我们在Web服务器上进行更改,但忘记相应更新其他四个web.config文件。 - 或者我们只更改了其中的三个配置文件等等。
然后我们有托管服务提供商的基础设施。默认情况下,每个端口都关闭。因此,如果WCF服务之一需要与位于不同服务器上的另一个WCF服务通信,则必须打开受防火墙保护的端口。

我们在测试环境中做了这个,但在验收环境中我们不得不再次执行,而且我们已经忘记了哪些端口必须打开,所以更像是试错:哦,我的服务无法连接到数据库,可能是端口关闭了。同样的问题也可能发生在生产环境中。

根据服务等级协议,我们的托管提供商可能需要几天时间来打开防火墙中的端口,因此这很快就变成一个相当漫长的过程。最终,测试、验收和生产环境的启动大约需要两个月的时间。

因此,我的问题是:您如何管理配置、基础设施以及周围的流程?


1
只是一小部分。在启动时,我有一个检查,应用程序会触及所有资源并报告无响应。 - paparazzo
3
这是一个很棒的问题 - 我希望它有十几个答案。 - Kirk Broadhurst
7个回答

6
Config4* 项目(免责声明:我是其主要开发人员)没有与 .Net 或 WCF 的开箱即用集成,因此对你可能没有用。然而, Config4* 的一个特性与你的问题相关:它具有在配置文件中嵌入 if-then-else 语句的功能,以便文件可以为不同的环境(如开发、测试、验收和生产)“自适应”。
你可能能够修改该概念,使其适用于你的 .Net/WCF 项目中使用的任何配置语法(我不熟悉这些技术,但我猜测它们可能使用基于 XML 的配置文件)。特别地,你可以使用某种脚本语言(比如 Python)编写一个使用 if-then-else 语句来设置环境特定名称=值对的脚本,并使用一些 print 语句来生成针对环境量身定制的配置文件。这样一个脚本的伪代码概述如下:
#--------
# Set up configuration variables suitable for a specified environment
#--------
cfg["variable1"] = "default value";
cfg["variable2"] = "another default value";
if (environment == "testing") {
  cfg["variable1"] = "override default value for this environment";
  cfg["variable3"] = "value suitable for this environment";
  ...
} else if (environment == "production") {
  ...
}
#--------
# Now use print statements to generate configuration files
# Alternatively, use the _name=value_ pairs in the map to
# perform global search-and-replace on template versions of
# configuration files.
#--------
...

为了获得额外的加分,该脚本还可以生成一个测试清单,以检查环境中需要执行的测试,例如:“检查以下端点之间是否需要打开防火墙端口:...”


4

听起来你的环境比较小,可以轻松使用Ansible模板SaltStack来管理所有的配置文件。


我认为你应该委派一个运维/DevOps人员。最好是有一些行业经验的人。这是一个非常基本的运维问题,而且你团队中没有人知道任何这些配置管理工具的事实应该被视为一个严重的警示信号。 - Parthian Shot
但是。我在一份工作中使用过Puppet, 在过去的几年里,我一直在使用Ansible和Salt。Ansible在几十个实例之后不太容易扩展,因为它依赖于SSH,尽管这是开始进行配置管理的好方法,但我认为它并不是一个可行的长期解决方案。Salt更适合长期的可行性,虽然使用上有点学习曲线。 - Parthian Shot

4

我觉得这个回答比较狭隘,只讨论了WCF配置,而这只是系统总体配置的一小部分。 - Kirk Broadhurst

4
我们正在开发一个分布式存储系统,并且我们使用单元测试和集成测试来检测每次构建所遇到的问题。此外,我们使用ReviewBoard让其他开发人员在提交之前查看任何更改。下一步是连续集成服务器(Jenkins),它会自动部署和测试不同环境下的构件。最后,我们的压力测试测试床会针对任何新版本运行,然后发布。

当然,拥有尽可能类似生产环境的测试床非常重要,但如果您总是在相同的托管提供商上部署,那么这应该不太难。
  • 关于您特殊情况中的某些文件可能在其他文件中被遗忘等情况:我想这将很容易用测试脚本进行自动检查。
  • 未提交的更改应该像“git diff master”(或您使用的其他版本控制系统)一样容易检测到。
  • 要知道哪些端口需要为服务打开,似乎更像是适当文档记录的问题,而不是配置管理的问题。
许多使用我们系统的站点也使用Puppet来管理其不同节点的配置。我不确定这是否适用于您,但值得一试。

3
请看http://www.configapp.com上的配置。它的工作方式是您将导入名为web.config的基本配置文件。然后在Web应用程序内部,您将创建4个环境:dev、test、acc和prod。进入dev环境,创建您的环境变量,并设置适合该环境的值。您只需维护一个带有环境变量的配置文件。您可以查看所有环境变量,并轻松查看环境之间的差异。
由于您只需要管理一个配置文件,因此会减少错误。当您添加新的常规/静态配置时,所有环境都会自动拥有该新设置。当您添加可变配置时,只需转到正确的环境选项卡并在那里设置值。您可以查看所有环境的特定配置值,因此这是快速检查是否遗漏了某些内容的方法。您还可以直接查看每个环境的每个配置文件,因为它们都在您面前。您无需RDP / SSH到每台服务器。
由于Config将是主副本,因此您不会忘记进行检查,也不会再直接编辑配置文件。如果您确实直接编辑它们,我们具有diff功能,因此您可以查看主副本和本地副本之间的差异。您可以使用适合团队的各种部署模型将主副本部署到本地服务器。您可以推送、手动拉取、自动拉取或导出/复制。
我们将支持自定义类型,未来可以添加一个端口数据类型。端口验证的一部分将是检查端口是否打开。这仅适用于本地计划,因为它需要访问内部网络。或者您可以手动检查它。转到端口环境变量,并显示当前配置的所有端口。检查列表中的每个端口。如果端口看起来不错,请在Config中添加注释,说明它已经打开并且是在某个日期检查过的。Config旨在进行搜索和文档化。
顺便说一下,我是Config团队的一员。

谢谢,看起来很不错。Configapp 也是一个不错的解决方案! - Johnny
1
看起来你发布的链接已经失效了。有新的网站吗?这个项目还在维护吗? - Matthew S

1
个人而言,如果可能的话,我会以以下方式进行管理:所有“静态”环境设置(数据库连接、LDAP等)都放置在服务器配置文件中(不受代码迁移影响),而“动态”设置则放置在数据库本身中。
因此,我只依赖于数据库团队更新设置(如果您直接访问数据库,这将更容易)。并且我没有风险在我的开发计算机上运行指向生产数据库的代码:D
但是,我没有Visual Studio经验,所以我不确定您是否可以在您的情况下应用类似的方法,但我希望它能给您一些想法。

0

你有没有考虑使用部署管理工具来处理这个问题?我曾经在操作团队中工作,负责部署一个需要相互通信的10个不同系统的产品,所以我非常了解你的情况。整个解决方案的部署需要大约4小时的手动步骤+2小时的测试。我们决定使用Octopus Deploy(https://octopus.com)来自动化部署过程。该工具可以在配置文件中进行变量替换,并且您可以为每个环境定义变量(等等...)。整个解决方案的部署现在只需要大约15分钟,最终结果总是很好的......您还可以直接从TFS、VSTS、Jenkins或TeamCity触发发布创建和部署,这样您就可以拥有非常可靠的CI/CD方法。

希望这能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接