一、概述
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下载流程
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目录上传到对象存储的根目录(或者其他目录)。
启动静态网站,配置如下,完成后保存。访问xxxx.com/registry.te… 测试是否可以访问。被拒绝的可以看下开启cos的权限为公共读私有写。
到此一个可以安装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"
}
}
保存后然后进行初始化测试。
手动配置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的速度。