1
1
mirror of https://github.com/adammck/terraform-inventory synced 2024-11-29 20:51:48 +01:00
terraform-inventory/README.md

196 lines
6.2 KiB
Markdown
Raw Normal View History

2015-12-15 04:47:35 +01:00
# Terraform Inventory
2014-09-19 23:34:41 +02:00
2016-08-12 04:10:03 +02:00
[![Build Status](https://travis-ci.org/adammck/terraform-inventory.svg?branch=master)](https://travis-ci.org/adammck/terraform-inventory)
[![GitHub release](https://img.shields.io/github/release/adammck/terraform-inventory.svg?maxAge=2592000)](https://github.com/adammck/terraform-inventory/releases)
[![GitHub release](https://img.shields.io/homebrew/v/terraform-inventory.svg?maxAge=2592000)](http://braumeister.org/formula/terraform-inventory)
2017-07-12 05:26:28 +02:00
This is a little Go app which generates a dynamic [Ansible][ans] inventory from
a [Terraform][tf] state file. It allows one to spawn a bunch of instances with
Terraform, then (re-)provision them with Ansible.
The following providers are supported:
* AWS
* CloudStack
* DigitalOcean
* Docker
2017-07-12 05:26:28 +02:00
* Exoscale
* Google Compute Engine
* [libvirt](https://github.com/dmacvicar/terraform-provider-libvirt)
2019-05-12 19:38:28 +02:00
* Linode
* OpenStack
2018-06-01 16:08:22 +02:00
* Packet
2018-06-18 18:51:21 +02:00
* ProfitBricks
2017-11-27 17:05:02 +01:00
* Scaleway
* SoftLayer
* VMware
2019-02-14 16:53:36 +01:00
* Nutanix
2019-05-21 16:01:43 +02:00
* Open Telekom Cloud
2017-07-12 05:26:28 +02:00
It's very simple to add support for new providers. See pull requests with the
[provider][pv] label for examples.
2015-06-05 05:17:39 +02:00
2014-09-24 20:47:37 +02:00
2016-09-22 06:18:17 +02:00
# Help Wanted 🙋
This library is stable, but I've been neglecting it somewhat on account of no
longer using Ansible at work. Please drop me a line if you'd be interested in
helping to maintain this tool.
2015-02-09 22:51:45 +01:00
# Installation
On OSX, install it with Homebrew:
brew install terraform-inventory
2014-09-24 20:47:37 +02:00
2016-08-12 04:13:43 +02:00
Alternatively, you can download a [release][rel] suitable for your platform and
unzip it. Make sure the `terraform-inventory` binary is executable, and you're
ready to go.
2015-02-09 22:51:45 +01:00
2016-01-07 23:01:24 +01:00
2015-02-09 22:51:45 +01:00
## Usage
2014-09-24 20:47:37 +02:00
If you are using [remote state][rs] (or if your state file happens to be named
`terraform.tfstate`), `cd` to it and run:
2015-06-05 06:44:36 +02:00
2016-05-19 17:16:49 +02:00
ansible-playbook --inventory-file=/path/to/terraform-inventory deploy/playbook.yml
2015-06-05 06:44:36 +02:00
This will provide the resource names and IP addresses of any instances found in
the state file to Ansible, which can then be used as hosts patterns in your
playbooks. For example, given for the following Terraform config:
2016-01-07 23:01:24 +01:00
resource "digitalocean_droplet" "my_web_server" {
2015-06-05 06:44:36 +02:00
image = "centos-7-0-x64"
name = "web-1"
region = "nyc1"
size = "512mb"
}
The corresponding playbook might look like:
2016-01-07 23:01:24 +01:00
- hosts: my_web_server
2015-06-05 06:44:36 +02:00
tasks:
- yum: name=cowsay
- command: cowsay hello, world!
Note that the instance was identified by its _resource name_ from the Terraform
2016-01-07 23:01:24 +01:00
config, not its _instance name_ from the provider. On AWS, resources are also
grouped by their tags. For example:
resource "aws_instance" "my_web_server" {
instance_type = "t2.micro"
ami = "ami-96a818fe"
tags = {
2016-01-07 23:02:26 +01:00
Role = "web"
Env = "dev"
2016-01-07 23:01:24 +01:00
}
}
resource "aws_instance" "my_worker" {
instance_type = "t2.micro"
ami = "ami-96a818fe"
tags = {
2016-01-07 23:02:26 +01:00
Role = "worker"
Env = "dev"
2016-01-07 23:01:24 +01:00
}
}
Can be provisioned separately with:
- hosts: role_web
tasks:
- command: cowsay this is a web server!
- hosts: role_worker
tasks:
- command: cowsay this is a worker server!
- hosts: env_dev
tasks:
- command: cowsay this runs on all dev servers!
2015-06-05 06:44:36 +02:00
## More Usage
Ansible doesn't seem to support calling a dynamic inventory script with params,
so if you need to specify the location of your state file or terraform directory, set the `TF_STATE`
2015-06-05 06:44:36 +02:00
environment variable before running `ansible-playbook`, like:
2016-05-19 17:16:49 +02:00
TF_STATE=deploy/terraform.tfstate ansible-playbook --inventory-file=/path/to/terraform-inventory deploy/playbook.yml
or
TF_STATE=../terraform ansible-playbook --inventory-file=/path/to/terraform-inventory deploy/playbook.yml
If `TF_STATE` is a file, it parses the file as json, if `TF_STATE` is a directory, it runs `terraform state pull` inside the directory, which is supports both local and remote terraform state.
It looks for state config in this order
- `TF_STATE`: environment variable of where to find either a statefile or a terraform project
- `TI_TFSTATE`: another environment variable similar to TF_STATE
- `terraform.tfstate`: it looks in the state file in the current directory.
- `.`: lastly it assumes you are at the root of a terraform project.
2015-06-05 06:44:36 +02:00
Alternately, if you need to do something fancier (like downloading your state
file from S3 before running), you might wrap this tool with a shell script, and
call that instead. Something like:
2014-09-24 20:47:37 +02:00
#!/bin/bash
2016-05-19 17:16:49 +02:00
/path/to/terraform-inventory $@ deploy/terraform.tfstate
2014-09-24 20:47:37 +02:00
2014-09-25 00:54:39 +02:00
Then run Ansible with the script as an inventory:
ansible-playbook --inventory-file=bin/inventory deploy/playbook.yml
2014-09-19 23:34:41 +02:00
This tool returns the public IP of the host by default. If you require the private
IP of the instance to run Ansible, set the `TF_KEY_NAME` environment variable
to `private_ip` before running the playbook, like:
TF_KEY_NAME=private_ip ansible-playbook --inventory-file=/path/to/terraform-inventory deploy/playbook.yml
2014-09-19 23:34:41 +02:00
By default, the ip address is the ansible inventory name. The `TF_HOSTNAME_KEY_NAME` environment variable allows
you to overwrite the source of the ansible inventory name.
TF_HOSTNAME_KEY_NAME=name ansible-playbook --inventory-file=/path/to/terraform-inventory deploy/playbook.yml
2014-09-19 23:34:41 +02:00
## Development
2015-02-09 22:51:45 +01:00
It's just a Go app, so the usual:
2014-09-19 23:34:41 +02:00
2015-02-09 22:51:45 +01:00
go get github.com/adammck/terraform-inventory
2014-09-19 23:34:41 +02:00
2015-06-05 04:43:56 +02:00
To test against an example statefile, run:
terraform-inventory --list fixtures/example.tfstate
terraform-inventory --host=52.7.58.202 fixtures/example.tfstate
2015-06-05 04:43:56 +02:00
2015-06-05 03:48:53 +02:00
To update the fixtures, populate `fixtures/secrets.tfvars` with your DO and AWS
account details, and run `fixtures/update`. To run a tiny Ansible playbook on
the example resourecs, run:
2016-05-19 17:16:49 +02:00
TF_STATE=fixtures/example.tfstate ansible-playbook --inventory-file=/path/to/terraform-inventory fixtures/playbook.yml
You almost certainly don't need to do any of this. Use the tests instead.
2015-06-05 03:48:53 +02:00
2014-09-19 23:34:41 +02:00
2016-01-05 16:25:36 +01:00
## Acknowledgements
2014-09-19 23:34:41 +02:00
2016-01-05 16:25:36 +01:00
Development of
[#14](https://github.com/adammck/terraform-inventory/issues/14),
[#16](https://github.com/adammck/terraform-inventory/issues/16),
and [#22](https://github.com/adammck/terraform-inventory/issues/22)
was generously sponsored by [Transloadit](https://transloadit.com).
2014-09-19 23:34:41 +02:00
2016-01-05 16:25:36 +01:00
## License
2014-09-19 23:34:41 +02:00
2016-01-05 16:25:36 +01:00
MIT.
2014-09-19 23:34:41 +02:00
2017-07-12 05:26:28 +02:00
[ans]: https://www.ansible.com
[tf]: https://www.terraform.io
[rel]: https://github.com/adammck/terraform-inventory/releases
2018-12-05 18:50:57 +01:00
[rs]: https://www.terraform.io/docs/state/remote.html
2017-07-12 05:26:28 +02:00
[pv]: https://github.com/adammck/terraform-inventory/pulls?q=is%3Apr+label%3Aprovider