在 TFVARS 文件中为嵌套结构设置变量地形的值



terraform 已调整其授权

在 main.tf [对于 sql 配置] 中,我现在有:

resource "google_sql_database_instance" "master" {
name             = "${random_id.id.hex}-master"
region           = "${var.region}"
database_version = "POSTGRES_9_6"
# allow direct access from work machines 
ip_configuration {
authorized_networks = "${var.authorized_networks}"
require_ssl  = "${var.sql_require_ssl}"
ipv4_enabled = true
}
}

哪里

在我有 variables.tf

variable "authorized_networks" {
description = "The networks that can connect to cloudsql"
type        = "list"
default = [
{
name  = "work"
value = "xxx.xxx.xx.xxx/32"
}
]
}

其中 xxx.xxx.xx.xxx 是我想允许的 IP 地址。但是,我不想把它放在我的 variables.tf 文件中,而是放在一个非源代码控制的.tfvars文件中。

对于具有简单值的变量,这很容易,但我不清楚如何使用嵌套结构来做到这一点。用变量 [例如 var.work_ip] 替换 xxx.xxx.xx.xxx 会导致错误

variables may not be used here

有什么见解吗?

如果您在主配置中完全省略default参数,则会variable "authorized_networks"标记为必需的输入变量,然后 Terraform 将检查该变量以确保它是由调用者设置的。

如果这是根模块变量,则可以使用以下语法在.tfvars文件中为其提供值:

authorized_networks = [
{
name  = "work"
value = "xxx.xxx.xx.xxx/32"
}
]

如果此文件是通过围绕 Terraform 的一些包装自动化以编程方式生成的,您还可以将其写入.tfvars.json文件并使用 JSON 语法,这通常更容易在其他语言中可靠构建:

{
"authorized_networks": [
{
"name": "work",
"value": "xxx.xxx.xx.xxx/32"
}
]
}

您可以使用-var-file选项在命令行上显式指定此文件,也可以在运行 Terraform 时为其指定一个以.auto.tfvars结尾的名称,或者在当前工作目录中.auto.tfvars.json,然后 Terraform 将自动查找并加载它。


将某些内容排除在版本控制之外的常见原因是,它是在更广泛系统中其他位置配置的动态设置,而不是版本控制中固定的值。如果此处为真,则另一种策略是将该设置保存在 Terraform 能够通过数据源访问的配置数据存储中,然后编写 Terraform 配置以直接从发布设置的位置检索该设置。

例如,如果您在此处建模的网络是 Google Cloud Platform 子网,并且它具有固定名称或可以在 Terraform 中系统派生的名称,则可以使用google_compute_subnetwork数据源检索此设置:

data "google_compute_subnetwork" "work" {
name   = "work"
}

在配置中的其他地方,您可以使用data.google_compute_subnetwork.work.ip_cidr_range访问此网络的 CIDR 块定义。

主要的 Terraform 提供商拥有各种各样的数据源,包括从目标平台检索特定一类对象的数据源,以及访问配置存储(如 AWS Systems Manager Parameter Store 或 HashiCorp Consul)的更通用数据源。直接访问必要的信息或在配置存储中"在线"发布这些信息有助于在更大的系统中有效地集成子系统。

最新更新