译者序
当我在2019年7月,第一次看到本书第2版的预发行版本时,就深深地被它的内容所吸引,并下定决心一定要将这本不可多得的、关于Terraform和基础设施即代码(IaC,Infrastucture as Code)的优秀出版物介绍给国内的读者。
作为一名在软件工程领域摸爬滚打近20年的从业人员,我在感叹各种技术快速迭代的同时,也深深体会到软件工程领域发展的周期性特点,每3到5年,就会有新的热点名词出现:Scrum、CI/CD(持续集成)、SRE、中台、AI,等等;每10年就会有一个大的转型:Agile(敏捷开发)、DevOps、云计算、机器学习。这些让人眼花缭乱的热点名词,每一个都代表着对一类问题的思考,以及解决这类问题的方法论。它们从出现开始,经历着被质疑、被接受、被追捧,直到被取代的过程。这个过程也标志着软件工程领域对已有难题的解决和继续对未知领域的探索。每一个热点的出现,往往代表着新的机遇、新的挑战,有时甚至会是整个行业的洗牌。所以我们在追捧名词和追赶“明星技术”的同时,也要冷静地去挖掘其背后的根本问题,这样才能在五花八门的解决方案中,做出正确的选择。
软件开发自上世纪60年代出现后,经历了快速的发展:从结构化编程(以瀑布模型为代表)到敏捷开发;在融合了极限编程、Scrum、DSDM、FDD等当时流行的软件开发实践的理念后,在2001年的雪鸟会议 上著名的《敏捷宣言》被提出。宣言重申了敏捷开发将专注于团队成员间的协作、客户需求的及时响应、软件产品的快速迭代。重点关注在软件开发领域中如何加强产品项目部门和软件开发团队之间的紧密协作,如何将客户的需求快速、准确地转化为软件产品。敏捷开发的出现大大提高了软件开发的效率。
在敏捷开发相对成熟后,下一个10年是DevOps运动的兴起。DevOps公认起源于2009年的Velocity大会,可以被看作敏捷开发向IT和运维领域的延伸。DevOps关注如何通过对工具、文化和流程的改进,提升部署自动化和发布的效率。DevOps兴起到成熟的过程,也是软件开发团队和产品运维团队间直接协作与融合的过程。其间也有不同的侧重点:行业最初主要关注CI/CD,甚至DevOps一时成为持续集成的代名词;后来又变成自动测试—提高代码测试覆盖率、减少手动测试、增加自动测试,自动测试成了DevOps工程师所追求的目标;再后来,在很多场合下,DevOps又被称作DevSecOps,很显然,安全性成了DevOps要解决的问题;再后来又提出了治理与合规(Governance and Compliance)、AIOps、ChatOps,等等。但是一个贯穿始终的关注点就是:运维(Ops)。
DevOps的重点之所以是运维,一个原因是在开发团队实施敏捷开发后,运维团队成了新的瓶颈;另一方面是运维领域的硬件虚拟化(服务器变成了虚拟机,数据中心变成了云计算平台)所带来的挑战—硬件的搭建和改变更加频繁,使原有的思想和技术很难继续支持业务的发展。虚拟化一方面增加了运维团队的压力,另一方面也为运维团队DevOps的改进提供了机遇。那就是将基础设施代码化,使用代码对硬件进行管理,在运维领域借用软件领域的最佳实践,将基础设施的运维纳入软件工程的范畴,最终整体改善软件开发和软件交付的过程。
运维团队要适应的另一个变化是云计算。什么是云计算?如果形象地进行比喻,云计算是企业IT服务中的“共享经济”。因为云计算完全符合共享经济的定义:通过互联网进行、充分利用闲置资源、按需分配下的重复使用。无论是私有云上组织内部门间的资源共享,还是公有云上不同公司之间的资源(算力、基础设施、安全、冗余、融灾)共享,都把共享经济的特点体现得淋漓尽致。而且随着人工智能、机器学习等领域的快速发展出现的算力匮乏,以及互联网经济活动(例如“双十一”)对运营伸缩能力的刚性需求,还有各种复杂架构系统导致的维护成本的增加,使人们对云服务的需求也从基础设施即服务(IasS),演进到平台即服务(PaaS),再到最新的软件即服务(SaaS),无论在广度上还是深度上都有了更高的要求。所以说,云计算作为共享经济在企业IT服务领域的落地,注定会进一步呈现百花齐放式的发展,多云和混合云是不可避免的趋势。
在多云和混合云的环境下,使用基础设施即代码,如何把软件工程的最佳实践,用于管理云相关的运维活动,就成了一个迫切需要解决的问题。而Terraform就是针对这个问题而出现的一个解决方案。作为HashiCorp公司开发的一种用于多云和混合云环境的IaC工具,Terraform专注于服务开通功能。虽然Terraform还很年轻(处于pre-1.0版本),但是近年来有了突飞猛进的发展(请参阅第1章表格1-2),这就导致了相关书籍、培训的短缺,而本书则是一本不可多得的、关于Terraform入门和实战内容的精品。
首先,这是一本贴近工程实战的教材,没有照搬官方手册,没有局限于介绍各种参数,而是突出了企业级、工程领域的实战操作。除基本功能外,它还突出了使用Terraform时的安全性、重用性、可维护性和可拓展性。例如,本书的第6章,从模块的复用角度出发,介绍了生产级Terraform代码的编写;第7章更是突出了如何在企业工程环境下测试Terraform代码;第8章介绍了如何在大型团队中使用Terraform协同开发基础设施代码。
其次,这是一本需要动手操作的教程。本书精心准备数十个代码示例,从动手编写“Hello,world”开始,逐步深入,到最后实现一个部署整套服务器集群的脚本,以及相关的测试。它使读者能够在短短几章内,超越运行简单介绍性示例的层次,深刻体会Terraform实战的特点。
还有就是,本书的第1章并没有匆忙地介绍如何安装和使用软件。而是退后一步,从更高的角度介绍了DevOps、IaC的最佳实践,以及IaC工具的分类:配置管理(configuration management)、编排(orchestration)、服务开通(provisioning)和服务器模板(server templating),并对广泛使用的IaC工具进行了多个维度的比较。
本书作者本身是一位软件工程和软件开发领域的专家,所以并没有仅仅将Terraform作为一个应用软件来进行介绍,而是在讲解工具的同时,穿插了大量DevOps和IaC的最佳实践、开发人员日常使用的小技巧,以及周边的阅读和学习资源(请参考附录A),极大地拓展了读者的知识面。作为第2版,本书经过第1版出版后的反馈,以及Terraform软件本身的演进,增加了很多读者希望看到的内容,以及对最新发布版本的支持(0.12版本包含重大语法变化)。具体信息请参考前言:第2版新增内容。
云计算、基础设施即代码和DevOps这些热门术语,在2009年前后才出现,而诸如Terraform、Docker、Packer和Kubernetes之类的工具在2018年前后才稳定发布。所有这些相对较新的工具和技术都在迅速地变化着,这也意味着它们并不特别成熟,也缺乏经验丰富的从业人员。随着运维团队的主要任务逐渐从硬件管理转移到软件管理上,加上云计算经过了一段时间的积累,将在今后3~5年内再一次出现爆炸性增长(企业服务领域),如何在多云和混合云下使用IaC管理基础设施,将成为下一个热点。这次你能把握住机会吗?
感谢Jim(本书作者Yevgeniy Brikman)给我们带来了这本精彩图书的第2版。感谢博文视点出版社的编辑能够把这个优秀的作品引进到国内,并让我有机会参与翻译工作。感谢所有为本书出版做出贡献的人。
白宇 2020年1月 美国硅谷