繁体   English   中英

在 Terraform 中动态添加资源

[英]Dinamically add resources in Terraform

我设置了一个 jenkins 管道,它启动 terraform 以在我们的 VPC 中创建一个新的 EC2 实例,并在每次运行时将其注册到我们在 R53(同时创建)上的私有托管区域。

我还设法将状态保存到 S3 中,因此它不会因重新创建托管区域而失败。

我遇到的主要问题是,每次运行 terraform 时,都会不断用新实例替换前一个实例,而不是将其添加到实例池中。

如何避免这种情况?

这是我的代码片段

terraform {
  backend "s3" {
    bucket = "<redacted>"
    key    = "<redacted>/terraform.tfstate"
    region = "eu-west-1"
  }
}

provider "aws" {
  region     = "${var.region}"
}

data "aws_ami" "image" {

  # limit search criteria for performance
  most_recent = "${var.ami_filter_most_recent}"
  name_regex  = "${var.ami_filter_name_regex}"
  owners      = ["${var.ami_filter_name_owners}"]

  # filter on tag purpose
  filter {
    name   = "tag:purpose"
    values = ["${var.ami_filter_purpose}"]
  }

  # filter on tag os
  filter {
    name   = "tag:os"
    values = ["${var.ami_filter_os}"]
  }

}

resource "aws_instance" "server" {

  # use extracted ami from image data source
  ami = data.aws_ami.image.id

  availability_zone = data.aws_subnet.most_available.availability_zone

  subnet_id = data.aws_subnet.most_available.id

  instance_type = "${var.instance_type}"

  vpc_security_group_ids = ["${var.security_group}"]

  user_data = "${var.user_data}"

  iam_instance_profile = "${var.iam_instance_profile}"

  root_block_device {
    volume_size = "${var.root_disk_size}"
  }

  ebs_block_device {
    device_name = "${var.extra_disk_device_name}"
    volume_size = "${var.extra_disk_size}"
  }

  tags = {
    Name              = "${local.available_name}"
  }

}

resource "aws_route53_zone" "private" {
  name = var.hosted_zone_name

  vpc {
    vpc_id = var.vpc_id
  }
}

resource "aws_route53_record" "record" {
  zone_id = aws_route53_zone.private.zone_id
  name    = "${local.available_name}.${var.hosted_zone_name}"
  type    = "A"
  ttl     = "300"
  records = [aws_instance.server.private_ip]

  depends_on = [
    aws_route53_zone.private
  ]
}

结果是我之前创建的实例被销毁并创建了一个新实例。 我想要的是继续使用此代码添加实例。 谢谢你

您的代码仅创建一个实例aws_instance.server ,并且对其属性的任何更改都只会在您的后端在 S3 中时修改该实例,因此它充当每个管道的全局状态。 aws_route53_record.record和脚本中的任何其他内容也是如此。

如果您希望不同的管道重用完全相同的脚本,您应该使用不同的工作空间,或者为每个管道创建不同的 TF 状态。 另一种替代方法是重新定义您的 TF 脚本,以将实例映射作为输入变量并使用for_each创建不同的实例。

如果这些实例应该相同,您应该使用aws_autoscaling_group和所需容量来管理它们的数量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM