获取 terraform 动态块中的索引计数

Get index count in terraform dynamic block

请告诉我,如何在遍历对象时获取动态块中的迭代索引? 我需要用索引替换 0 以获得不同用户的不同密码。

resource "random_password" "pwd" {
  count = length(var.users)
  length           = 18
  special          = true
  override_special = "_!%@"
}

resource "yandex_mdb_postgresql_cluster" "mdb_postgres" {

  dynamic "user" {
    for_each = var.users
    content {
      name       = user.value.name
      password   = user.value.password == "" || user.value.password == null ? random_password.pwd[0].result : user.value.password
    }
  }
}

用户是对象

variable "users" {
  type = map(object({
    name       = string
    password   = string
    conn_limit = number
    permissions = list(object({
      database_name = string
    }))
  }))
 }

由于您在 yandex_mdb_postgresql_cluster 资源中使用 for_each,因此在创建密码时可以使用相同的逻辑。这样,将创建与第二个资源具有相同键名的 random_password 资源。这是一个工作示例:

resource "random_password" "pwd" {
  for_each         = var.users
  length           = 18
  special          = true
  override_special = "_!%@"
}

variable "users" {
  type = map(object({
    name       = string
    password   = string
    conn_limit = number
    permissions = list(object({
      database_name = string
    }))
  }))
}

对于具有以下值的 terraform.tfvars 文件:

users = {
  "marko" = {
    conn_limit = 1
    name       = "marko"
    password   = "pass123"
    permissions = [{
      database_name = "dbname"
    }]
  },
  "valeriy" = {
    conn_limit = 1
    name       = "valeriy"
    password   = "pass456"
    permissions = [{
      database_name = "dbname1"
    }]
  }
}

它将创建两个元素,其键对应于 users 变量中的键:

Terraform will perform the following actions:

  # random_password.pwd["marko"] will be created
  + resource "random_password" "pwd" {
      + id               = (known after apply)
      + length           = 18
      + lower            = true
      + min_lower        = 0
      + min_numeric      = 0
      + min_special      = 0
      + min_upper        = 0
      + number           = true
      + override_special = "_!%@"
      + result           = (sensitive value)
      + special          = true
      + upper            = true
    }

  # random_password.pwd["valeriy"] will be created
  + resource "random_password" "pwd" {
      + id               = (known after apply)
      + length           = 18
      + lower            = true
      + min_lower        = 0
      + min_numeric      = 0
      + min_special      = 0
      + min_upper        = 0
      + number           = true
      + override_special = "_!%@"
      + result           = (sensitive value)
      + special          = true
      + upper            = true
    }

Plan: 2 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

random_password.pwd["valeriy"]: Creating...
random_password.pwd["marko"]: Creating...
random_password.pwd["valeriy"]: Creation complete after 0s [id=none]
random_password.pwd["marko"]: Creation complete after 0s [id=none]

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

注意方括号中的重点,例如:random_password.pwd["valeriy"].

这意味着您现在可以使用 users 变量中的密钥名称来引用第二个资源中的密码:

resource "yandex_mdb_postgresql_cluster" "mdb_postgres" {

  dynamic "user" {
    for_each = var.users
    content {
      name       = user.value.name
      password   = user.value.password == "" || user.value.password == null ? random_password.pwd[user.key].result : user.value.password
    }
  }
}

请注意,现在访问随机密码值的方法是 random_password.pwd[user.key].result 中的 user.key