【问题标题】:Terraform Module - Output error when count = 0Terraform 模块 - 计数 = 0 时的输出错误
【发布时间】:2019-01-02 20:29:32
【问题描述】:

我对 Terraform 比较陌生 - 我有一个如下的模块设置,如果在运行 terraform 计划时模块计数为“0”,我遇到的问题是输出。输出 PW 工作正常,因为我使用了 element(concat 解决方法,但我遇到问题的输出是 DCPWUn,我收到以下错误:

Error: Error refreshing state: 1 error(s) occurred:
* module.PrimaryDC.output.DCPWUn: At column 21, line 1: rsadecrypt: argument 1 should be type string, got type list in:
${element(concat("${rsadecrypt(aws_spot_instance_request.PrimaryDC.*.password_data,file("${var.PATH_TO_PRIVATE_KEY}"))}", list("")), 0)}

代码:

resource "aws_spot_instance_request" "PrimaryDC" {
  wait_for_fulfillment = true

  provisioner "local-exec" {
    command = "aws ec2 create-tags --resources ${self.spot_instance_id} --tags Key=Name,Value=${var.ServerName}0${count.index +01}"
  }

  ami                    = "ami-629a7405"
  spot_price             = "0.01"
  instance_type          = "t2.micro"
  count                  = "${var.count}"
  key_name               = "${var.KeyPair}"
  subnet_id              = "${var.Subnet}"
  vpc_security_group_ids = ["${var.SecurityGroup}"]
  get_password_data      = "true"

  user_data = <<EOF
  <powershell>
  Rename-computer -NewName "${var.ServerName}0${count.index +01}"
  </powershell> 
  EOF

  tags {
    Name = "${var.ServerName}0${count.index +01}"
  }
}

output "PW" {
 value = "${element(concat("${aws_spot_instance_request.PrimaryDC.*.password_data}", list("")), 0)}"
}

output "DCPWUn" {
 value = "${element(concat("${rsadecrypt(aws_spot_instance_request.PrimaryDC.*.password_data,file("${var.PATH_TO_PRIVATE_KEY}"))}", list("")), 0)}"
}

【问题讨论】:

    标签: terraform


    【解决方案1】:

    正如错误所说,rsadecrypt 有一个类型为列表的参数,而不是应有的字符串。如果要确保参数是字符串,则需要反转函数调用嵌套以确保 rsadecrypt 获取字符串:

    output "DCPWUn" {
        value = "${rsadecrypt(element(concat(aws_spot_instance_request.PrimaryDC.*.password_data, list("")), 0),file("${var.PATH_TO_PRIVATE_KEY}"))}"
    

    }

    【讨论】:

      【解决方案2】:

      问题出在这一行

      ${element(concat("${rsadecrypt(aws_spot_instance_request.PrimaryDC.*.password_data,file("${var.PATH_TO_PRIVATE_KEY}"))}", list("")), 0)}
      

      你想达到什么目的?让我们稍微分解一下

      • element(, 0):获取以下列表的第一个元素。
      • concat(,list("")):连接以下字符串列表,然后附加包含空字符串的列表的连接(请注意,第二部分没有用,因为您要附加一个空字符串)。
      • rsadecrypt(,file("${var.PATH_TO_PRIVATE_KEY}")):用私钥解密下面的表达式(错误:下面的东西需要是一个字符串,你将提供一个列表)
      • aws_spot_instance_request.PrimaryDC.*.password_data 这是所有密码数据的列表(而不是字符串)。

      我不知道您想要的输出应该是什么样子,但是通过上面的列表,您可以混合搭配这些功能以满足您的需求。

      编辑:感谢 rahuljain1311 的评论,修正了一个错误。

      【讨论】:

      猜你喜欢
      • 2021-01-16
      • 2021-02-12
      • 2020-12-22
      • 2021-03-07
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      • 2021-04-09
      • 1970-01-01
      相关资源
      最近更新 更多