这里没有单一的“灵丹妙药”答案,这在很大程度上取决于细节。
首先,我认为最佳做法是将所有源代码与单独存储库中的配置分开。因此,源代码仍然是源代码,但它的安装或部署(使用配置、密码等)是另一回事。这样,您就可以将开发人员的任务与系统管理员的任务牢牢分开,并最终建立两个不同的团队来做他们擅长的事情。
当您拥有单独的源代码存储库 + 部署存储库时,您最好的下一个选择是考虑部署选项。我在这里看到的最佳方式是使用所选操作系统的典型部署过程(即按照操作系统维护者的方式为所选操作系统构建自主包)。
例如,Red Hat 或 Debian 打包程序通常意味着从外部站点获取一个 tarball 软件(这将是从您的源代码 VCS 导出源代码)、解包、编译和准备包以准备部署。理想情况下,部署本身应该意味着只需执行一个快速简单的命令来安装软件包,例如rpm -U package.rpm、dpkg --install package.deb 或 apt-get dist-upgrade(假设您构建的软件包会转到 apt-get 能够找到的存储库他们)。
显然,要使其以这种方式工作,您必须为处于完全工作状态的系统的所有组件提供所有配置文件,包括所有地址和凭据。
为了更简洁,让我们考虑一个典型的“小服务”情况:一个 PHP 应用程序部署在 n 个运行 apache/mod_php 的应用程序服务器上,访问 m 个 MySQL 服务器。所有这些服务器(或虚拟容器,这并不重要)都驻留在受保护的专用网络中。为了让这个例子更简单,我们假设所有真正的互联网连接都由一组 k http 加速器/反向代理(例如 nginx / lighttpd / apache)组成,它们的配置非常简单(只是内部 IP转发到)。
我们需要什么才能让他们相互联系并充分发挥作用?
- MySQL 服务器:设置 IP/主机名、设置数据库、提供登录名和密码
- PHP 应用程序:设置 IP/主机名,创建将提及 MySQL 服务器 IP、登录名、密码和数据库的配置文件
请注意,这里有 2 种不同“类型”的信息:IP/主机名是固定的,您可能希望一劳永逸地分配它们。另一方面,登录名和密码(甚至数据库名称)在这里纯粹是为了连接目的 - 以确保 MySQL 确实是我们的 PHP 应用程序连接到它。所以,我在这里的建议是拆分这两种“类型”:
- “永久”信息,例如 IP,应存储在某些 VCS 中(不同于源代码 VCS)
- “临时”信息(例如 2 个应用程序之间的密码)不应存储,而应在生成部署包时生成。
最后一个也是最棘手的问题仍然存在:如何创建部署包?有多种技术可用,主要有两种方法:
- 从 VCS1 导出的源代码 + 从 VCS2 导出的“永久”配置 + 从 VCS3 构建脚本 = 包
- 源代码在VCS1中; VCS2 是一个分布式版本控制(如 git 或 hg),它本质上包含 VCS1 + 配置信息 + 构建脚本的“分支”,可以生成 .我个人更喜欢这种方法,它更短,最终更易于使用,但学习曲线可能有点陡峭,尤其是对于必须掌握 git 或 hg 的管理员来说。
对于上面的示例,我将创建如下包:
-
my-application-php - 这将取决于 mod_php、apache 并将包括像 /etc/my-php-application/config.inc.php 这样的生成文件,其中将包括 MySQL 数据库 IP/主机名和生成为 md5(current source code revision + salt) 的登录名/密码。该软件包将安装在每 n 个应用程序服务器上。理想情况下,它应该能够安装在干净安装的操作系统上,并在无需任何手动操作的情况下构建一个完全正常工作的应用程序集群节点。
-
my-application-mysql - 这将取决于 MySQL-server 并包含以下安装后脚本:
- 启动 MySQL 服务器并确保它会在操作系统启动时自动启动
- 连接到 MySQL 服务器
- 检查所需数据库是否存在
- 如果否 - 创建数据库,使用内容引导它并使用密码创建登录名(与
/etc/my-php-application/config.inc.php 中生成的登录名和密码相同,使用 md5 算法)
- 如果是 - 连接到数据库,应用迁移以将其升级到新版本,终止所有旧登录名/密码并重新创建新的登录名/密码对(同样,使用 md5(revision + salt) 方法生成)
最终,它应该会带来使用 generate-packages && ssh-all apt-get dist-upgrade 之类的单个命令升级部署的好处。此外,您不会将跨应用程序密码存储在任何地方,并且它们会在每次更新时重新生成。
这个相当简单的示例说明了您可以在此处使用的许多方法 - 但是,最终由您来决定哪种解决方案在这里更好,哪种解决方案过于矫枉过正。如果您在此处或作为单独的问题提供更多详细信息,我很乐意尝试详细说明。