【问题标题】:How to use random_password multiple times in terraform script如何在 terraform 脚本中多次使用 random_password
【发布时间】:2020-11-04 10:09:47
【问题描述】:

如何在 terraform 脚本中多次使用 random_password。例如:

resource "random_password" "password" {
  length = 16
  special = true
  override_special = "_%@"
}
resource "aws_db_instance" "example" {
  instance_class = "db.t3.micro"
  allocated_storage = 64
  engine = "mysql"
  username = "someone"
  password = random_password.password.result
}

这将工作一次。如果我需要创建怎么办

resource "random_password" "password" {
  length = 16
  special = true
  override_special = "_%@"
}
resource "aws_db_instance" "example1" {
  instance_class = "db.t3.micro"
  allocated_storage = 64
  engine = "mysql"
  username = "someone"
  password = random_password.password.result
}
resource "aws_db_instance" "example2" {
  instance_class = "db.t2.small"
  allocated_storage = 64
  engine = "mysql"
  username = "anyone"
  password = random_password.password.result
}

现在我需要创建 2 个随机密码。我可以在随机密码中使用count吗?

【问题讨论】:

    标签: terraform terraform-provider-aws


    【解决方案1】:

    您可以使用 count 或 for_each 循环。

    resource "random_password" "password" {
      count = 2
      length = 16
      special = true
      override_special = "_%@"
    }
    
    resource "aws_db_instance" "example" {
      for_each = random_password.password
      instance_class = "db.t3.micro"
      allocated_storage = 64
      engine = "mysql"
      username = "someone"
      password = each.value.result
    }
    

    这将导致 -
    random_password.password[0].resultrandom_password.password[1].result 用于您的结果值(当 for_each 或 count 用于递归时,没有索引的random_password.password 被视为 terraform 中的任何其他地图)。我在示例中将计数设置为 2,但这可以是任何 int。

    aws_db_instance.example[0]aws_db_instance.example[1],由for_each 循环根据random_password.password 对象的数量创建。在循环中,您将资源引用为 each.value(因此,each.value.result 将等同于 random_password.password.result

    更多关于for_eachhere

    编辑:重要说明...这只是 count/for_each 如何工作的示例。将您的实例数量基于您创建的密码数量真的很尴尬(想想看......)。您需要有一个更大的视野,并考虑您实际希望如何扩展您的项目,然后将您的 count/for_each 逻辑基于此。

    EDIT2(因为我没有足够的业力来评论):没有理由输出不应该工作。您使用的是什么版本的 tf?)。

    此外,要获取您可以执行的结果列表:

    output "passwords" {
      value = random_password.password[*].result
    }
    

    【讨论】:

    • 感谢您的帮助。我不能使用 for_each,因为每个 aws_db_instance 的用户名和 instance_class 都不同。我基本上很想知道我将如何在不同的区块中使用随机密码。
    • 即使这样也行不通。如何输出生成的密码 output "password0" { value = "${random_password.password[0].result}" }
    【解决方案2】:

    如果您生成的每个密码的密码要求都相同(可能是您的情况),请使用count

    resource "random_password" "passwords" {
      count = 2
      length = 16
      special = true
    }
    
    resource "aws_db_instance" "db_instance_1" {
      ...
      password = random_password.passwords[0].result
    }
    
    resource "aws_db_instance" "db_instance_2" {
      ...
      password = random_password.passwords[1].result
    }
    
    output "db_instance_1_password" {
      value = random_password.passwords[0].result
    }
    
    output "db_instance_2_password" {
      value = random_password.passwords[1].result
    }
    

    如果密码要求不同,定义多个random_password资源:

    resource "random_password" "password_1" {
      length = 16
      special = true
    }
    
    resource "random_password" "password_2" {
      length = 16
      special = false
      min_upper = 1
      min_lower = 1
      min_numeric = 1
    }
    
    resource "aws_db_instance" "db_instance_1" {
      ...
      password = random_password.password_1.result
    }
    
    resource "aws_db_instance" "db_instance_2" {
      ...
      password = random_password.password_2.result
    }
    
    output "db_instance_1_password" {
      value = random_password.password_1.result
    }
    
    output "db_instance_2_password" {
      value = random_password.password_2.result
    }
    

    在这两种情况下,请考虑在输出中设置 sensitive = true 以隐藏 Terraform 命令输出中的原始密码。

    【讨论】:

      猜你喜欢
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      • 2020-02-14
      • 2021-09-12
      • 2021-09-17
      • 2018-01-05
      • 1970-01-01
      • 2021-09-06
      相关资源
      最近更新 更多