我有一个安装了 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
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
提供程序将建议重写文件以仅包含新值。