继上一篇文章《玩转阿里云Terraform(一):Terraform 是什么》介绍了Terraform的基本定义和特点之后,本文将重点介绍Terraform中的几个关键概念。
在使用Terraform的过程中,Terraform的关键概念通常会接触到很多名词,比如配置、提供者、资源、数据源、状态、后端、provisioner等。本文将为您一一介绍这些概念。
配置:基础设施的定义和描述“基础设施即代码”。这里的代码是基础设施资源的代码定义和描述,也就是通过代码表达我们想要管理的资源。
# VPC资源resource \’ alicloud _ VPC \’ \’ VPC \’ { name=\’ TF _ VPC \’ CIDR _ block=\’ 172 . 16 . 0 . 0/16 \’ } # v switch资源resource \’ alicloud _ v switch \’ \’ v switch \’ { VPC _ id=alicloud _ VPC . VPC . idcidr _ block=\’ 172 . 16 . 1 . 0/24 \’ avail ability _ zone=\’ cn-Beijing-a \’ }所有资源的代码描述都需要在以TF结尾的文件中定义,以便进行平台加载和这个文件被称为“地形模板”或“配置”。
Provider: Terraform,一个基础设施管理组件,通常用于创建、更新、查看和删除云上的基础设施,如虚拟机、网络资源、容器资源和存储资源。它还可以管理物理机器,例如安装软件和部署应用程序。
【Provider】是后端驱动,直接和开放API交互。Terraform通过提供商管理基础设施资源。不同的基础设施提供商需要提供一个提供商来实现对各自基础设施的统一管理。目前Terraform目前支持160多种提供商,云平台的提供商插件大部分已经实现。阿里云对应的提供商是阿里云。
在操作环境中,terraform和Provider是两个独立的包。运行Terraform时,Terraform会根据用户模板中指定的提供者或资源/数据源的标识,自动下载模板中使用的所有提供者,并放在一个隐藏目录中。执行目录下的Terraform。
Provider \’ alicloud \’ { version=\’=1.56.0 \’ region=\’ cn-Hangzhou \’ configuration _ source=\’ terraform-alicloud-modules/classic-load-balance \’ }模板显示指定了一个阿里云提供者,提供者的版本设置为1 . 56 . 0(默认下载最新版本),指定了管理资源的区域,指定了当前模板的标识。
通常,提供者包含两个主要元素:资源和数据源。
资源:基础设施资源和服务的管理
在Terraform中,特定的资源或服务称为资源,例如ECS实例、VPC网络和SLB实例。每个具体的资源包含几个属性字段,可以用来描述对应的资源或服务,通过这些字段定义一个完整的资源或服务,比如实例的名称、实例的规格(instance_type)、VPC或VSwitch的网段(cidr_block)等。
定义资源的语法非常简单。它由resource关键字声明,如下所示:
#定义ECS实例资源\’ alicloud _ instance \’ \’ default \’ { image _ id=\’ Ubuntu _ 16 _ 04 _ 64 _ 20g _ alibase _ 2019 06 20 . vhd \’ instance _ type=\’ ECS . sn1 ne . large \’ instance _ na Me=\’ my-first-VM \’ system _ disk _ category=\’ cloud _ SSD \’.}其中alicloud_instance是资源类型,定义了这个资源的类型,告诉Terraform这个资源是阿里云的ECS实例还是阿里云的VPC。默认为资源名,在同一个模块中必须唯一,主要用于其他资源引用该资源。大括号中的Block blocks是配置参数,它定义了资源的属性,如规范、图像、名称等。ECS实例的。很明显,这个Terraform模板的作用是在阿里云上创建一个ECS实例。镜像ID为Ubuntu _ 16 _ 04 _ 64 _ 20g _ alibase _ 2019 06 20 . vhd,规格为ecs.sn1ne.large实例名和系统盘类型自定义。
此外,在Terraform中,一个资源和另一个资源之间的关系也被定义为资源,例如云盘和ECS实例的挂载,以及EIP和ECS或SLB实例之间的绑定关系。这个定义的好处是,一方面,资源架构非常清晰;另一方面,当模板中有几个EIP需要绑定到几个ECS实例时,只需要Terraform的count函数就可以实现绑定功能,不需要编写大量重复的代码。
资源“alicloud_instance”默认为“{ count=5.}资源“alicloud_eip”默认值“{ count=5.} resource \’ alicloud _ EIP _ association \’ \’ default \’ { count=5 instance _ id=alicloud _ instance . default[count . index]。id allocation _ id=alicloud _ EIP . default[count . index]。id}很明显,这个Terraform模板的作用是在阿里云上创建五个ECS实例和五个弹性IP,并一一绑定。
数据来源:基础设施资源和服务的查询
资源的查询是运维人员或系统最常用的操作,比如查某个区域有哪些可用区域,某个区域有哪些实例规格,每个区域有哪些镜像,当前账号有多少台机器。对资源及其资源属性的查询可以帮助和指导开发者进行下一步的操作。
此外,在编写Terraform模板时,Resource使用的一些参数是固定的静态变量,但在某些情况下,参数变量可能是不确定的,或者参数可能随时发生变化。例如,当我们创建一个ECS实例时,我们通常需要指定我们自己的ImageID和实例规范,但是我们的模板可能会随时更新。如果我们在代码中指定了imageID和instance,那么一旦更新了图像模板,我们就需要再次修改代码。
在Terraform中,数据源提供了查询资源的功能。每个数据源实现一个资源的动态查询。DataSource的结果可以看作是一个动态变量,变量的值只有在运行时才能知道。
数据源由Data关键字声明,如下所示:
//image _ id data \’ alicloud _ images \’ \’ default \’ { most _ recent=true owners=\’ system \’ name _ regex=\’^ubuntu_18. \’的图像数据源* _ 64 \’ } data \’ alicloud _ zones \’ \’ default \’ { available _ resource _ creation=\’ v switch \’ enable _ details=true }//Instance _ typedata \’ alicloud _ Instance _ types \’ \’ default \’ { avail ability _ zone=data . alicloud _ zones . default . zones . 0 . id CPU _ core _ count=2 memory _ size=4 } resource \’ alicloud _ Instance \’ \’ web \’ { image _ id=data . alicloud _ images . default . images[0].id instance _ type=data . alicloud _ instance _ types . default . instance _ types[0]。id实例名称=\’我的第一个虚拟机\’系统磁盘类别=\’云固态硬盘\’.}上例中的ECS实例并没有指定图像的ImageID和实例规范,而是引用了数据。Terraform运行时将首先根据映像名称的前缀选择系统映像。如果多个图像同时满足条件,将选择最新的图像。实例规范是类似的。在可用区域下选择2核4G的实例规格返回。
状态:保存资源关系及其属性文件的数据库。Terraform创建和管理的所有资源都将保存到自己的数据库中。这个数据库不是通常意义上的数据库(MySQL,Redis等。),而是一个名为terraform.tfstate的文件,在terraform中称为state。默认情况下,它存储在执行Terraform命令的本地目录中。这个状态文件非常重要。如果这个文件损坏,Terraform会认为创建的资源损坏或者需要重建(实际的云资源通常不受影响),因为在执行Terraform命令时,Terraform会使用这个文件与当前目录下的模板进行Diff比较。如果有不一致的地方,Terraform会根据模板中的定义重新创建或修改已有的资源,直到没有差异为止,所以可以认为Terraform是一个有状态服务。
涉及多人协作时,不仅要复制模板,还要复制状态文件,无形中增加了维护成本。幸运的是,Terraform目前支持将状态文件从模板代码中分离出来,方法是将状态文件放在远程存储服务OSS或consul上。详情请参考官方文档远程状态或关注后续文章的详细介绍。
Backend:存储状态文件的载体如前所述,Terraform会将资源的属性存储在一个状态文件中,该文件可以在资源创建后本地存储,也可以远程存储。存储状态文件的载体是后端。
后端可以分为本地和远程两类,默认是本地。还有许多类型的远程站点。目前官网上有13个,阿里云的OSS也在其中。
使用远程后端不仅可以降低多人协作时的状态维护成本,还可以将一些敏感数据存储在远程,保证了数据的安全性。
Provisioner: Provisioner是在机器上执行操作的组件,通常用于在本地机器上执行相关操作或登录到远程主机。例如,local-exec provisioner用于执行本地命令,chef provisioner用于在远程计算机上安装、配置和执行chef客户端,remote-exec provisioner用于登录远程主机并在其上执行命令。
Provisioner通常与Provider一起使用,Provider用于创建和管理资源,provisioner在创建的计算机上执行各种操作。
Terraform中涉及到许多概念,它们的用法也各不相同。本文只介绍几个关键概念。如果想了解更多概念,可以访问Terraform官网。学习terraform最好的方法就是多动手,用Terraform去实现和操作一些特定的场景。在不断的操作过程中,不断的解决遇到的问题,可以帮助你更快更好的使用Terraform。下一篇文章将介绍Terraform的运行原理和基本操作。
作者:亚伦朱晓
本文为云起社区内容,未经允许不得转载。