55 lines
1.5 KiB
Markdown
55 lines
1.5 KiB
Markdown
|
# Generating a Ansible Inventory File from Terraform
|
||
|
|
||
|
## Overview
|
||
|
|
||
|
Often when working with automated deployments you will want to generate a dynamic inventory file for Ansible (usually after your infrastructure has been provisioned). This is a simple snippet to generate an inventory file from Terraform.
|
||
|
|
||
|
## Terraform Snippet
|
||
|
|
||
|
First we need to create an ouput variable to hold the inventory file.
|
||
|
|
||
|
::: code-group
|
||
|
|
||
|
```hcl [ouputs.tf]
|
||
|
output "ansible_inventory_yml" {
|
||
|
description = "An Ansible inventory (in YAML format) containing IP addresses as required by the Ansible playbook to configure the servers."
|
||
|
value = local.ansible_inventory_yml
|
||
|
}
|
||
|
```
|
||
|
|
||
|
:::
|
||
|
|
||
|
Next we will create the local variable that will hold the inventory file.
|
||
|
|
||
|
::: info
|
||
|
|
||
|
In this example we are using a DigitalOcean droplet, but you can use any Terraform resource that has an IP address.
|
||
|
|
||
|
:::
|
||
|
|
||
|
::: code-group
|
||
|
|
||
|
```hcl [locals.tf]
|
||
|
locals {
|
||
|
ansible_inventory_yml = <<-EOF
|
||
|
all:
|
||
|
hosts:
|
||
|
app:
|
||
|
ansible_host: ${digitalocean_droplet.server.ipv4_address}
|
||
|
EOF
|
||
|
}
|
||
|
```
|
||
|
|
||
|
:::
|
||
|
|
||
|
::: tip
|
||
|
|
||
|
It's better to use a local and output variable rather then a local_file as this avoids spurious plan noise when running on CI runners.
|
||
|
|
||
|
:::
|
||
|
|
||
|
Once all configured you can run `terraform apply` and the inventory file will be ouput to the console. To create the file you can pipe the output to a file (either in the console or in your CI pipeline).
|
||
|
|
||
|
```bash
|
||
|
terraform output -raw ansible_inventory_yml > ansible-inventory.yml
|
||
|
```
|