Lord Dorian Shadow
Lord Dorian Shadow

Reputation: 3

Issues with Terraform creating a string of IP addresses

I would like to create EC2 VMs with the following resource declaration using Terraform.

resource "aws_instance" "wurststand" {
  for_each = toset(["bratwurst-01", "bratwurst-02", "bratwurst-03", "currywurst-01", "currywurst-02" , "hotdog-01"])
  ami = "ami-0c9354388bb36c088"
  instance_type = "t2.micro"
  key_name = "wurststand"

  tags = {
    name = each.key
  }
}

Now I need the public_ip addresses of all Bratwurst instances in one string. To create a group_vars file for ansible that fills a JINJA2 template again. How do I do this. I already tried to solder this with join but somehow Terraform doesn't like it.

The final result should look like this: 127.0.0.1, 127.0.0.2, 127.0.0.3.

Thank you for your help.

Upvotes: 0

Views: 497

Answers (2)

Lord Dorian Shadow
Lord Dorian Shadow

Reputation: 3

So this is my solution with which it does what I want.

resource "aws_instance" "wurststand" {
  for_each = toset(["bratwurst-01", "bratwurst-02", "currywurst-01", "currywurst-02", "currywurst-03", "hotdog-01", "logstash-01"])
  ami = "ami-0c9354388bb36c088"
  instance_type = "t2.micro"
  key_name = "wurststand"

  tags = {
    Name = each.key
  }
}

resource "local_file" "inventory" {
  content = templatefile("templates/inventory.tftpl", {
    elastic = tomap({
       for instance in aws_instance.wurststand:
        instance.tags.Name => instance.public_ip
      })
  })
  filename = format("%s/%s", abspath(path.root), "../ansible/inventory/inventory.cfg")
}

resource "local_file" "bratwurst_hosts_for_group_vars" {
  content = templatefile("templates/bratwurst_groupvars.tftpl", {
    hosts = join("\" , \"", [for i in aws_instance.wurststand: i.public_ip if contains("bratwurst", i.tags.Name)])
  })
  filename = format("%s/%s", abspath(path.root), "../ansible/group_vars/Bratwurst.yml")
}

Thanks a lot for your help.

Upvotes: 0

Mark B
Mark B

Reputation: 201138

You need to use a for expression to extract the list of IPs from the set of aws_instance resources, and then pass that to join:

join(", ", [for i in aws_instance.wurststand : i.private_ip])

Upvotes: 1

Related Questions