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.

main.tf:

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"
}

template.tpl:

[servers]
${servers}

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.