terraform init 加速

1,476 阅读1分钟

一、概述

terraform是一款开源的资源编配管理的自动化工具。即Infrastructure as Code。就是以代码形式定义要管理的资源模板,terraform就是通过解析模板来自动化完成资源的变更。

在以代码的形式定义资源模板时,用到很多terraform提供的providers。terraform是通过provider来完成对基础设施资源的管理。

编写好模板之后,第一步就是执行命令terraform init来完成初始化配置,包括下载使用到的provider。

国内来说terraform provider没有国内的源,init下的时候耗时比较长,或者说超时无法下载。

二、provider Cache

2.1 Windows

在系统%APPDATA%目录下编辑terraform.rc配置,添加缓存目录配置;启用缓存后init的provider会缓存到此目录,下次init是有读取缓存,缓存没有命中才会下载。保证每个相同版本的 Provider 只会下载一次。

# 注: 在Windows下面目录用的也是/,不能使用\
plugin_cache_dir   = "D:/Program Files/terraform/cache"

2.2 Linux

编辑配置~/.terraformrc,增加缓存配置plugin_cache_dir

plugin_cache_dir   = "$Home/.terraform/cache"

三、provider下载流程

image.png

3.1 创建provider mirror

terraform v0.13或者更高的版本中提供了一个providers mirror命令,可以下载当前配置的provider到本地的目录中。然后可以通过下载的目录配置network mirror等。

在命令行配置文件可以定义provider_installation块配置来修改terraform默认的插件安装行为。所以可以指定为从本地/network mirror安装初始化provider。

# provider_installation的完整配置参数:
provider_installation {
  filesystem_mirror {
    path    = "/usr/share/terraform/providers"
    include = ["example.com/*/*"]
  }
  #request information about the provider directly from its origin registry and download over the network from the location that registry indicates.
  direct {
    exclude = ["example.com/*/*"]
  }
}

3.1.1 项目中配置需要的provider

以腾讯云的provider 1.72.5版本为例

terraform {
  required_providers {
    tencentcloud = {
      source = "tencentcloudstack/tencentcloud"
      version = "1.72.5"
    }
  }
}

3.1.2 执行下载命令

执行下面命令后从默认的registry.terraform.io下载上述配置的provider版本的安装包和相关文件。(这里需要加速。。懂得都懂)

# windows环境,注意目录写法
terraform.exe providers mirror "D:\Program Files\terraform\mirror"

下载完成后回生成一个如下结构的目录,这个目录结构可以直接当作本地filesystem mirror使用。如果要配置network mirror,使用此目录结构为站点目录。

└─registry.terraform.io
    ├─hashicorp
    │  └─local
    └─tencentcloudstack
        └─tencentcloud

3.1.3 network mirror配置示例

使用腾讯云对象存储cos的静态站点托管来配置,首先上面步骤的registry.terraform.io目录上传到对象存储的根目录(或者其他目录)。

image.png

启动静态网站,配置如下,完成后保存。访问xxxx.com/registry.te… 测试是否可以访问。被拒绝的可以看下开启cos的权限为公共读私有写。

image.png

到此一个可以安装tencentcloudstack/tencentcloud的network mirror配置完成。

3.2 自建network mirror测试

使用我们上一步自建的mirror来初始化测试。测试前如果之前有cache的话可以暂时删除。 示例:

# 编辑~/.terraformrc或%APPDATA%/terraform.rc
# url填写cos的静态站点的访问地址,如果registry.terraform.io目录不在根目录下,url需要指定到registry.terraform.io上一层目录。
provider_installation {
	network_mirror {
		url = "https://xxxx.com"
	}
}

然后保存再我们项目中执行terraform init命令进行测试。

3.2 本地filesystem mirror测试

使用上面创建的本地mirror测试,

# 编辑~/.terraformrc或%APPDATA%/terraform.rc
# url填写cos的静态站点的访问地址,filesystem_mirror指定创建时的目录。
provider_installation {
    filesystem_mirror {
        path = "D:/Program Files/terraform/mirror"
    }
}

保存后然后进行初始化测试。

image.png

手动配置filesystem_mirror

如果无法使用provider mirror来完成配置,可以手动配置。本地registry的路径,这个路径通过path配置指定。这个支持的目录结构有2中。

  • 打包式目录:目录结构包含 HOST/hashicorp/${provider}HOST/NAMESPACE/${provider} 2个都要包含provide的压缩包和checksum文件(需要提前去registry.terraform.io上去下载)
# tecentcloud provider windows版本示例:
|-plugin
└─registry.terraform.io
    ├─hashicorp
    │  └─tencentcloud
    └─tencentcloudstack
        └─tencentcloud
  • 解压式目录:目录结构和cache式一致的,windows_amd64目录中是zip文件解压缩结果。实际目录如下:
# tecentcloud provider windows版本示例:
|-plugin
│  └─registry.terraform.io
│      ├─hashicorp
│      │  └─tencentcloud
│      │      └─1.72.5
│      │          └─windows_amd64
│      └─tencentcloudstack
│          └─tencentcloud
│              └─1.72.5
│                  └─windows_amd64
  • include,exclude,可以进行过滤操作,include:哪些registry的在使用registry;exlcude: 过滤的使用默认的registry。正常不配置也可。

最后

使用本地registry在开发测试过程中能够很方便加速init的速度。