Skip to content

各云厂商提供的插件

1. 什么是provider插件?✅

Terraform 是一个多云基础设施编排工具,是通过Provider来支持云基础架构。而Provider的本质是上游云厂商的API的逻辑抽象,他们负责理解API交互并暴露资源。

我们可以将Provider理解为各个云厂商提供的与云资源交互的后端驱动,不同的基础设施提供商都需要提供一个Provider来实现对自家基础设施的统一管理。

Terraform实现多云编排的方法就是Provider插件机制。

Terraform通过RPC调用插件,插件代码通过调用SDK操作远程资源

Terraform 使用的是 HashiCorp 自研的 go-plugin,本质上各个 Provider 插件都是独立的进程,与 Terraform 进程之间通过 Rpc 进行调用。Terraform 引擎首先读取并分析用户编写的 Terraform 代码,形成一个由 dataresource 组成的图(Graph),再通过 Rpc 调用这些 dataresource 所对应的 Provider 插件;Provider 插件的编写者根据 Terraform 所制定的插件框架来定义各种 dataresource,并实现相应的 CRUD 方法;在实现这些 CRUD 方法时,可以调用目标平台提供的 SDK,或是直接通过调用 Http(s) API来操作目标平台。

1.1 provider的四种类型✅

  1. Official:官方
  2. Partner:合作伙伴
  3. Community:社区
  4. Archived:归档
类型说明维护者
Official官方供应商由HashiCorp拥有和维护hashicorp
Partner合作伙伴提供商由第三方公司根据自己的API编写、维护、验证和发布。第三方组织,例如mongodb/mongodbatlas公司
Community社区提供者由个人维护者、维护者组或Terraform社区的其他成员发布到Terraform注册中心。维护者的个人或组织帐户,如DeviaVir/gsuite
Archived存档的提供者是不再由HashiCorp或社区维护的官方或合作伙伴提供者。如果API被弃用或兴趣较低,则可能会发生这种情况。hashicorp 或第三方

Terraform 通过 provider 管理基础设施,使用 provider 与云供应商 API 进行交互,每个 Provider 都包含相关的资源和数据源。

image-20250709175040219

1.2 provider配置方式

配置provider的访问方式,不同云厂商的配置方式有所不同,请参考各云厂商的provider文档。

  • 查看provider下载地址
bash
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

yaml
# 定义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

yaml
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

yaml
# 定义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.tfversion.tf,将定义provider写在version.tf中,将配置provider写在provider.tf中。

bash
 $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
yaml
#定义云厂商
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
yaml
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

在其他配置文件中指定资源区域时,可以使用此模式引用

json
## 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文件,把相关配置都放在这个文件里,比如:

yaml
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版本

bash
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

指定其它仓库

yaml
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"
    }
  }
}

没有网络

当前目录的插件复制到特定目录

bash
$ terraform providers mirror /data/apps/terraform/plugins
$ terraform providers mirror /data/apps/terraform/plugins
  • 查看目录
bash
$ 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

指定插件目录实现复用

bash
$ terraform init -plugin-dir=/data/apps/terraform/plugins
$ terraform init -plugin-dir=/data/apps/terraform/plugins

2. 常用插件