我最新最全的文章都在,欢迎大家来喝茶!

简介

最近工作中用到了terraform,权当学习记录一下,希望能帮助到其它人。

terraform系列文章如下:

terraform入门教程,示例展示管理docker和kubernetes资源

terraform插件provider管理,搜索、定义、下载

terraform状态state管理,让变更有记录

terraform模块module管理,聚合资源的抽取与复用

terraform常用命令

provider即插件

provider可理解为插件,terraform是支持多云基础设施编排的,但光terraform这个程序只是核心功能,对于不同的云平台,需要不同的provider来支持。这样可以非常灵活的添加平台,需要aws的部署,就添加aws的provider;需要kubernetes,就添加kubernetes的功能。

其实一个provider就一个程序,它是一个独立的进程,terrafrom会跟provider通信,以完成所有功能。

搜索provider

provider分为四种:

  • official:官方提供的;
  • verified:官方认证的;
  • community: 社区提供的;
  • custom: 自定义的;

我们可以到( )去搜索,这里已经提供了极其丰富的provider,基本是够用的了。

而且每个provider都提供了很好的文档说明,如gcp:

˛

定义provider

我们可以定义需要用到哪些provider和对应的版本,新建一个versions.tf文件,内容如下:

terraform {
  required_version = "= v0.15.4"

  required_providers {
    kubernetes = {
          source  = "hashicorp/kubernetes"
          version = "= 2.2.0"
        }
    docker = {
          source = "kreuzwerker/docker"
          version = "= 2.12.2"
        }
  }
}

版本号可以用=或者>=等,灵活方便。

下载provider

当我们定义好了provider和对应的版本号后,就可以通过terraform init命令下载了。如下:

$ terraform init
initializing provider plugins...
- finding hashicorp/kubernetes versions matching "2.2.0"...
- finding kreuzwerker/docker versions matching "2.12.2"...
- installing kreuzwerker/docker v2.12.2...
- installed kreuzwerker/docker v2.12.2 (self-signed, key id 24e54f214569a8a5)
- installing hashicorp/kubernetes v2.2.0...
- installed hashicorp/kubernetes v2.2.0 (signed by hashicorp)

这里有两个问题需要解决:

(1)它从哪里下载?

(2)它下载到什么地方去了?

对于provider的定义有一个source值,格式如下:

[<hostname>]<namespace>/<type>

hostname是选填的,默认是官方的 registry.terraform.io,所以它是从这个地址去下载的,当然也可以自建terraform仓库,特别是许多大公司,不会直接连外网。

那它会下载到哪里呢?以版本terraform v0.15.4 on darwin_amd64为例,它会下载在项目当前目录下:

$ tree -a
.
├── .terraform
│   ├── modules
│   │   └── modules.json
│   └── providers
│       └── registry.terraform.io
│           ├── hashicorp
│           │   └── kubernetes
│           │       └── 2.2.0
│           │           └── darwin_amd64
│           │               └── terraform-provider-kubernetes_v2.2.0_x5
│           └── kreuzwerker
│               └── docker
│                   └── 2.12.2
│                       └── darwin_amd64
│                           ├── changelog.md
│                           ├── license
│                           ├── readme.md
│                           └── terraform-provider-docker_v2.12.2
├── .terraform.lock.hcl
├── main.tf
├── nginx
│   ├── main.tf
│   └── variables.tf
└── versions.tf

13 directories, 11 files

但如果每个项目都要单独下载一次,那可是太麻烦了。我们可以把所有插件都放在同一个地方,然后通过-plugin-dir来指定,如下:

$ rm -rf ./.terraform*

$ terraform init -plugin-dir=/users/larry/software/terraform/plugins
initializing provider plugins...
- finding kreuzwerker/docker versions matching "2.12.2"...
- finding hashicorp/kubernetes versions matching "2.2.0"...
- installing kreuzwerker/docker v2.12.2...
- installed kreuzwerker/docker v2.12.2 (unauthenticated)
- installing hashicorp/kubernetes v2.2.0...
- installed hashicorp/kubernetes v2.2.0 (unauthenticated)


$ tree -a
.
├── .terraform
│   ├── modules
│   │   └── modules.json
│   ├── plugin_path
│   └── providers
│       └── registry.terraform.io
│           ├── hashicorp
│           │   └── kubernetes
│           │       └── 2.2.0
│           │           └── darwin_amd64 -> /users/larry/software/terraform/plugins/registry.terraform.io/hashicorp/kubernetes/2.2.0/darwin_amd64
│           └── kreuzwerker
│               └── docker
│                   └── 2.12.2
│                       └── darwin_amd64 -> /users/larry/software/terraform/plugins/registry.terraform.io/kreuzwerker/docker/2.12.2/darwin_amd64
├── .terraform.lock.hcl
├── main.tf
├── nginx
│   ├── main.tf
│   └── variables.tf
└── versions.tf

13 directories, 7 files

可以看到它只是在当前目录创建了一个链接到指定plugin目录的provider上。

如果想要自己手动下载,可以到这个网址:

其实工作时用到的provider就几个,直接下载好放在plugin目录即可。

欢迎关注微信公众号<南瓜慢说>,将持续为你更新…

多读书,多分享;多写作,多整理。