Ansible 与 terraform 动态库存

问题描述 投票:0回答:1

我有一个安装了 Jenkins、Ansible 和 Terraform 的 EC2 实例。我想要做的是创建一个 Jenkins 作业,该作业运行 Terraform 脚本以创建新的 EC2 实例和 Ansible playbook 以在新实例中安装 Tomcat。我的问题是,当我运行 terraform apply 时,我想在清单文件中包含实例的新 IP。每次创建新实例时如何更改该 IP?

这是 main.tf 文件的一部分:

resource "aws_instance" "my_vm" {
  ami           = var.ami //Linux AMI
  instance_type = var.instance_type
  key_name      = "DevOpsKey_Licenta"

  subnet_id                   = aws_subnet.public_subnet.id
  vpc_security_group_ids      = [aws_security_group.terra_tomcat_sg.id]
  associate_public_ip_address = true

  tags = {
    Name = var.name_tag
  }

  provisioner "local-exec" {
    command = "echo ${aws_instance.my_vm.public_ip} >> /opt/infrastructure-pipeline/inventory"
  } 
}

我每次都尝试使用该命令添加新IP,但我也有最后一个。 这是库存文件:

[tomcat]
32.153.123.41
12.100.99.3
amazon-web-services ansible terraform terraform-provider-aws
1个回答
1
投票

我建议使用

local_file
提供者 提供的
hashicorp/local
资源类型
,而不是为此使用配置程序。这将导致 Terraform 以与管理 EC2 实例类似的方式“管理”输出文件,如果配置的内容在将来运行时发生更改,则根据需要更新它。

terraform {
  required_providers {
    aws = {
      source = "hashicorp/aws"
    }
    local = {
      source = "hashicorp/local"
    }
  }
}

resource "aws_instance" "my_vm" {
  ami           = var.ami //Linux AMI
  instance_type = var.instance_type
  key_name      = "DevOpsKey_Licenta"

  subnet_id                   = aws_subnet.public_subnet.id
  vpc_security_group_ids      = [aws_security_group.terra_tomcat_sg.id]
  associate_public_ip_address = true

  tags = {
    Name = var.name_tag
  }
}

resource "local_file" "ansible" {
  filename = "/opt/infrastructure-pipeline/inventory"
  content = <<-EOT
    [tomcat]
    ${aws_instance.my_vm.public_ip}
  EOT
}

这种声明式方法直接解决了问题中描述的问题,即每次 IP 地址更改时用新 IP 地址替换旧 IP 地址,而不是仅仅追加。上面的配置使 Terraform 负责整个文件,因此每当

aws_instance.my_vm.public_ip
更改时
hashicorp/local
提供程序将建议重写文件以仅包含新值。

© www.soinside.com 2019 - 2024. All rights reserved.