假设您要管理多台服务器,这些服务器提供多种不同的服务,供许多人使用。现在假设您想重新配置或替换其中一台服务器上的某些软件。显然,您不想在生产服务器上工作。
如果这是代码更改,作为开发人员,我会在本地开发机器上进行更改,在本地进行测试,并将更改提交到版本控制系统。然后可以将更改部署到暂存环境中,进一步测试,最后部署到生产环境中。如果需要,我也可以轻松回滚。
一般来说,或者具体来说,在系统管理中如何实现这一点?
(首先想到的是使用虚拟机并将虚拟机映像放入版本控制中,但我确信还有很多我目前不知道的文献和巧妙的解决方案。)
答案1
简短的回答是“操作系统部署管理”、“配置管理”和“软件打包”。详细答案如下。
我想对 Daniel Pittman 的回复进行补充,详细说明系统管理中“系统”的构成。
系统或环境将包括:
- 服务器
- 操作系统
- 配置
- 供应商包;以及
- 本地包
涵盖这些内容的流程如下:
- 操作系统部署或映像
- 配置管理
- 软件包管理
- 审计/日志记录
- 监控
- 备份
您希望将它们结合起来以帮助您实现非功能性目标,例如:
- 重复性
- 可维护性
- 可测量性
- 表现
- 可追踪性
- 可测试性
- 可变性
这是快速的头脑风暴。我相信所有列表都可以添加更多内容。
您的问题涉及许多方面,但并未使用具体词语。例如,您希望能够轻松部署并恢复,即希望可维护性;您希望在测试环境中执行并测试直至通过,即可重复性、可测试性和可测量性;您正在考虑将虚拟机映像置于版本控制中,因为您希望操作系统和配置部署具有可重复性。
有很多工具可以帮助你实现这一点,其中一些是 Daniel 提到的。其他一些是:
- Kickstarts(基于 RedHat)、Preseed(基于 Debian)、WDS(MS Windows)用于部署已知的操作系统环境
- Spacewalk/Satellite(基于 RedHat)、组策略(MS Windows)用于配置和包管理
- YUM 和 APT 打包系统,用于生成、部署、升级和删除软件包(组成一个软件的二进制文件、数据和配置集)
- Nagios、OpenNMS 和 SCOM 用于监控
- Amanda、Bacula 和 Windows Backup Server 用于备份
- Munin、PCP 和 Hyperic 用于性能监控
- CVS、SVN、GIT 或 Bazaar 用于版本控制
- Hudson 和 Jenkins 用于构建管理
- Selenium 和 Robot 用于测试
- Bugzilla、Request Tracker 和 Jira 用于记录、通信和跟踪
再次强调,这不是一个完整的列表,而是我记在脑子里用来指导我的东西,希望它也能帮助到你。
答案2
免责声明:我是 Puppet 的开发人员之一。
显而易见的方法就是应用这些概念:定义开发/测试/生产周期,并通过这些周期推动变更。使用版本控制来跟踪系统。
简而言之,沿着这条路走下去你会发现你真正需要的是能够自动化这些事情的工具 - 本质上,你想要自动化系统管理,这样你就不会在机器上使用这些技术,而是在管理机器的系统上使用它们。
类似的工具厨师,木偶,盐, 和CF引擎都是解决第二个需求的流行工具。它们的工作大体是将系统管理转变为一个可以进行版本控制和测试的中央解决方案。
这DevOps运动是另一个关于如何做到这一点的良好信息来源。虽然准则是开发人员和运营人员之间更好的合作,但它也倾向于同样的方向。
答案3
在 Windows 世界中,这些围绕应用程序生命周期管理的问题正在通过 System Center 2012 得到解决。
在 System Center Virtual Machine Manager (SCVMM) 中,服务使用“服务模板”定义(例如经典的三层服务),执行环境定义为“云”(例如开发、准备、生产)。服务模板可以进行版本控制并(以自动化方式)推广到不同的云。在幕后,SCVMM 负责配置、部署和配置虚拟化硬件(虚拟机等)和软件(操作系统、应用组件等)。
System Center Service Manager 是从流程角度将这些联系在一起的部分。例如,问题管理和变更控制。