2013-03-11

基础设施即代码


  • DevOps不仅仅是工具

确实如此,同样敏捷也不仅仅是工具,它是一系列思想,概念以及最佳实践等。

这听起来很好,但是我要怎样成功实现它呢?

工具能够带来行为的改变并最终改变文化【Patrick Debois】

就像古登堡打印机这个工具最终引起印刷文化的变化,敏捷开发离开持续集成将变得不可能。DevOps依赖一些工具来实现它的理念。

不幸的是,正如每个人都会认为自己足够聪明,每个能够支持云计算的工具都声称自己是DevOps。

但是,现在有这样的约定:实现DevOps概念的关键是基础设施即代码,能够允许我们处理基础设施即代码的工具才是DevOps。

DevOps已经发展很久,现在它被标准化为像Chef或Puppet这样的工具。以前,你能够编写自己的脚本来自动化服务器安装,配置等等,当时每个人都会以自己的方式来做。现在,Puppet或者Chef已经有自己的通用语言,通用语言允许以模块或者食谱(modules or recipes)的方式共享和重用配置。


  • 基础设施即代码,关键概念

基础设施应该被视为代码的概念非常强大。服务器配置,软件包安装,机器间关系等等都应该用代码模块化来实现自动化和结果可预期,消除人工步骤会带来的错误。这听起来似乎不坏,难道不是吗?

但是新的解决方案带来新的挑战,当基础设施即代码的时候我们面临开发者同样会遇到的问题:

  1. 在生产环境中使用什么版本的基础设施?

  2. 怎样确保当问题发现时的修复与重部署?

  3. 当我们开发基础设施时怎样来进行测试?

这就是为什么当我们处理基础设施即代码时我们应该遵守开发的最佳实践。

例如我们能够(并且应该):

  1. 对定义服务器的代码打标签,建分支并且进行发布

  2. 为整个基础设施代码进行生命生命周期管理以覆盖不同阶段,例如,开发环境,测试环境,生产环境

  3. 当进行变更时进行持续测试

翻译整理自:Carlos Sanchez's Weblog


  • 实践案例

最近看了丁登的自动化运维:网易杭州研究院经验谈,其中提到对基础设施即代码的理解,他概括为四点:

* 版本控制(Git)
* 代码审核(Gerrit)
* 持续集成(Buildbot)
* 测试环境(Puppet environments)

演讲中提到的基础设施即代码的理解就是:把基础设施当成项目来开发。

我对他提到四点的简单概括就是:

整体采用Puppet实现自动化运维,把puppet多环境部署与Git版本控制结合,对开发,测试,生产环境进行版本控制,代码的提交由Gerrit进行审核。集成时进行语法检查(puppet --parseonly),代码风格检查(puppet-lint),软件配置文件检查(Augeas)。



blog comments powered by Disqus