簡體   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