【问题标题】:setting value of variable terraform in tfvars file for nested structure在嵌套结构的 tfvars 文件中设置变量 terraform 的值
【发布时间】:2019-07-26 12:30:54
【问题描述】:

terraform 已调整授权

在 main.tf [for sql config] 我现在有:

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

有什么见解吗?

【问题讨论】:

  • 您能否编辑您的问题以使其成为可运行的minimal reproducible example?从这个更加精简的上下文中,并不是 100% 清楚您想要实现的目标或限制。
  • 你见过this issue吗?该线程似乎有一些潜在的解决方法,可能使用空资源。自己没有使用过,所以无法提供进一步的见解......

标签: terraform


【解决方案1】:

如果您在主配置中完全省略了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 能够通过 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 Parameter Store 或 HashiCorp Consul 等配置存储的更通用的数据源。直接访问必要的信息或在配置存储中“在线”发布这些信息有助于在更大的系统中有效地集成子系统。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-28
    • 2019-01-21
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 2021-10-09
    • 1970-01-01
    相关资源
    最近更新 更多