当前位置: 首页 > 后端技术 > Java

《Terraform 101 从入门到实践》Chapter1初识Terraform

时间:2023-04-01 19:59:35 Java

《Terraform 101 从入门到实践》本手册在南瓜慢话官网和GitHub同步更新。书中的示例代码也放在了GitHub上,供大家参考。第一次听还不知道Terraform,再听的时候已经是云里雾里的人了。什么是基础架构即代码?以前我们需要在服务器上部署应用时,需要购买多台服务器和机房,组装交换机和网络,不间断电源UPS等,而随着云时代的到来,我们可以直接购买所有基础设施在IaaS(InfrastructureasaService)平台,包括服务器、私有网络、DNS、负载均衡等,你只需要关注应用层面。IaaS(InfrastructureasaService)即基础设施即服务,是云服务的基础。知名的IaaS供应商包括亚马逊、微软、谷歌和阿里云。云厂商为我们解决了很多运维问题:我们不再需要自己管理物理机,可以根据需要随时创建和销毁云机,并根据业务和性能需求指定创建服务器的配置和数量.这种便利对于创业型小公司和个人开发者尤为重要。随着公司业务随时向好的发展,需要的硬件资源越来越多,结构也越来越复杂。通过接口操作手动创建服务器、数据库等资源,带来的问题越来越多。首先,只要是人工操作,就会有出错的可能,谁也不能保证自己不会出错;而在软件行业,人工操作引发事故的案例并不少见。其次,为了保证正确率,人工操作只能串行进行,资源多的时候时间会很长。最后,如果我需要根据开发环境的配置创建测试环境和生产环境,手动操作可能会出现差异和错误。因此,对于如此复杂的需求,最好的方式就是通过代码来创建所有的硬件资源。这种思想就是基础设施即代码(InfrastructureasCode,简称IaC),通过代码和定义、部署、更新和销毁基础设施。将硬件映射到软件,开发人员和运维人员通过管理代码来管理硬件。IaC的好处是:自动化:用软件代替人工,实现自动化,降低风险和安全问题;高效率:软件可以并行创建资源,大大提高效率;记录跟踪:通过代码和执行记录硬件变化,出现问题也可追溯;复用和复制:提取通用模块实现复用,比如创建一个Kubernetes集群资源可以封装成一个模块。最终实现快速安全的应用部署交付(Devivery)。IaC工具IaC中仍然有很多优秀的工具,不同的工具承担着不同的职责。下面列出一些比较常用的工具:icon工具名称GitHubSTAR数Ansible50.9kTerraform30.2kVagrant23kChef6.8kPuppet6.4kAWSCloudFormationAzure资源管理器谷歌云部署其中Ansible应该是配置自动化方面的佼佼者,而Terraform是服务激活方面的事实标准,这里不想对每个工具做具体介绍,有兴趣的可以去官网看看或GitHub了解更多。注:一些文章或书籍Docker和Kubernetes也会被列为IaC工具,主要职责在容器和服务编排。Terraform隆重登场。什么是Terraform?我们的主角Terraform终于登场了。它是由HashiCorp开发的开源IaC工具。它使用GO语言编写,可以运行在各种平台上,支持Linux、Mac、Windows等,简单易用,即使没有太多编码经验的人也能看懂Terraform的配置代码HCL。HCL,即HashiCorpConfigurationLanguage,是由HashiCorp开发的一种配置语言。后面我们会介绍一些常用的语法。Terraform是一种安全高效的工具,用于创建和更改基础架构以及执行版本控制。支持AWS、Azure、GCP、阿里云等私有云和公有云,官网:https://www.terraform.io。特点主要特点有:基础设施即代码:基础设施通过配置语言HCL来描述,这也允许更好的代码共享和重用。变更计划:在实际变更之前,可以根据代码和状态生成即将发生变更的计划,可以告诉你哪些资源将被生成、变更和销毁。通过在进行更改之前进行尽力而为的检查,这为基础架构提供了额外的保护层。资源视图:可以根据依赖关系创建资源视图,可以直观地查看整个基础设施的关系。自动化:无需人工干预即可进行更改。版本号截至2021年12月02日,Terraform最新版本为1.0.11,2021年6月8日正式发布1.0.0版本,可见Terraform是多么的年轻,充满活力。在Terraform还不是1.0.0版本的时候,已经有大量的公司在生产环境中使用它了。架构和原理Terraform是一个用Go语言编写的程序。它读取用HCL语言编写的配置文件,然后通过RPC与插件通信更改信息。插件调用云厂商的API完成变更操作。这就是Terraform的工作原理。架构图如下:基本概念Terraformcore:Terraform的核心组件,类似于指挥官,负责分析配置、管理状态、模块等核心功能。Plugin插件:完成特定变化的组件。因为Terraform支持多平台,所以并没有在核心组件中实现对所有平台的支持,而是通过插件的方式提供这些功能。如果你需要连接到任何平台,你可以添加该平台的插件,非常方便。Module模块:将完成特定功能的HCL封装成一个模块,实现代码复用。类似于其他编程语言中的函数或方法。有输入输出参数,一切都可以自定义。State状态:状态存在于一个特殊的状态文件中,用于记录实际基础设施的状态。当再次执行变更请求时,Terraform会读取状态文件来判断实际的基础设施是否需要变更。如果状态文件中记录的状态与HCL描述的状态一致,则不需要进行更改操作。第一次下载安装Terraform是一个二进制程序,下载后添加到PATH即可。各个系统的安装方式没有太大区别。这里我们以Mac系统为例简单介绍一下。下载程序:可直接进入官网界面(https://www.terraform.io/down...)下载,请根据自己的系统选择相应的文件:下载后解压并添加程序到环境变量中。比如我的Terraform放在路径/Users/larry/Software/terraform,添加到环境变量的命令如下:exportPATH=$PATH:/Users/larry/Software/terraform为了保留它实际上,我把上面的命令放到了主目录下的.bash_profile文件中。查看是否安装成功如下:$terraformversionTerraformv1.0.11ondarwin_amd64如果是纯终端环境,也可以通过命令下载解压,命令如下:#下载安装包$wgethttps://releases.hashicorp.com/terraform/1.0.11/terraform_1.0.11_darwin_amd64.zip#unzip$unzipterraform_1.0.11_darwin_amd64.zip最简单的任务:创建一个文件Terraform的主要应用场景是云的基础设施管理服务,但为了让大家快速接触和体验Terraform,我会先选择最简单的插件上手,以免需要过多的环境设置。我们的任务是创建一个文本文件,其内容是我们指定的。这可以通过插件hashicorp/local来完成。在当前目录创建一个main.tf文件,完整的代码如下:terraform{required_version="=v1.0.11"required_providers{local={source="hashicorp/local"version="=2.1.0"}}}resource"local_file""terraform-introduction"{content="大家好,这是来自pkslow.com的Terraform教程"filename="${path.module}/terraform-introduction-by-pkslow.txt"}然后执行下面命令:$terraforminitInitializingthebackend...Initializingproviderplugins...-Findinghashicorp/localversionsmatching"2.1.0"...-安装hashicorp/localv2.1.0...-安装hashicorp/localv2.1.0(已签名由HashiCorp提供)Terraform创建了一个锁定文件.terraform.lock.hcl来记录它在上面所做的提供者选择。将此文件包含在您的版本控制存储库中,以便Terraform可以保证在您将来运行“terraforminit”时默认做出相同的选择。Terraform有已成功初始化!您现在可以开始使用Terraform。尝试运行“terraformplan”以查看基础架构所需的任何更改。所有Terraform命令现在都应该可以使用了。如果您曾为Terraform设置或更改模块或后端配置,请重新运行此命令以重新初始化您的工作目录。如果您忘记了,其他命令会检测到它并在必要时提醒您这样做。从命令的输出可以看出,Terraform会自动下载相应版本的插件hashicorp/local,并做一些初始化操作然后我们使用命令terraformplan查看要执行的变更计划:$terraformplanTerraform使用选择的提供者生成如下执行计划。资源操作用以下符号表示:+createTerraform将执行以下操作:#local_file.terraform-introductionwillbecreated+resource"local_file""terraform-introduction"{+content="大家好,这是来自Terraform的教程pkslow.com"+directory_permission="0777"+file_permission="0777"+filename="./terraform-introduction-by-pkslow.txt"+id=(申请后知道)}计划:1添加,0更改,0破坏。输出日志会提示需要创建、更改和销毁多少资源。Plan:1表示增加,0表示改变,0表示销毁,表示这里会创建一个资源。事不宜迟,我们直接执行更改:$terraformapplyTerraform使用选定的提供程序生成以下执行计划。资源操作用以下符号表示:+createTerraform将执行以下操作:#local_file.terraform-introductionwillbecreated+resource"local_file""terraform-introduction"{+content="大家好,这是Terraform的教程来自pkslow.com"+directory_permission="0777"+file_permission="0777"+filename="./terraform-introduction-by-pkslow.txt"+id=(申请后知道)}计划:1添加,0更改,0破坏。您要执行这些操作吗?Terraform将执行上述操作。只有“是”才会被接受批准。Enteravalue:会让你确认是否执行更改,如果是,则输入yes。我们直接输入yes回车。输入一个值:yeslocal_file.terraform-introduction:Creating...local_file.terraform-introduction:Creationcompleteafter0s[id=f63c7933c953ea2d03820d1ec35a80c718bd4777]申请完成!资源:添加1个,更改0个,销毁0个。文件创建成功。$ls-ltotal24-rw-r--r--1larrystaff344Dec300:01main.tf-rwxr-xr-x1larrystaff55Dec300:13terraform-introduction-by-pkslow.txt-rw-r--r--1larrystaff921Dec300:13terraform.tfstate上还有一个tfstate文件,用来记录状态,后面会详细讲到。看一下文件的内容:$catterraform-introduction-by-pkslow.txt大家好,pkslow.com的Terraform教程和我们预期的一致。如果再次执行apply,是否会重新创建一个文件?或者创建失败是因为文件已经存在?有了这个问题,我们再执行一下:$terraformapplylocal_file.terraform-introduction:Refreshingstate...[id=f63c7933c953ea2d03820d1ec35a80c718bd4777]没有变化。您的基础设施与配置相匹配。Terraform比较了你的realconfig基础设施没有gas基础设施差异,所以不需要改变。申请完成!资源:添加0个,更改0个,销毁0个。如果发现不需要更改,则不执行任何操作。你可以想想为什么,答案会在后面的章节揭晓。现在我不需要这个文件呢,通过destroy命令可以删除:$terraformdestroylocal_file.terraform-introduction:Refreshingstate...[id=f63c7933c953ea2d03820d1ec35a80c718bd4777]Terraform使用选定的提供程序生成以下执行计划资源操作用以下符号表示:-destroyTerraform将执行以下操作:#local_file.terraform-introduction将被销毁-resource"local_file""terraform-introduction"{-content="大家好,这是Terraform的教程来自pkslow.com"->null-directory_permission="0777"->null-file_permission="0777"->null-文件名="./terraform-introduction-by-pkslow.txt"->null-id="f63c7933c953ea2d03820d1ec35a80c718bd4777"->null}计划:0添加,0更改,1销毁。你真的要销毁所有资源?Terraform将破坏您所有的托管基础??设施,如上所示。无法撤消。只有'是'将被接受以确认。输入一个值:yeslocal_file。terraform-introduction:0sDestroy完成后破坏完成!资源:1个被摧毁。还需要确认是否真的需要删除,输入yes回车就到了这里,真正带大家体验了Terraform的工作原理。它的整个流程就是Terraform官网所说的Write,Plan,Apply。希望大家能够真正去实践,包括后续的实验,这和学习编程语言是一样的。最后,我想提一下这个实验的几点:plan命令不是必须的,它是为了展示即将发生的变化,你可以直接应用它;可以通过plan命令输出plan文件,然后在applyfile的时候指定plan;apply和destroy命令不需要交互输入yes,只需要加上参数-auto-approve即可。