【问题标题】:loop over the variable in terraform遍历terraform中的变量
【发布时间】:2016-12-23 22:14:53
【问题描述】:

我对 terraform 真的很陌生,并且希望能够完成这项工作。我能够创建 vpc、公共子网并获取它们的 ID,现在我想在每个子网内创建一个 ec2 实例,当我尝试运行 ec2 模块时,它只在第一个子网内创建实例并忽略其他子网。这是我的代码的 sn-p。

输出子网ID:

output "public_subnets_id" {
  value = "${join(",", aws_subnet.public.*.id)}"
}

这里的示例输出:

public_subnets_id = subnet-84aae6f4,subnet-a12124e8

这是我的代码,我试图将其拆分并在每个子网内创建实例,但只能创建到第一个子网。

subnet_id = "${element(split(",", var.subnet_id), count.index)}"

【问题讨论】:

标签: terraform


【解决方案1】:

我将 EC2 实例分布在不同的可用区,如下所示:

variable "zones" {
  default = {
    zone0 = "us-east-1a"
    zone1 = "us-east-1b"
    zone2 = "us-east-1c"
  }
}

variable "cidr_blocks" {
  default = {
    zone0 = "172.32.0.0/20"
    zone1 = "172.32.16.0/20"
    zone2 = "172.32.32.0/20"
  }
}

variable "dockerhost_instances" {
  default = "5"
}

resource "aws_subnet" "public-subnet" {
  ...
  cidr_block = "${lookup(var.cidr_blocks, format("zone%d", count.index))}"
  availability_zone = "${lookup(var.zones, format("zone%d", count.index))}"
  count = 3
}


resource "aws_instance" "host" {
  ...
  subnet_id = "${element(aws_subnet.public-subnet.*.id,count.index)}"
  count = "${var.dockerhost_instances}"
}

因为 ${element(...)} 函数环绕,结果是三个子网和五个主机分布在子网上:

us-east-1a : host.0 host.3
us-east-1b : host.1 host.4
us-east-1c : host.2

【讨论】:

    【解决方案2】:

    看来问题出在resource "aws_instance"define,

    count ="${length(split(",", var.subnet_id))}"
    

    https://github.com/arbabnazar/terraform-aws/blob/1891cf2a31a0e9db425dd5243018d46eeb6d5330/modules/ec2/main.tf#L5

    如果直接设置count为2,会得到两个实例吗?

    我的理解是,ec2资源的计数应该设置为默认值,比如2,或者直接在variable.tf中定义ec2_num为一个数字,然后在资源ec2中通过var.ec2_num调用它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-10
      • 2019-03-21
      • 2022-12-11
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 2011-01-13
      相关资源
      最近更新 更多