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

时间:2019-07-26 12:30:54

标签: 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 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_ip]导致错误

variables may not be used here

有什么见解?

1 个答案:

答案 0 :(得分:0)

如果您在主配置中完全省略了default参数,则将variable "authorized_networks"标记为 required 输入变量,然后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选项在命令行上显式指定此文件,或者在您使用当前工作目录中的文件名时以.auto.tfvars.auto.tfvars.json结尾运行Terraform,然后Terraform将自动查找并加载它。


使某些内容脱离版本控制的常见原因是,它是在更广泛的系统中其他位置配置的动态设置,而不是版本控制中固定的值。如果在这里是对的,那么另一种策略是将该设置保存在Terraform可以通过data sources访问的配置数据存储中,然后编写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参数存储或HashiCorp Consul之类的配置存储的更通用的数据源。直接访问必要的信息或将其“在线”发布到配置存储中,对于大型系统有效地集成子系统很有帮助。