Terrible (TERRaform to ansIBLE) creates dynamic Ansible inventory from Terraform state.
- Free software: Apache Software License 2.0
- Documentation: https://terrible.readthedocs.io.
To install terrible, run this command in your terminal.:
$ pip install terrible
Once installed a symbolic link or shell script can be added to the Ansible inventory directory.
Symbolic link.:
$ ln -s /path/to/terrible inventory/terrible
Simple shell script wrapper.:
#!/usr/bin/env bash terrible "$@"
Usage: terrible [OPTIONS] <root_dir> Terrible extracts Ansible inventory data from Terraform state. The <root_dir> is relative to the directory where Ansible is executed but defaults to ./terraform in the current directory. Options: --host TEXT Show varibles for single host --list List all variables --nometa Remove _meta from output --pretty Make json look pretty --help Show this message and exit.
- VMware vSphere (vsphere_virtual_machine)
- AWS Instance (aws_instance)
These can be specified by all resources. Uniq configuration details are documented in specific sections below.
- ansible_user (Optional)
- The user that Ansible will connect to the host. Defaults to root if not specified.
- ansible_group (Optional)
- The inventory group associated with the resource. (Add default All group?)
- ansible_host (Optional)
- The host that Ansible will connect to. VMware defaults to IP of 1st interface,
network_interface:0
but if can be overwriten to an specific IP. AWS defaults topublic_ip
and configuralbe toprivate_ip
. (TODO: Add test and error condition for values)
When defining Terraform vsphere_virtual_machine
resource use the
custom_configuration_parameters
block to set Ansible parameters.
Configuration example:
custom_configuration_parameters { ansible_group = "api-gateway" ansible_user = "ansible" ansible_host = "192.168.52.101" }
When defining a Terraform aws-instance
resource use tags to set Ansible
parameters.
- ansible_ssh_private_key_file
- The key used to connect to AWS instance. The value is the path to the private
key that matches the defined AWS instance key_name. Defaults to the value of
key_name + .pem
. EXAMPLE: If your AWS instance key_name isterraform
then Ansible would look in the current working directory for terraform.pem
Configuration example:
tags { Name = "app1-aws" ansible_groups = "webapp" ansible_user = "ansible" ansible_host = "private_ip" ansible_ssh_private_key_file = "aws-keys/webapp-terraform.pem" }
By default, Terrible looks for the terraform
inside the Ansible playbook root directory.:
. ├── ansible.cfg ├── inventory │ ├── group_vars │ └── terrible ├── playbooks │ └── site.yml ├── requirements.yml ├── roles │ └── example_role └── terraform ├── terraform.tf ├── terraform.tfstate ├── terraform.tfvars └── variables.tf
This package was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template.
This package was greatly influenced by the sean-abbott/terraform.py project.