Terraform命令行配置文件

  1. 配置文件位置
  2. 配置文件语法
  3. 可用配置项
  4. Provider的安装
    1. 显式安装方法配置
    2. 隐式的本地镜像目录

命令行配置文件(.terraformrcterraform.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发送匿名ID
  • plugin_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块中每一个内嵌块都指定了一种安装方式,每一种安装方式都可以同时包含includeexclude模式来指定安装方式使用的Provider类型。在上述例子中,把所有原先位于example.com这个Registry存储中的Provider设置成只能从本地文件系统的/usr/share/terraform/providers镜像存储中寻找并安装,而其他的Provider只能从它们原先的Registry存储下载安装。

如果为一种安装方式同时设置了includeexclude,那么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.0TARGET则指定了插件发行版对应的目标平台,例如darwin_amd64linux_armwindows_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代码中要求了sourceucloud/ucloud的Provider时,执行terraform init仍然会报错,提示找不到ucloud/ucloud这个Provider,但执行terraform plan或是terraform apply等操作时可以顺利执行,此时Terraform会使用路径指定的本地Provider插件,这种方式比较适合于调试本地Provider插件代码。

对于上述的几种插件安装方式,Terraform会尝试通过includeexclude模式匹配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规则)。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,在下面评论区告诉我^_^^_^