🎈 作者:互联网-小啊宇 🎈 简介: CSDN 运维领域创作者。目前从事 Kubernetes运维相关工作,擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护等领域。 🎈 博客首页:互联网-小啊宇
基础设施即代码,其中的代码Code就是对基础设施资源的代码定义和描述,通过代码表达需要管理的资源。
所有资源的代码描述都是定义在一个以.tf结尾的文件,用于terraform的加载和解析。这个文件就称之为“Terraform模板”或者“configuration”
Terraform常用于公有云上基础设施的管理,如虚拟机、网络、容器等。Provider就是与OpenAPI交互的后端驱动,Terraform通过Provider完成对基础设施资源的管理。
每个基础设施提供商,aliyun、aws等都需要提供一个provider来实现对自家资源的统一管理。目前我们使用的阿里云对应的provider就是alicloud。
在运行环境中,Terraform和Provider是两个独立存在的package,执行Terraform时,会根据用户模板中指定的Provider或者resource/datasource的标志自动下载模板使用的provider,并放在当前目录下的.terraform隐藏目录下。
在Terraform中,一个具体的资源或者服务称为resource,比如一个ECS,一个SLB、一个域名解析记录。每个特定的resource包含了若干可用于描述对应资源或服务的属性字段。通过这些字段来定义一个完整的资源或者服务,比如dns的domain_name、ttl等。
如下定义一个resource:
|
resource "alicloud_alidns_record" "dns701438486351555584" {
domain_name = "test.com"
line = "default"
priority = 0
rr = "mobile.api"
status = "ENABLE"
ttl = 600
type = "A"
value = "1.1.1.4"
}
|
Data Source提供查询资源的功能,每个data source实现对一个资源的动态查询,其结果可以认为是动态变量,只有运行时才知道其值。
|
data "alicloud_alidns_records" "records_ds_uni" {
domain_name = "test.com"
type = "A"
line = "unicom"
rr_regex = "mobile*.api"
output_file = "records-uni.txt"
}
|
如上定义一个records_ds_uni的资源,其通过data引用,查询test.com域名下,解析记录匹配mobile*.api的,解析线路为unicom的所有A记录,并输出到records-uni.txt文本中。
Terraform创建和管理所有资源都保存在自己的数据库上,这个数据库是一个名为terraform.tfstate文件,在terraform中称之为state,默认存放在执行命令的本地目录中。
在执行terraform命令时,terraform会利用state文件与模板文件进行diff对比,如果出现不一致,terraform将按照模板中的定义重新创建,或者修改资源,直到没有diff。所以这个文件非常重要,如果损坏,terraform将认为已创建的资源被破坏,或者需要重建。当然实际的云资源不会收到影响。
因terraform创建资源后,会将资源属性保存在state文件中,而这个文件可以放本地,也可以存放在远端,实现state和模板代码的分离,这个存放state文件的载体就是backend。
Backend分为本地和remote两类,默认为本地。目前已支持多达13中远端存储方案,如console、etcd、oss等,可以降低多人协作对state维护的成本,也可以保障数据的安全性。
用来在本地机器或者登录远程主机执行相关的操作,如local-exec在本地执行命令,chef用来在远程主机安装、配置、执行chef client,remote-exec用来登录远程主机执行命令。
通常与provider搭配实现,provider创建资源后,使用provisioner在创建的资源上执行各种操作。
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install terraform
[root@localhost ~]# terraform --version
Terraform v1.2.5
on linux_amd64
用于对模板定义的资源进行预览。如预览当前模板中定义的资源是否符合预期,如果存在state文件则展示diff结果,即变更的内容。
概念和命令的理解可以参考下图:
操作生命周期
资源编排的动作的生命周期如上,其中左侧为Terraform系统系统的能力,右侧provider、provisioner为厂商提供。
当执行terraform apply命令时:
①、terraform唤醒进程,初始化backend(默认为local-file); ②、解析用户定义的模板文件,并获取最新的资源状态,进行对比; ③、构建DAG,将所有编排动作依次发送给provider; ④、provider调用云API管理云资源 ⑤、将返回的结果写回state