本文主要是介绍Terraform命令行配置文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
命令行配置文件(.terraformrc
或terraform.rc
)为每个用户配置了命令行的行为,适用于所有的Terraform工作目录,这与编写的Terraform代码是分开的。
配置文件位置
配置文件的位置取决于用户使用的操作系统:
- Windows平台上,文件名必须是
terraform.rc
,位置必须在相关用户的%APPDATA%
目录下,这个目录的物理路径取决于Windows的版本以及系统配置 - 在其他操作系统上,文件名必须是
.terraformrc
,位置必须是在相关用户的HOME目录
在Windows上创建配置文件时,要注意Windows资源管理器默认隐藏文件扩展名的行为,Terraform不会把terraform.rc.txt
文件识别为命令行配置文件,而默认情况下Windows资源管理器会将它的文件名显示为terraform.rc
(隐藏了扩展名的缘故)。
可以通过设置TF_CLI_CONFIG_FILE
环境变量的方式来修改配置文件的位置。
配置文件语法
配置文件本身如同.tf
文件那样也采用HCL语法,但使用不同的属性和块。
以下是常见语法示例:
plugin_cache_dir = "$HOME/.terraform.d/plugin-cache"
disable_checkpoint = true
可用配置项
命令行配置文件中可以设置的配置项有:
credentials
:使用Terraform Cloud服务或Terraform企业版时使用的凭据credentials_helper
:配置一个外部的用于读写Terraform Cloud或Terraform企业版凭据的帮助程序disable_checkpoint
:设置为true可以完全关闭与Checkpoint的交互disable_checkpoint_signature
:设置为true可以阻止向Checkpoint发送匿名IDplugin_cache_dir
:开启插件缓存provider_installation
:定制化执行terraform init
时安装插件的行为
Provider的安装
默认情况下Terraform从官方Provider Registry下载安装Provider插件,Provider在Registry中的原始地址采用类似registry.terraform.io/hashicorp/aws
的编码规则。通常为了简便,Terraform允许省略地址中的主机名部分registry.terraform.io
,所以可以直接使用地址hashicorp/aws
。
有时无法直接从官方Registry下载插件,例如要在一个与公网隔离的环境中运行Terraform时。为了允许Terraform工作在这样的环境下,有一些可选方法允许从其他地方获取Provider插件。
显式安装方法配置
可以在命令行配置文件中定义一个provider_installation
块来修改Terraform默认的插件安装行为,命令Terraform使用本地的Registry镜像服务,或是使用一些用户修改过的插件。
通常provider_installation
块的结构如下:
provider_installation {filesystem_mirror {path = "/usr/share/terraform/providers"include = ["example.com/*/*"]}direct {exclude = ["example.com/*/*"]}
}
provider_installation
块中每一个内嵌块都指定了一种安装方式,每一种安装方式都可以同时包含include
与exclude
模式来指定安装方式使用的Provider类型。在上述例子中,把所有原先位于example.com
这个Registry存储中的Provider设置成只能从本地文件系统的/usr/share/terraform/providers
镜像存储中寻找并安装,而其他的Provider只能从它们原先的Registry存储下载安装。
如果为一种安装方式同时设置了include
与exclude
,那么exclude
模式将拥有更高的优先级。例如:包含registry.terraform.io/hashicorp/*
但排除registry.terraform.io/hashicorp/dns
将对所有hashicorp
空间下的插件有效,但是hashicorp/dns
除外。
和Terraform代码文件中Provider的source
属性一样的是,在provider_installation
里也可以省略registry.terraform.io/
的前缀,甚至是使用通配符时亦是如此。比如,registry.terraform.io/hashicorp/*
和hashicorp/*
是等价的;*/*
是registry.terraform.io/*/*
的缩写,而不是*/*/*
的缩写。
目前支持的安装方式如下:
-
direct
:要求直接从原始的Registry服务下载,该方法不需要额外参数。 -
filesystem_mirror
:一个本地存有Provider插件拷贝的目录,该方法需要一个额外的参数path
来指定存有插件拷贝的目录路径。Terraform期待给定路径的目录内通过路径来描述插件的一些元信息,支持以下两种目录结构:- 打包式布局:
HOSTNAME/NAMESPACE/TYPE/terraform-provider-TYPE_VERSION_TARGET.zip
的格式指定了一个从原始Registry获取的包含插件的发行版zip文件 - 解压式布局:
HOSTNAME/NAMESPACE/TYPE/VERSION/TARGET
式一个包含有Provider插件发行版zip文件解压缩后内容物的目录
这两种布局下,
VERSION
都是代表着插件版本的字符串,比如2.0.0
;TARGET
则指定了插件发行版对应的目标平台,例如darwin_amd64
、linux_arm
、windows_amd64
等等。
如果使用解压式布局,Terraform在安装插件时会尝试创建一个到镜像目录的符号连接来避免拷贝文件夹;打包式布局则不会这样做,因为Terraform必须在安装插件时解压发行版文件。可以指定多个
filesystem_mirror
块来指定多个不同的目录。 - 打包式布局:
-
network_mirror
:指定一个HTTPS服务地址提供Provider插件的拷贝,不论这些插件原先属于哪些Registry服务。该方法需要一个额外参数url
来指定镜像服务的地址,url
地址必须使用https:
作为前缀,以斜杠结尾。Terraform期待该地址指定的服务实现了Provider网络镜像协议,这是一种被设计用来托管插件拷贝的网站所需要实现的协议。需要特别注意的是,请不要使用不可信的
network_mirror
地址。Terraform会验证镜像站点的TLS证书以确认身份,但一个拥有合法TLS证书的镜像站可能会提供包含恶意内容的插件文件。 -
dev_overrides
:指定使用本地的开发版本插件,有时想要对Provider代码做一些修改,为了调试本地代码编译后的插件,可以使用dev_overrides
指定使用本地编译的版本。
例如,想要调试本地修改过的UCloud Provider插件,我们可以从github上克隆该项目源代码,修改完代码后,编译一个可执行版本(以Mac OS为例):$ GOOS=darwin GOARCH=arm64 go build -o bin/terraform-provider-ucloud $ chmod +x bin/terraform-provider-ucloud
然后编写如下
provider_installation
配置:provider_installation{dev_overrides {"ucloud/ucloud" = "PATH_TO_PROJECT/terraform-provider-ucloud/"} }
当Terraform代码中要求了
source
为ucloud/ucloud
的Provider时,执行terraform init
仍然会报错,提示找不到ucloud/ucloud
这个Provider,但执行terraform plan
或是terraform apply
等操作时可以顺利执行,此时Terraform会使用路径指定的本地Provider插件,这种方式比较适合于调试本地Provider插件代码。
对于上述的几种插件安装方式,Terraform会尝试通过include
和exclude
模式匹配Provider,遍历匹配的安装方式,选择一个符合Terraform代码中对插件版本约束的最新版本。如果拥有一个插件的特定版本的本地镜像,并且希望Terraform只使用这个本地镜像,那么需要移除direct
安装方式,或是在direct
中通过exclude
参数排除特定的Provider。
隐式的本地镜像目录
如果命令行配置文件中没有包含provider_installation
块,那么Terraform会生成一个隐式的配置,该隐式配置包含了一个filesystem_mirror
方法以及一个direct
方法。
在不同的操作系统上,Terraform会选择不同的路径作为隐式filesystem_mirror
路径:
- Windows:
%APPDATA%/terraform.d/plugins
以及%APPDATA%/HashiCorp/Terraform/plugins
- Mac OS X:
$HOME/.terraform.d/plugins/
,~/Library/Application Support/io.terraform/plugins
以及/Library/Application Support/io.terraform/plugins
- Linux以及其他Unix风格系统:
$HOME/.terraform.d/plugins/
,以及配置的XDG基础目录后接terraform/plugins
;如果没有设置XDG环境变量,Terraform会使用~/.local/share/terraform/plugins
,/usr/local/share/terraform/plugins
,以及/usr/share/terraform/plugins
Terraform会在启动时为上述路径的每一个目录创建一个隐式filesystem_mirror
块,另外如果当前工作目录下包含有terraform.d/plugins
目录,那么也会为它创建一个隐式filesystem_mirror
块。
相对于任意多个隐式filesystem_mirror
块,Terraform同时也会创建一个隐式direct
块。Terraform会扫描所有文件系统镜像目录,对找到的Provider自动从direct
块中排除出去(这种自动的exclude
行为只对隐式direct
块有效。如果在provider_installation
块中显式指定了direct
块,那么需要显式定义exclude
规则)。
这篇关于Terraform命令行配置文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!