1. 什么是provider插件?✅
Terraform 是一个多云基础设施编排工具,是通过Provider来支持云基础架构。而Provider的本质是上游云厂商的API的逻辑抽象,他们负责理解API交互并暴露资源。
我们可以将Provider理解为各个云厂商提供的与云资源交互的后端驱动,不同的基础设施提供商都需要提供一个Provider来实现对自家基础设施的统一管理。
Terraform实现多云编排的方法就是Provider插件机制。
Terraform 使用的是 HashiCorp 自研的 go-plugin
库,本质上各个 Provider 插件都是独立的进程,与 Terraform 进程之间通过 Rpc 进行调用。Terraform 引擎首先读取并分析用户编写的 Terraform 代码,形成一个由 data
与 resource
组成的图(Graph),再通过 Rpc 调用这些 data
与 resource
所对应的 Provider 插件;Provider 插件的编写者根据 Terraform 所制定的插件框架来定义各种 data
和 resource
,并实现相应的 CRUD 方法;在实现这些 CRUD 方法时,可以调用目标平台提供的 SDK,或是直接通过调用 Http(s) API来操作目标平台。
1.1 provider的四种类型✅
Official
:官方Partner
:合作伙伴Community
:社区Archived
:归档
类型 | 说明 | 维护者 |
---|---|---|
Official | 官方供应商由HashiCorp拥有和维护 | hashicorp |
Partner | 合作伙伴提供商由第三方公司根据自己的API编写、维护、验证和发布。 | 第三方组织,例如mongodb/mongodbatlas公司 |
Community | 社区提供者由个人维护者、维护者组或Terraform社区的其他成员发布到Terraform注册中心。 | 维护者的个人或组织帐户,如DeviaVir/gsuite |
Archived | 存档的提供者是不再由HashiCorp或社区维护的官方或合作伙伴提供者。如果API被弃用或兴趣较低,则可能会发生这种情况。 | hashicorp 或第三方 |
Terraform
通过 provider
管理基础设施,使用 provider
与云供应商 API
进行交互,每个 Provider
都包含相关的资源和数据源。
1.2 provider配置方式
配置provider的访问方式,不同云厂商的配置方式有所不同,请参考各云厂商的provider文档。
- 查看provider下载地址
terraform providers
Providers required by configuration:
.
└── provider[registry.terraform.io/aliyun/alicloud] 1.253.0
terraform providers
Providers required by configuration:
.
└── provider[registry.terraform.io/aliyun/alicloud] 1.253.0
单provider方式✅
vim provider.tf
# 定义provider
terraform {
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = "1.253.0"
}
}
}
# 配置provider
provider "alicloud" {
# Configuration options
access_key = "LTAIxxxxxxxxxxxxxxxxx" #修改成自己的ak
secret_key = "hmbkxxxxxxxxxxxxxxxxxxxxxxxxx" #修改成自己的sk
region = "cn-shanghai"
}
# 定义provider
terraform {
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = "1.253.0"
}
}
}
# 配置provider
provider "alicloud" {
# Configuration options
access_key = "LTAIxxxxxxxxxxxxxxxxx" #修改成自己的ak
secret_key = "hmbkxxxxxxxxxxxxxxxxxxxxxxxxx" #修改成自己的sk
region = "cn-shanghai"
}
多provider方式✅
vim provider.tf
terraform {
# 定义terraform版本
required_version = ">= v0.15.4"
# 定义provider
required_providers {
aws = {
source = "hashicorp/aws"
version = ">= 3.28"
}
alicloud = {
source = "aliyun/alicloud"
version = ">=1.192.0"
}
}
}
terraform {
# 定义terraform版本
required_version = ">= v0.15.4"
# 定义provider
required_providers {
aws = {
source = "hashicorp/aws"
version = ">= 3.28"
}
alicloud = {
source = "aliyun/alicloud"
version = ">=1.192.0"
}
}
}
provider文件两种表示方式✅
合并设置
将定义provider和配置provider写在同一个文件provider.tf文件中。
vim provider.tf
# 定义provider
terraform {
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = "1.253.0"
}
}
}
# 配置provider
provider "alicloud" {
# Configuration options
access_key = "LTAIxxxxxxxxxxxxxxxxx" #修改成自己的ak
secret_key = "hmbkxxxxxxxxxxxxxxxxxxxxxxxxx" #修改成自己的sk
region = "cn-shanghai"
}
# 定义provider
terraform {
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = "1.253.0"
}
}
}
# 配置provider
provider "alicloud" {
# Configuration options
access_key = "LTAIxxxxxxxxxxxxxxxxx" #修改成自己的ak
secret_key = "hmbkxxxxxxxxxxxxxxxxxxxxxxxxx" #修改成自己的sk
region = "cn-shanghai"
}
分开设置
分别建立provider.tf和version.tf,将定义provider写在version.tf中,将配置provider写在provider.tf中。
$Hsuin: D:/Terraform_project/tf_aliyun ❯ tree
.
|-- main.tf
|-- provider.tf
|-- terraform.tfstate
|-- terraform.tfstate.backup
`-- version.tf
$Hsuin: D:/Terraform_project/tf_aliyun ❯ tree
.
|-- main.tf
|-- provider.tf
|-- terraform.tfstate
|-- terraform.tfstate.backup
`-- version.tf
- provider.tf
#定义云厂商
provider "alicloud" {
region = "cn-shanghai"
access_key = "xx" #修改成自己的ak
secret_key = "xx" #修改成自己的sk
}
#定义云厂商
provider "alicloud" {
region = "cn-shanghai"
access_key = "xx" #修改成自己的ak
secret_key = "xx" #修改成自己的sk
}
- version.tf
terraform {
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = "1.253.0"
}
}
}
terraform {
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = "1.253.0"
}
}
}
💡 说明
- Terraform 是一个多云基础设施编排工具,是通过Provider来支持云基础架构。其本质是上游云厂商的API调用。
- provider有四种类型,分别是Official、Partner、Community、Archived。
- 不同云厂商的配置方式有所不同,请参考各云厂商的provider文档。
- provider的定义与配置可以写在同一个.tf文件中,也可以分开填写。
- 同一个Terraform工程支持配置多个provider,只需要在required_providers中规范配置即可。
- 如果更换provider的文件模式,必须删除.terraform 目录,重新init
alias✅
可以为同一个 Provider
定义多个配置,并选择基于每个资源或每个模块使用哪一个。这样做的主要原因是支持一个云平台的多个区域。
引用方式:
<PROVIDER NAME>.<ALIAS>
alicloud.beiling
provider.hangzhou
在其他配置文件中指定资源区域时,可以使用此模式引用
## provider.tf
provider "alicloud" {
access_key = var.alicloud.access_key
secret_key = var.alicloud.secret_key
}
provider "alicloud" {
alias = "beijing"
region = "cn-beijing-b"
}
provider "alicloud" {
alias = "hangzhou"
region = "cn-hangzhou-a"
}
## provider.tf
provider "alicloud" {
access_key = var.alicloud.access_key
secret_key = var.alicloud.secret_key
}
provider "alicloud" {
alias = "beijing"
region = "cn-beijing-b"
}
provider "alicloud" {
alias = "hangzhou"
region = "cn-hangzhou-a"
}
1.3 指定下载插件和版本✅
Terraform是通过解析required_providers知道需要哪些插件,一般习惯是定义一个verion.tf文件,把相关配置都放在这个文件里,比如:
terraform {
required_version = "= v1.0.11"
required_providers {
local = {
source = "hashicorp/local"
version = "= 2.1.0"
}
random = {
source = "hashicorp/random"
version = "3.1.0"
}
}
}
terraform {
required_version = "= v1.0.11"
required_providers {
local = {
source = "hashicorp/local"
version = "= 2.1.0"
}
random = {
source = "hashicorp/random"
version = "3.1.0"
}
}
}
版本号有两个等于=
号,会不会觉得奇怪?其实这是HCL语言的一个特性,除了=
号,还可以是>
、<=
等,这样可以指定版本范围,而不只是某个特定版本。
版本约束 =>1.0 定义最低使用1.0版本;~>1.0定义 最高使用1.0版本
terraform providers
Providers required by configuration:
.
└── provider[registry.terraform.io/aliyun/alicloud] 1.253.0
terraform providers
Providers required by configuration:
.
└── provider[registry.terraform.io/aliyun/alicloud] 1.253.0
指定其它仓库
terraform {
required_version = "= v1.0.11"
required_providers {
xxxowcloud = {
source = "registry.xxx.com/examplecorp/xxx"
version = "0.1.0"
}
}
}
terraform {
required_version = "= v1.0.11"
required_providers {
xxxowcloud = {
source = "registry.xxx.com/examplecorp/xxx"
version = "0.1.0"
}
}
}
没有网络
当前目录的插件复制到特定目录
$ terraform providers mirror /data/apps/terraform/plugins
$ terraform providers mirror /data/apps/terraform/plugins
- 查看目录
$ tree -a /data/apps/terraform/plugins
/data/apps/terraform/plugins-localdisk
└── registry.terraform.io
└── hashicorp
├── local
│ ├── 2.1.0.json
│ ├── index.json
│ └── terraform-provider-local_2.1.0_darwin_amd64.zip
└── random
├── 3.1.0.json
├── index.json
└── terraform-provider-random_3.1.0_darwin_amd64.zip
$ tree -a /data/apps/terraform/plugins
/data/apps/terraform/plugins-localdisk
└── registry.terraform.io
└── hashicorp
├── local
│ ├── 2.1.0.json
│ ├── index.json
│ └── terraform-provider-local_2.1.0_darwin_amd64.zip
└── random
├── 3.1.0.json
├── index.json
└── terraform-provider-random_3.1.0_darwin_amd64.zip
指定插件目录实现复用
$ terraform init -plugin-dir=/data/apps/terraform/plugins
$ terraform init -plugin-dir=/data/apps/terraform/plugins
2. 常用插件
- local
- random: https://registry.terraform.io/providers/hashicorp/random/latest
- template
- gcp
- aws
- aliyun