【问题标题】:Get index count in terraform dynamic block获取 terraform 动态块中的索引计数
【发布时间】:2022-01-27 20:56:47
【问题描述】:

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

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
    }))
  }))
 }

【问题讨论】:

  • 为什么不同时使用for_eachrandom_password
  • 感谢您的回复。你能提供一些小例子吗?)
  • 我尝试运行计划,但不幸的是,Yandex 云需要我没有的凭据,并且您省略了 PostgreSQL 资源所需的大部分配置,所以请告诉我答案是否有效.

标签: terraform


【解决方案1】:

由于您在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

【讨论】:

  • 伙计,你真漂亮)解决方案正是我需要的)谢谢!
  • 哈哈,我可能很漂亮,但 Terraform 更漂亮。 :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 2020-08-18
  • 2021-08-10
  • 2021-10-06
  • 2021-08-11
相关资源
最近更新 更多