【问题标题】:terraform How to use conditional if in for_each into map objectterraform如何在for_each中使用条件if进入地图对象
【发布时间】:2021-03-31 00:20:26
【问题描述】:

我有这样的变量映射:

users.tfvars

users = {
  "testterform" = {
    path          = "/"
    force_destroy = true
    email_address = "testterform@example.com"
    group_memberships = [ "test1" ]
    tags = { department : "test" }
    ssh_public_key = "ssh-rsa AAAAB3NzaC1yc2EAAA4l7"
  }

  "testterform2" = {
    path          = "/"
    force_destroy = true
    email_address = "testterform2@example.com"
    group_memberships = [ "test1" ]
    tags = { department : "test" }
    ssh_public_key = ""
  }

只有当ssh_public_key 对用户来说不是空的时,我才想上传 ssh 密钥。但不明白如何检查这个

#main.tf

resource "aws_iam_user" "this" {
  for_each = var.users

  name                 = each.key
  path                 = each.value["path"]
  force_destroy        = each.value["force_destroy"]

  tags = merge(each.value["tags"], { Provisioner : var.provisioner, EmailAddress : each.value["email_address"] })
}

resource "aws_iam_user_group_membership" "this" {
  for_each = var.users

  user   = each.key
  groups = each.value["group_memberships"]

  depends_on = [ aws_iam_user.this ]
}

resource "aws_iam_user_ssh_key" "this" {

  for_each = var.users

  username = each.key
  encoding = "SSH"
  public_key = each.value["ssh_public_key"]

  depends_on = [ aws_iam_user.this ]
}

【问题讨论】:

    标签: terraform


    【解决方案1】:

    听起来您在这里需要的是派生的“具有非空 SSH 密钥的用户”映射。您可以使用for expressionif 子句从现有集合派生新集合,同时过滤掉一些元素:

    resource "aws_iam_user_ssh_key" "this" {
      for_each = {
        for name, user in var.users : name => user
        if user.ssh_public_key != ""
      }
    
      username   = each.key
      encoding   = "SSH"
      public_key = each.value.ssh_public_key
    
      depends_on = [aws_iam_user.this]
    }
    

    这里的派生映射使用与原始var.users 相同的键和值,但只是缺少其中一些。这意味着each.key 结果将相互关联,因此您仍将获得与预期相同的username 值,并且您的实例将具有类似aws_iam_user_ssh_key.this["testterform"] 的地址。

    【讨论】:

    • 这个答案完全符合我的需要,谢谢
    • 我们重新组织了表达式文档以减少滚动。对于任何人来说,表达式的新页面是here
    【解决方案2】:

    您可以使用 for 循环排除这些空白。
    例如,您可以在本地进行:

    variable "users" {
      default = {
        "testterform" = {
          path           = "/"
          force_destroy  = true
          tags           = { department : "test" }
          ssh_public_key = "ssh-rsa AAAAB3NzaC1yc2EAAA4l7"
        }
        "testterform2" = {
          path           = "/"
          force_destroy  = true
          tags           = { department : "test" }
          ssh_public_key = ""
        }
      }
    }
    
    locals {
      public_key = flatten([
        for key, value in var.users : 
          value.ssh_public_key if ! contains([""], value.ssh_public_key)
      ])
    }
    
    output "myout" {
      value = local.public_key
    }
    

    将输出:

    myout = [
      "ssh-rsa AAAAB3NzaC1yc2EAAA4l7",
    ]
    

    如您所见,空的已被删除,您可以在包含数组中添加要排除的其他内容。
    然后你可以在for_each 中使用local.public_key 作为你的ssh 密钥

    【讨论】:

    • 不完全是我需要的,但你给了我另一个案例的想法。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-11-01
    • 2019-04-25
    • 1970-01-01
    • 2021-03-09
    • 2022-01-11
    • 2023-02-08
    • 2021-04-14
    • 2020-08-20
    相关资源
    最近更新 更多