基础设施即代码是一种像其他软件系统一样通过源代码定义计算资源和网络基础设施的方法。代码可以被用来进行评审和反复构建(https://martinfowler.com/bliki/ReproducibleBuild.html) ,遵循测试实践, 完全适合持续交付(https://martinfowler.com/bliki/ContinuousDelivery.html) 。 它是过去十年用来适应不断增长的云计算平台(https://martinfowler.com/bliki/CloudComputing.html) 的方法,并且以后会成为处理计算基础设施的主要方法。
我在石器时代(https://www.thoughtworks.com/insights/blog/infrastructure-code-iron-age-cloud-age) 长大,当要发布一个新的服务应用意味着要去找些硬件来运行,为了让硬件满足应用需求需要配置硬件,并将应用部署到硬件上。管理这些硬件通常是昂贵的,但也是长期的,通常是几个月。但现在我们活在云时代,启动一个服务器只是几秒的事,只需要互联网和一个信用卡。这是一个动态基础设施,软件命令用于创建服务器(通常是虚拟机,也可以是裸机的安装包),管理和销毁它们,手头不需要有螺丝刀。
实践
基础设施即代码基于一些实践:
- 使用定义文件:所有配置都定义在可执行的配置定义文件里,如shell脚本,Ansible playbook,Chef recipe,或者Puppet manifests。任何时间不需要登录服务器做一些运行时调整。任何此类调整都会造成SnowflakeServer(https://martinfowler.com/bliki/SnowflakeServer.html) ,这些变更都要在开发编码时进行最后的调整。这意味着用代码做变更需要很快。幸运的是计算机执行代码很快,它们管理上百台服务器比任何人类打字都快。
- 自说明系统与处理:与给人类看的文档说明,并依赖一般标准的人类可靠性,代码更加精确且在运行时绝对一致。如果可能,其他人类可读的文档可以从这些代码里生成。
- 版本化所有东西: 将所有这些代码放在源代码管理中。这样所有的配置和所有的变更都可以被审查并记录,你可以用重复构建(https://martinfowler.com/bliki/ReproducibleBuild.html) 来帮助发现问题。
- 持续测试系统并处理:测试能让电脑在基础设施配置中快速的发现许多错误。用现代的软件系统,你可以给你的基础设施代码设置部署流水线(https://martinfowler.com/bliki/DeploymentPipeline.html) ,这样你可以实践基础设施变更的持续交付(https://martinfowler.com/bliki/ContinuousDelivery.html) 。
- 小步变更而不是批量变更:基础设施更新的越大,越有可能存在问题并更难检测错误,尤其是一些相互影响的情况。 小变更对于找错误更容易而且容易回滚。 当变更基础设施时频率能减少难度(https://martinfowler.com/bliki/FrequencyReducesDifficulty.html) 。
- 保证服务持续运行:系统升级或修复不能接受宕机。蓝绿部署(https://martinfowler.com/bliki/BlueGreenDeployment.html) 和并行变更(https://martinfowler.com/bliki/ParallelChange.html) 技术能保证进行小变更而不需要损失可用性。
收益
这些动态基础设施技术都让我们很容易的启动新的服务器,当新的配置替换上去或负载变小时安全的销毁机器。创建新服务器只是通过运行脚本来按需创建服务实例的一个例子。这种方式非常适合PhoenixServers(https://martinfowler.com/bliki/PhoenixServer.html) 和ImmutableServers(https://martinfowler.com/bliki/ImmutableServer.html) 。
用代码定义服务器配置意味着在服务器间有绝对的一致性。手动调整配置往往像雪花一样会有一些微妙的差异,经常会导致诡异的问题并难以调试。这个问题在有不一致的监控时更早,所以一样用代码保证监控也是一致的。
最重要的是用配置代码保证变更更安全,在升级应用和系统软件时承担更小的风险。问题可以被定位和更快的修复,最差的情况下也可以回滚到上一次的工作配置。
将基础设施像版本控制一样管理有利于兼容性和审查。每一行你对配置的变更都可以被记录并不容易出问题。
所有这些在你需要控制更多服务器时都显得更重要了 ,如果你正在向微服务(https://martinfowler.com/microservices) 迁移,基础设施及代码成为一个必要的能力。基础设施即代码技术可以用来管理大集群服务器,无论是配置服务器和处理它们如何进行交互。