Terraform工具已经成为DevOps领域的关键角色。在各种云平台和虚拟化环境(如AWS、Goolge Cloud、Azure等)中,可以对基础设施即代码(laC)进行定义、部署和管理。这本书介绍了如何通过Terraform在多云和混合云的环境下使用基础设施即代码,把软件工程的优秀实践应用于硬件的管理。作为Terraform首著的第2版,本书针对Terraform 0.12版本的重大升级,进行了内容的拓展和更新,展示了如何快速学习和使用Terraform的优秀实践。书中通过大量的代码示例,介绍了Terraform的基本功能、企业级模块化部署、自动化测试,以及团队环境下使用IaC的开发部署流程。本书不仅充分展现了Terraform作为一种IaC工具的魅力,还通过多角度的对比,使读者能够准确把握如何在实战中使用和配置该软件。系统管理员、DevOps工程师、开发人员和云服务技术从业者,都能从本书中找到所需要的知识与指导。
被全球云服务商广泛采用的IaC|DevOps工具首著问世,紧跟新版升级,Terraform创始人作序
译者序
当我在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月 美国硅谷
前 言
很久很久以前,有一个遥远的数据中心。数据中心里有一群被称为系统管理员(sysadmin)的“远古生物”。它们虽然能力强大,但还在用手动方式对基础设施进行部署。它们手动创建和管理整个数据中心的每台服务器、每个数据库、每个负载均衡器,甚至网络配置的每一个参数。这是一个黑暗而令人恐惧的年代:人们害怕停机,害怕意外的错误配置,害怕漫长而脆弱的部署工作,担心如果有一天系统管理员突然失踪(休假),该怎么办?一个好消息是,通过 DevOps 的推动,现在,人们的种种担忧有了一个更好的解决方案:Terraform。
Terraform(见参考资料文前[1])是一个由HashiCorp公司创建的开源工具,它可以让用户通过使用简单的声明性语言将基础设施定义为代码,并通过一些命令来部署和管理基于各种公有云(例如Amazon Web Service、Microsoft Azure、Google Cloud Platform、DigitalOcean)、私有云和虚拟化平台(例如OpenStack、VMWare)的基础设施。例如,与手动点击网页或运行数十个命令相比,下面是在AWS(Amazon Web Service)上使用Terraform配置一台服务器所需要的全部代码。
provider "aws" {
region = "us-east-2"
}
resource " aws_instance" " example" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
}
要实际部署它,只需要运行以下命令即可。
$ terraform init
$ terraform apply
由于简单、易用且功能强大,Terraform已成为DevOps领域中的一个关键角色。它可以自动化那些烦琐而脆弱的手动工作,使用户拥有一整套坚实的基础设施,并在此基础之上继续构建其他的DevOps实践(如自动测试、持续集成、持续交付)和工具(如Docker、Chef、Puppet)。
对于学习和使用Terraform来说,本书是入门和进阶的最快方法。
我们将从头开始部署Terraform最基本的“Hello,World”示例(实际上,你已经看到了),直到最后运行一套支持大流量和庞大开发团队的完整技术栈(服务器集群、负载均衡器、数据库),完成这一切只需几章内容即可。本书是一个需要动手的教程,它不仅介绍了DevOps和基础设施即代码的原理,还将带你一起实践几十个在家中就可以完成的代码示例,因此请确保有可以使用的计算机,以便随时进行实践。当完成这些学习和实践内容之后,你将具备Terraform的实战能力。
谁应该阅读本书
在代码编写完成之后还需要对代码负责的任何人,都适合阅读本书。其中包括系统管理员、运营工程师、发布工程师、站点可靠性工程师、DevOps工程师、基础设施开发人员、全栈开发人员、工程经理和CTO。无论头衔是什么,如果你的职责是管理基础设施、部署代码、配置服务器、管理服务器集群的缩放、备份数据、监控应用程序,并需要在凌晨3点响应任何系统报警,本书就是写给你的。
总的来说,所有这些任务统统被称为运维。在过去,熟悉如何编写代码但不了解运维的开发人员是很常见的。同样,精通运维但不懂如何编写代码的系统管理员也不在少数。从前我们可以回避这种岗位之间的隔阂问题,但是在“现代世界”中,随着云计算和DevOps变得无处不在,几乎每个开发人员都需要了解运维技术,同样每个系统管理员也需要学习编码技能。
本书的读者并不需要是资深程序员或系统管理专家。只需要拥有最基本的编程知识,会使用命令行,了解基于服务器的软件(如网站)如何运行即可。学习所依赖的其他所有内容,在书中都已经涵盖。当完成本书学习时,你将充分了解现代开发和运维的最关键技术之一:将基础设施作为代码进行管理。
通过阅读本书,读者不仅可以学习如何通过Terraform将基础设施作为代码进行管理,还会了解如何让它适用于整个DevOps领域。在本书结尾处,我希望你将有足够的知识回答以下问题。
? 为什么要使用IaC(基础设施即代码)
? 配置管理(configuration management)、编排(orchestration)、服务开通(provisioning)和服务器模板(server templating)之间的区别是什么
? 什么时候应该使用Terraform、Chef、Ansible、Puppet、Salt、CloudFormation、Docker、Packer或Kubernetes
? Terraform是如何工作的,以及如何使用它来管理基础设施
? 如何创建可重复使用的Terraform模块
? 如何编写足够可靠的生产级Terraform代码
? 如何测试Terraform代码
? 如何使Terraform成为自动化部署过程的一部分
? 团队中使用Terraform的最佳实践是什么
学习本书需要的工具是计算机(Terraform可以在大多数操作系统上运行)和互联网,当然求知的欲望也必不可少。
我为何撰写本书
Terraform是一个功能强大的工具,兼容所有主流云提供商。它使用简洁的语言,并且对重用、测试和版本控制提供强大的支持。Terraform作为一个开源项目,拥有一个友好且活跃的社区。如果一定要让我找出它的不足之处,那就是在成熟度上的欠缺。
Terraform还是一个比较新的技术。截至2019年5月,它尚未发布1.0.0版本,尽管Terraform越来越得到业界的推崇,但仍然很难找到相关书籍、博客文章或专家来帮助你掌握这个工具。Terraform官方的文档在介绍基本语法和功能方面做得很好,但对惯用模式、最佳实践、测试、可重用性或团队工作流程的相关内容涉及得不够。后者的重要性就好比当你试图流利地讲法语时,不仅应该学习词汇,还应该熟练掌握语法和惯用语一样。
我写本书的原因是为了帮助开发人员精通Terraform。在Terraform面世后的5年中,有4年的时间我都在自己的公司 Gruntwork(见参考资料文前[2])里使用这个工具,我们将Terraform作为核心工具,创建了包含30万行代码的可重复使用的模块库,这些基础设施代码经受了数百家公司生产环境的实战检验。多年以来,我们编写并维护的基础设施代码在许多不同的公司里得到应用,这种经历也给我们带来了很多的教训。我的目标是:通过与你分享这些经验和教训,缩短这个漫长的学习过程,使你能够在几天之内熟练掌握Terraform。
为了能够流利地说法语,只进行阅读训练是完全不够的,你还需要花时间与讲法语的人交谈、观看法语电视节目、听法语音乐。同样,为了能够熟练使用Terraform,用户需要编写真实的Terraform代码,使用它来管理真实的软件,然后将该软件部署在真实的服务器上。因此,请准备好在学习本书过程中阅读、编写和执行大量的代码。
本书包含如下内容
下面是本书的大纲。
第1章 为什么使用Terraform
DevOps是如何改变我们运行软件的方式的;基础设施即代码工具的介绍,包括配置管理、服务器模板、编排和服务开通工具;基础设施即代码的好处;Terraform、Chef、Puppet、Ansible、SaltStack、OpenStack Heat和CloudFormation的比较;如何配合使用Terraform、Packer、Docker、Ansible和Kubernetes等工具。
第2章 Terraform入门
Terraform的安装;Terraform的语法概述;Terrform的命令行工具;如何部署一台服务器;如何部署Web服务器;如何部署Web服务器集群;如何部署负载均衡器;如何清理创建的资源。
第3章 如何管理Terraform的状态
什么是Terraform的状态;如何存储状态文件,以便于团队成员之间共享访问;如何锁定状态文件,防止出现竞争的状况;如何使用Terraform管理密码;如何隔离状态文件,减少错误造成的损失;如何使用Terraform工作区;在Terraform项目内,文件和文件夹布局的最佳实践;如何使用只读状态。
第4章 使用Terraform模块创建可重用基础设施
什么是模块(module);如何创建一个基本模块;如何使用输入和输出变量构建可配置的模块;局部变量;模块的版本控制;模块使用中的陷阱;使用模块实现可重用的、可配置的基础设施。
第5章 Terraform技巧和窍门:循环、if条件语句、部署和陷阱
通过count参数、for_each表达式、for表达式和for字符串指令进行循环;通过count参数、for_each表达式、for表达式和if字符串指令实现条件判断;内置功能;零停机部署;常见的Terraform陷阱,包括:count和for_each的限制、零停机部署中的陷阱、为什么通过验证的计划也会失败、重构问题和最终的一致性问题。
第6章 生产级Terraform代码
为什么DevOps项目花费的时间比预期更长;生产级基础设施检查列表;如何构建用于生产环境的Terraform模块;小型的模块;可组合的模块;可测试的模块;可发布的模块;Terraform注册中心;Terraform“逃生舱口”。
第7章 如何测试Terraform代码
手动测试Terraform代码;沙箱环境和清理;自动测试Terraform代码;Terratest;单元测试;集成测试;端到端测试;依赖注入和并行测试;测试阶段;重试;测试金字塔;静态分析;属性检查。
第8章 如何在团队环境下使用Terraform
如何在团队环境下部署Terraform;如何说服你的老板采纳Terraform;应用程序代码的部署流程;基础设施代码的部署流程;版本控制;Terraform的黄金法则;代码评审;编码准则;Terraform的样式;Terraform的CI/CD;部署过程。
读者可以从头到尾阅读本书,也可以跳到你最感兴趣的章节。请注意,每章的示例都以之前章节的示例作为基础。因此,如果略过之前的章节,请参考使用完整的开放源代码示例(如第xv页的“开放源代码示例”中所述的那样)。在本书最后的附录A中,包括推荐阅读的文章列表,你可以找到更多有关Terraform、运维、IaC和DevOps的资源。
第2版的新增内容
第1版发布于2017年。2019年5月,我完成了第2版的编写,在短短几年内,Terraform发生了令人惊讶的变化!所以第2版几乎是第1版篇幅的两倍,包括两个完整的新章节,所有原始章节和代码示例也进行了很大程度上的更新。
如果你是第1版的读者,仅仅想知道第2版有什么新功能,或者只是想看看Terraform是如何演化的,那么下面是我总结的一些关注要点。
Terraform发布了4个主要版本
在第1版首次发行时,Terraform的版本为0.8。从那时起到第2版首次发行之间,Terraform已经发布了4个主要版本,现在的版本为0.12。这些版本引入了许多新功能,并且为用户升级做了大量准备工作 !
自动测试的改进
Terraform的自动测试工具和实践已经有了很大的发展。第7章是一个全新的关于测试的章节,涵盖了单元测试、集成测试、端到端测试、依赖注入、测试并行性、静态分析等主题。
模块的改进
创建Terraform模块的工具和实践也有了突飞猛进的发展。在全新的第6章中,介绍了如何构建一个可重用的、实战检验过的生产级Terraform模块,这种模块是每个公司都希望使用的。
工作流程的改进
第8章是完全重写的,介绍了团队该如何将Terraform集成到工作流程中,其中详细地介绍了如何将应用程序代码和基础代码从开发、测试,一路发布到生产环境的过程。
HCL2
在Terraform 0.12版本中,将基础语言从HCL全面升级到HCL2。升级包括对第一类表达式的支持(这样就不需要将变量包装在${...}中了),丰富的类型限制,惰性计算的条件表达式,对null、for_each和for表达式、动态内联块等的支持。本书的所有代码示例已经更新为HCL2,新的语言功能将在第5章和第6章中重点讲述。
Terraform state功能的主要提升
在Terraform 0.9版本中,后端成为存储和共享Terraform状态文件的主要方式,包括对锁定功能的内部支持。Terraform 0.9把状态环境作为跨环境部署的管理方式。在Terraform 0.10版本中,状态环境又进一步被Terraform工作区的概念所替换。我将在第3章中介绍所有这些主题。
Terraform provider的拆分
在Terraform 0.10版本中,Terraform核心代码与所有提供商的代码(即AWS、GCP、Azure等的代码)被拆分并存储于不同的代码库中。这样,每个提供商就可以根据自己的项目节奏,在独立的代码库中开发新版本了。随之而来的变化是,当每次引入一个新的模块时,必须重新运行terraform init命令来下载提供商的代码,我们将在第2章和第7章中进行介绍。
提供商大规模的增长
自2016年以来,Terraform已从只支持少数几个主要的云服务提供商(例如AWS、GCP和Azure)发展到现在支持100多家官方提供商,以及更多的来自社区的提供商 。这意味着用户现在不仅可以使用Terraform管理更多其他类型的云平台(例如Alicloud、Oracle Cloud Infrastructure、VMware vSphere等),还可以通过Terraform将云平台之外的系统作为代码进行管理:包括版本控制系统(例如GitHub、GitLab或BitBucket)、数据存储系统(例如MySQL、PostreSQL或InfluxDB)、监视和警报系统(例如DataDog、New Relic或Grafana)、平台工具(例如Kubernetes、Helm、Heroku、Rundeck或Rightscale),等等。另一方面,每个服务提供商的API接口覆盖率都有了显著提高,例如,Terraform的AWS服务提供商现在涵盖了大多数重要的AWS服务,甚至当新功能出现时,其对Terraform的支持早于AWS自有的CloudFormation!
Terraform Registry
HashiCorp于2017年启动了Terraform Registry(见参考资料文前[4])服务,通过网站界面,你可以轻松浏览和使用来自开源社区的可重复使用的Terraform模块。2018年,HashiCorp进一步开始支持在组织内运行Private Terraform Registry的功能。Terraform从0.11版本开始,可以直接引用Terraform Registry中发布的模块。我们将在第6章的“可发布的模块”一节中进行介绍。
更好的错误处理
在Terraform 0.9版本中,对状态错误的处理机制进行了更新。如果Terraform写入远程后端状态文件时出错,该状态将被保存在本地的errored.tfstate文件中。在Terraform 0.12版本中,又对错误处理进行了彻底的改进,使其能够更早地捕获错误,显示更清晰的错误消息,并在错误消息中包含文件路径、行号和部分代码段。
其他细微变化
还有许多其他细微的变化,包括对局部变量的支持(见第4章“模块的变量”);新的“逃生舱口”功能,使Terraform能够通过脚本与外界进行互动(见第6章“Terraform模块之外的内容”);将plan命令作为apply命令的一部分来运行(见第2章“部署单个服务器”);修复了create_before_destroy循环问题;对count参数进行重大改进,使其能够对数据源和资源进行引用(见第5章“循环”);新增加了数十个内置函数,以及对provider继承功能的全面改进。
在本书中找不到的内容
本书并不打算成为一份详尽的Terraform参考手册。我也没有介绍所有的云服务提供商,以及每个提供商支持的全部资源或每个可用的Terraform命令。有关这些实质性细节,请参考Terraform官方文档 。
官方文档包含了许多有用的答案。但是如果不熟悉Terraform、基础设施即代码或运维的概念,你或许都不知道该问些什么问题。因此本书的重点是官方文档未涵盖的内容,使读者能超越运行介绍性示例的层次,在实战中使用Terraform。通过讨论为什么要使用Terraform,如何使其搭配你的工作流程,以及哪种最佳实践和应用模式是最有效的,使你能够快速地起步并开始使用Terraform。
为了能够演示这些模式,我在书中提供了许多代码示例。我已经将代码对第三方系统的依赖降到最低,使你能够轻松地在家中实验这些示例。本书所有示例都只涉及唯一的云提供商:AWS,你只需要注册一个第三方服务就可以完成全部实验(AWS提供了免费账号,因此运行示例代码不应该产生任何费用)。由于这个原因,本书和示例代码将不包括HashiCorp公司的其他付费服务产品—Terraform Pro和Terraform Enterprise。我已将所有代码示例进行了开源发布。
开源代码示例
你可以在以下网址找到本书所有代码示例:
https://github.com/brikis98/terraform-up-and-running-code
在开始之前请将代码复制到本地计算机上,以便在你自己的计算机上练习所有示例。
git clone https://github.com/brikis98/terraform-up-and-running-code.git
代码示例分章节存储在GitHub库中,大多数示例的内容和书中各章结尾处的代码保持一致。如果想要达到最佳学习效果,请亲自动手从头编写每章的代码。
读者将从第2章开始编写代码,学习使用Terraform,从头开始部署一个Web服务器集群。在之后的各章节中,你将对同一个Web服务器集群进行开发和改进。
请按照步骤说明亲自动手进行相应的代码修改,把GitHub库中的代码示例仅仅作为修改后的验证手段,或者在自己陷入困境时参考使用。
关于版本的注释
本书所有的示例都针对Terraform 0.12.x版本(该版本是撰写本书时最新的主要版本)进行了测试。因为Terraform是一个相对较新的工具,尚未发布1.0.0版本,所以未来的发行版可能不兼容现在的内容,并且某些最佳实践会随着时间的推移而发生更改和演进。我将尝试尽可能多地发布代码更新。由于Terraform项目进展非常快,因此你需要通过学习才能跟上它的变化,例如关于Terraform的新闻、博客文章和DevOps Terraform方面的讲座,请务必查看本书的网站 并订阅新闻通讯 !
致谢
Josh Padnick
没有你,这本书是不可能完成的。你是第一个向我介绍Terraform,教给我基础知识并帮助我掌握高级内容的人;感谢你在我们共同学习及撰写本书过程中给予我的支持;感谢你作为一位了不起的联合创始人,让我们在经营一家初创公司时还能够享受快乐的生活。非常感激能和你成为好朋友。
O'Reilly Media
感谢你们出版了我的又一本书。阅读和写作深刻地改变了我的生活,我很荣幸能通过你们与他人分享我的一些著作。特别感谢Brian Anderson帮助我以创纪录的时间出版了本书的第1版,以及Virginia Wilson在发行第2版时竟然打破了这一纪录。
Gruntwork的员工
我非常感谢你们加入我们这个小型初创公司,一起开发出色的软件,在我编写第 2 版时替我坚守岗位,并且让我们成为了很棒的同事和朋友。
Gruntwork的客户
感谢你们的信任,与一家不知名的小公司进行合作,并自愿加入我们的Terraform实验项目。Gruntwork的使命是能够10倍地简化软件的开发和部署工作。虽然我们并不能每次都成功地完成这个任务(我在本书中记录了许多错误经历!),但我仍然感谢你们的耐心,让我们为改善软件世界进行大胆的尝试。
HashiCorp
感谢你们构建了许多出色的DevOps工具,包括Terraform、Packer、Consul和Vault。你们改变了DevOps的世界,并改善了数百万软件开发人员的生活。
Kief Morris、Seth Vargo、Mattias Gees、Ricardo Ferreira、Akash Mahajan和Moritz Heiber
谢谢你们阅读本书的早期版本并提供了许多详细的意见和反馈。你们的建议使本书变得更好。
第1版的读者
读者对本书第1版的购买,很大程度上促进了第2版的出版。你们的意见、问题、改进请求,以及不断督促使第2版在内容上增加了近160个新页面。希望你们受用于新内容并继续督促我的改进。谢谢你们。
妈妈、爸爸、Larisa、Molly
我不小心又写了一本书,这意味着我失去了很多陪伴你们的时间。无论如何,谢谢你们的支持。我爱你们。