This should be a short one. So Ansible has dynamic inventories however I’ve found it a bit slow with VMware if you have a lot of infrastructure to parse through (a lot being around 3,000 VMs in your vCenter and slow being around 15 minutes). I also couldn’t figure out a way to use tags to limit what you’re searching on. This admittedly could have changed recently but since I’ve been using this method I haven’t tried too hard to find out. However, if you’re running in a pipeline, you can just have Terraform generate a static inventory for Ansible to use during the pipeline.

To do this you just need to use the local_file provider with the template_file data source. So for a simple example we could just use our output variables from our module in our template.

terraform
  • main
  • template
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
module "testing" {
    #misc module variables
}

data "template_file" "inventory" {
    template = file("./inventory.tpl")

    vars = {
        servers = "${join("\n", formatlist("%s ansible_host=%s", module.testing.server_names, module.testing.server_ips))}"
    }
}

resource "local_file" "ansible_inventory" {
    content = "${data.template_file.inventory.rendered}
    filename = "./inventory"
}

Obviously tailor the module name and output variable names to the correct ones. If you output an FQDN then you don’t need the ip addres and ansible_host in the inventory. Rinse and repeat for however many groups you want.