嵌套结构的tfvars文件中变量terraform的设置值

嵌套结构的tfvars文件中变量terraform的设置值,terraform,Terraform,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 ma

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文件中

对于具有简单值的变量,这很容易,但我不清楚如何使用嵌套结构。将xxx.xxx.xx.xxx替换为变量[例如var.work\u ip]会导致错误

variables may not be used here

有什么见解吗?

如果您在主配置中完全忽略了
default
参数,您将把
变量“authorized\u 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\u compute\u子网络
数据源检索此设置:

data "google_compute_subnetwork" "work" {
  name   = "work"
}
在配置的其他地方,您可以使用
data.google\u compute\u subnetwork.work.ip\u cidr\u range
访问此网络的cidr块定义


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

如果在主配置中完全省略
默认值
参数,则将
变量“authorized\u 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\u compute\u子网络
数据源检索此设置:

data "google_compute_subnetwork" "work" {
  name   = "work"
}
在配置的其他地方,您可以使用
data.google\u compute\u subnetwork.work.ip\u cidr\u range
访问此网络的cidr块定义


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

您能否编辑您的问题,使其成为可运行的问题?从这个更加精简的背景中,你还不能100%清楚地知道你想要达到什么目标或限制。你看到了吗?该线程似乎有一些潜在的解决方法,可能使用空资源。我自己还没有用过,所以不能提供进一步的见解…你能编辑你的问题使其成为一个可运行的问题吗?从这个更加精简的背景中,你还不能100%清楚地知道你想要达到什么目标或限制。你看到了吗?该线程似乎有一些潜在的解决方法,可能使用空资源。我自己还没有用过,所以无法提供进一步的见解。。。