Consumes Terraform State and generates Ansible inventory.
Project description
python-terraform-to-ansible-inventory
This package is for consuming Terraform State, parsing the data, and then generating a functional Ansible inventory which can then be consumed by Ansible.
Ansible Groups
By default all VMs are placed into the Ansible group terraform_vms
, however
you can also define additional Ansible groups by leveraging tags on your VM
resources. By default this will currently look for tags.ansible_groups
which
can be defined on a resource as below:
NOTE: Currently only limited testing on AWS, Azure, and vSphere resources.
tags {
ansible_groups = "['test', 'cluster']"
}
Installation
Manual
You can manually install this package by executing the following:
python setup.py install
Using pip
You can also install using pip
:
pip install TerraformToAnsibleInventory
After installation, you can then use this package from anywhere within your terminal session.
TerraformToAnsibleInventory -t terraform.tfstate.vsphere -i terraform_inventory.yml
Supported Terraform Backends
The following backends are currently supported for consumption.
- local - A local
terraform.tfstate
file present where executing from. - consul - A Consul environment in which Terraform state is stored.
Execution
You can view help to familiarize yourself with the options available for usage by executing:
TerraformToAnsibleInventory --help
...
usage: TerraformToAnsibleInventory [-h] [-b {local,consul}] [-cH CONSULHOST] [-cKV CONSULKV]
[-cP CONSULPORT] [-cS {http,https}] [-i INVENTORY]
[-t TFSTATE]
optional arguments:
-h, --help show this help message and exit
-b {local,consul}, --backend {local,consul}
Define which Terraform backend to parse
-cH CONSULHOST, --consulHost CONSULHOST
Define Consul host when using Consul backend
-cKV CONSULKV, --consulKV CONSULKV
Define Consul KV Pair to query. Ex. Azure/Test
-cP CONSULPORT, --consulPort CONSULPORT
Define Consul host port
-cS {http,https}, --consulScheme {http,https}
Define Consul connection scheme.
-i INVENTORY, --inventory INVENTORY
Ansible inventory
-t TFSTATE, --tfstate TFSTATE
Terraform tftstate file
Using A Local Backend
TerraformToAnsibleInventory -t terraform.tfstate -i terraform_inventory.yml
Using A Consul Backend
TerraformToAnsibleInventory -b consul -cH consul.example.org -cKV Azure/Test -i terraform_inventory.yml
Example Inventories
AWS
aws_elb:
hosts:
web-elb: {}
aws_instance:
hosts:
i-03676fa6ba43fbb9f: {}
i-09f51a313146856cd: {}
terraform_load_balancers:
hosts:
web-elb:
access_logs: []
availability_zones:
- us-east-1a
connection_draining: true
connection_draining_timeout: '400'
cross_zone_load_balancing: true
dns_name: web-elb-1019323532.us-east-1.elb.amazonaws.com
health_checks:
- healthy_threshold: '2'
interval: '30'
target: HTTP:80/
timeout: '5'
unhealthy_threshold: '2'
idle_timeout: '400'
instances:
- i-03676fa6ba43fbb9f
- i-09f51a313146856cd
internal: true
listeners:
- instance_port: '80'
instance_protocol: http
lb_port: '80'
lb_protocol: http
name: web-elb
security_groups:
- sg-74c46809
subnets:
- subnet-690a0942
tags:
Environment: production
Name: web-elb
type: aws_elb
zone_id: Z35SXDOTRQ7X7K
terraform_vms:
hosts:
i-03676fa6ba43fbb9f:
ami: ami-b73b63a0
ansible_groups: []
availability_zone: us-east-1a
data_type: aws_instance
instance_type: t2.micro
inventory_hostname: i-03676fa6ba43fbb9f
key_name: aws-us-east
network_interface_id: eni-947bbf62
private_dns: ip-172-31-50-15.ec2.internal
private_ip: 172.31.50.15
public_dns: ec2-34-207-194-186.compute-1.amazonaws.com
public_ip: 34.207.194.186
subnet_id: subnet-690a0942
vpc_security_group_ids:
- sg-5a677425
vpc_security_groups:
- description: Security group for web production
egress_rules:
- cidr_blocks: []
from_port: '0'
protocol: '-1'
self: 'false'
to_port: '0'
- cidr_blocks:
- 0.0.0.0/0
from_port: '0'
protocol: '-1'
self: 'false'
to_port: '0'
id: sg-5a677425
ingress_rules:
- cidr_blocks: []
from_port: '80'
protocol: tcp
self: 'false'
to_port: '80'
- cidr_blocks:
- 0.0.0.0/0
from_port: '22'
protocol: tcp
self: 'false'
to_port: '22'
- cidr_blocks: []
from_port: '22'
protocol: tcp
self: 'false'
to_port: '22'
- cidr_blocks:
- 0.0.0.0/0
from_port: '80'
protocol: tcp
self: 'false'
to_port: '80'
name: web-production-sg
i-09f51a313146856cd:
ami: ami-b73b63a0
ansible_groups: []
availability_zone: us-east-1a
data_type: aws_instance
instance_type: t2.micro
inventory_hostname: i-09f51a313146856cd
key_name: aws-us-east
network_interface_id: eni-0679bdf0
private_dns: ip-172-31-63-104.ec2.internal
private_ip: 172.31.63.104
public_dns: ec2-34-203-236-205.compute-1.amazonaws.com
public_ip: 34.203.236.205
subnet_id: subnet-690a0942
vpc_security_group_ids:
- sg-5a677425
vpc_security_groups:
- description: Security group for web production
egress_rules:
- cidr_blocks: []
from_port: '0'
protocol: '-1'
self: 'false'
to_port: '0'
- cidr_blocks:
- 0.0.0.0/0
from_port: '0'
protocol: '-1'
self: 'false'
to_port: '0'
id: sg-5a677425
ingress_rules:
- cidr_blocks: []
from_port: '80'
protocol: tcp
self: 'false'
to_port: '80'
- cidr_blocks:
- 0.0.0.0/0
from_port: '22'
protocol: tcp
self: 'false'
to_port: '22'
- cidr_blocks: []
from_port: '22'
protocol: tcp
self: 'false'
to_port: '22'
- cidr_blocks:
- 0.0.0.0/0
from_port: '80'
protocol: tcp
self: 'false'
to_port: '80'
name: web-production-sg
Azure
azurerm_lb:
hosts:
TestLoadBalancer: {}
azurerm_virtual_machine:
hosts:
Jumphost: {}
acctvm0: {}
acctvm1: {}
acctvm2: {}
consul_cluster:
hosts:
acctvm0: {}
acctvm1: {}
acctvm2: {}
jumphosts:
hosts:
Jumphost: {}
terraform_load_balancers:
hosts:
TestLoadBalancer:
location: eastus
name: TestLoadBalancer
private_ip_address: ''
public_ip_address: 40.121.70.170
resource_group_name: acctestrg
sku: Basic
type: azurerm_lb
terraform_vms:
hosts:
Jumphost:
ansible_groups:
- jumphosts
- test
ansible_host: 10.0.2.5
data_type: azurerm_virtual_machine
inventory_hostname: Jumphost
location: eastus
mac_address: 00-0D-3A-4E-59-66
private_ips:
- 10.0.2.5
public_ips:
- 104.211.58.178
resource_group_name: acctestrg
security_groups:
- name: JumphostSecurityGroup1
rules:
- access: Deny
description: ''
destination_address_prefix: '*'
destination_port_range: '*'
direction: Inbound
name: DenyAll
priority: '1000'
protocol: '*'
source_address_prefix: '*'
source_port_range: '*'
- access: Allow
description: ''
destination_address_prefix: '*'
destination_port_range: '22'
direction: Inbound
name: AllowTcp22InboundFromHomeNetwork
priority: '100'
protocol: Tcp
source_address_prefix: 66.73.197.182/32
source_port_range: '*'
target: azurerm_virtual_machine.Jumphost
vm_size: Standard_B1s
acctvm0:
ansible_groups:
- test
- consul_cluster
ansible_host: 10.0.2.6
data_type: azurerm_virtual_machine
inventory_hostname: acctvm0
location: eastus
mac_address: 00-0D-3A-4D-99-E5
private_ips:
- 10.0.2.6
public_ips: []
resource_group_name: acctestrg
security_groups:
- name: TestSecurityGroup1
rules:
- access: Allow
description: ''
destination_address_prefix: '*'
destination_port_range: '8500'
direction: Inbound
name: AllowTcp8500InboundHomeNetwork
priority: '200'
protocol: Tcp
source_address_prefix: 66.73.197.182/32
source_port_range: '*'
- access: Deny
description: ''
destination_address_prefix: '*'
destination_port_range: '8500'
direction: Inbound
name: DenyTcp8500Inbound
priority: '202'
protocol: Tcp
source_address_prefix: '*'
source_port_range: '*'
- access: Allow
description: ''
destination_address_prefix: '*'
destination_port_range: '22'
direction: Inbound
name: AllowTcp22InboundFromHomeNetwork
priority: '100'
protocol: Tcp
source_address_prefix: 66.73.197.182/32
source_port_range: '*'
- access: Allow
description: ''
destination_address_prefix: '*'
destination_port_range: '8500'
direction: Inbound
name: AllowTcpInboundLbProbe
priority: '201'
protocol: Tcp
source_address_prefix: 168.63.129.16/32
source_port_range: '*'
target: azurerm_virtual_machine.acctvm0
vm_size: Standard_B1s
acctvm1:
ansible_groups:
- test
- consul_cluster
ansible_host: 10.0.2.4
data_type: azurerm_virtual_machine
inventory_hostname: acctvm1
location: eastus
mac_address: 00-0D-3A-4D-CA-DC
private_ips:
- 10.0.2.4
public_ips: []
resource_group_name: acctestrg
security_groups:
- name: TestSecurityGroup1
rules:
- access: Allow
description: ''
destination_address_prefix: '*'
destination_port_range: '8500'
direction: Inbound
name: AllowTcp8500InboundHomeNetwork
priority: '200'
protocol: Tcp
source_address_prefix: 66.73.197.182/32
source_port_range: '*'
- access: Deny
description: ''
destination_address_prefix: '*'
destination_port_range: '8500'
direction: Inbound
name: DenyTcp8500Inbound
priority: '202'
protocol: Tcp
source_address_prefix: '*'
source_port_range: '*'
- access: Allow
description: ''
destination_address_prefix: '*'
destination_port_range: '22'
direction: Inbound
name: AllowTcp22InboundFromHomeNetwork
priority: '100'
protocol: Tcp
source_address_prefix: 66.73.197.182/32
source_port_range: '*'
- access: Allow
description: ''
destination_address_prefix: '*'
destination_port_range: '8500'
direction: Inbound
name: AllowTcpInboundLbProbe
priority: '201'
protocol: Tcp
source_address_prefix: 168.63.129.16/32
source_port_range: '*'
target: azurerm_virtual_machine.acctvm1
vm_size: Standard_B1s
acctvm2:
ansible_groups:
- test
- consul_cluster
ansible_host: 10.0.2.7
data_type: azurerm_virtual_machine
inventory_hostname: acctvm2
location: eastus
mac_address: 00-0D-3A-4E-54-5F
private_ips:
- 10.0.2.7
public_ips: []
resource_group_name: acctestrg
security_groups:
- name: TestSecurityGroup1
rules:
- access: Allow
description: ''
destination_address_prefix: '*'
destination_port_range: '8500'
direction: Inbound
name: AllowTcp8500InboundHomeNetwork
priority: '200'
protocol: Tcp
source_address_prefix: 66.73.197.182/32
source_port_range: '*'
- access: Deny
description: ''
destination_address_prefix: '*'
destination_port_range: '8500'
direction: Inbound
name: DenyTcp8500Inbound
priority: '202'
protocol: Tcp
source_address_prefix: '*'
source_port_range: '*'
- access: Allow
description: ''
destination_address_prefix: '*'
destination_port_range: '22'
direction: Inbound
name: AllowTcp22InboundFromHomeNetwork
priority: '100'
protocol: Tcp
source_address_prefix: 66.73.197.182/32
source_port_range: '*'
- access: Allow
description: ''
destination_address_prefix: '*'
destination_port_range: '8500'
direction: Inbound
name: AllowTcpInboundLbProbe
priority: '201'
protocol: Tcp
source_address_prefix: 168.63.129.16/32
source_port_range: '*'
target: azurerm_virtual_machine.acctvm2
vm_size: Standard_B1s
test:
hosts:
Jumphost: {}
acctvm0: {}
acctvm1: {}
acctvm2: {}
vSphere
terraform_load_balancers:
hosts: {}
terraform_vms:
hosts:
docker-lb-01.lab.etsbv.internal:
ansible_groups: []
ansible_host: 10.0.102.163
data_type: vsphere_virtual_machine
id: Terraform Deployed/Docker/docker_lbs/docker-lb-01.lab.etsbv.internal
inventory_hostname: docker-lb-01.lab.etsbv.internal
mac_address: 00:50:56:aa:9c:b3
memory: '512'
network_label: VSS-VLAN-102
target: vsphere_virtual_machine.docker-lb-01.lab.etsbv.internal
uuid: 422a4adb-e7d3-ea74-a69a-3ff10c13063f
vcpu: '1'
docker-lb-02.lab.etsbv.internal:
ansible_groups: []
ansible_host: 10.0.102.160
data_type: vsphere_virtual_machine
id: Terraform Deployed/Docker/docker_lbs/docker-lb-02.lab.etsbv.internal
inventory_hostname: docker-lb-02.lab.etsbv.internal
mac_address: 00:50:56:aa:f8:25
memory: '512'
network_label: VSS-VLAN-102
target: vsphere_virtual_machine.docker-lb-02.lab.etsbv.internal
uuid: 422adcf8-347a-e9a5-e113-00114c1d2de9
vcpu: '1'
docker-mgr-01.lab.etsbv.internal:
ansible_groups: []
ansible_host: 10.0.102.171
data_type: vsphere_virtual_machine
id: Terraform Deployed/Docker/docker_swarm_managers/docker-mgr-01.lab.etsbv.internal
inventory_hostname: docker-mgr-01.lab.etsbv.internal
mac_address: 00:50:56:aa:a9:c0
memory: '1024'
network_label: VSS-VLAN-102
target: vsphere_virtual_machine.docker-mgr-01.lab.etsbv.internal
uuid: 422abe05-4483-88f8-34b7-e354fdc7a211
vcpu: '1'
docker-mgr-02.lab.etsbv.internal:
ansible_groups: []
ansible_host: 10.0.102.166
data_type: vsphere_virtual_machine
id: Terraform Deployed/Docker/docker_swarm_managers/docker-mgr-02.lab.etsbv.internal
inventory_hostname: docker-mgr-02.lab.etsbv.internal
mac_address: 00:50:56:aa:ba:a0
memory: '1024'
network_label: VSS-VLAN-102
target: vsphere_virtual_machine.docker-mgr-02.lab.etsbv.internal
uuid: 422a5d74-4de2-1df8-646b-ca62311f98ab
vcpu: '1'
docker-mgr-03.lab.etsbv.internal:
ansible_groups: []
ansible_host: 10.0.102.179
data_type: vsphere_virtual_machine
id: Terraform Deployed/Docker/docker_swarm_managers/docker-mgr-03.lab.etsbv.internal
inventory_hostname: docker-mgr-03.lab.etsbv.internal
mac_address: 00:50:56:aa:e3:06
memory: '1024'
network_label: VSS-VLAN-102
target: vsphere_virtual_machine.docker-mgr-03.lab.etsbv.internal
uuid: 422a8d34-68f7-a7be-9c6a-18949ce809ed
vcpu: '1'
docker-storage-01.lab.etsbv.internal:
ansible_groups: []
ansible_host: 10.0.102.162
data_type: vsphere_virtual_machine
id: Terraform Deployed/Docker/docker_storage/docker-storage-01.lab.etsbv.internal
inventory_hostname: docker-storage-01.lab.etsbv.internal
mac_address: 00:50:56:aa:5f:cb
memory: '512'
network_label: VSS-VLAN-102
target: vsphere_virtual_machine.docker-storage-01.lab.etsbv.internal
uuid: 422a264a-0816-60ff-475c-23af6c0b9d0e
vcpu: '1'
docker-storage-02.lab.etsbv.internal:
ansible_groups: []
ansible_host: 10.0.102.178
data_type: vsphere_virtual_machine
id: Terraform Deployed/Docker/docker_storage/docker-storage-02.lab.etsbv.internal
inventory_hostname: docker-storage-02.lab.etsbv.internal
mac_address: 00:50:56:aa:01:a0
memory: '512'
network_label: VSS-VLAN-102
target: vsphere_virtual_machine.docker-storage-02.lab.etsbv.internal
uuid: 422ad693-162f-1c32-b90c-eee1b0a73d2b
vcpu: '1'
docker-wrk-01.lab.etsbv.internal:
ansible_groups: []
ansible_host: 10.0.102.155
data_type: vsphere_virtual_machine
id: Terraform Deployed/Docker/docker_swarm_workers/docker-wrk-01.lab.etsbv.internal
inventory_hostname: docker-wrk-01.lab.etsbv.internal
mac_address: 00:50:56:aa:e4:93
memory: '4096'
network_label: VSS-VLAN-102
target: vsphere_virtual_machine.docker-wrk-01.lab.etsbv.internal
uuid: 422a87fe-baa2-75d6-e666-36c15f351269
vcpu: '1'
docker-wrk-02.lab.etsbv.internal:
ansible_groups: []
ansible_host: 10.0.102.201
data_type: vsphere_virtual_machine
id: Terraform Deployed/Docker/docker_swarm_workers/docker-wrk-02.lab.etsbv.internal
inventory_hostname: docker-wrk-02.lab.etsbv.internal
mac_address: 00:50:56:aa:e0:36
memory: '4096'
network_label: VSS-VLAN-102
target: vsphere_virtual_machine.docker-wrk-02.lab.etsbv.internal
uuid: 422a49e3-746c-b550-189c-0e0179c60418
vcpu: '1'
docker-wrk-03.lab.etsbv.internal:
ansible_groups: []
ansible_host: 10.0.102.207
data_type: vsphere_virtual_machine
id: Terraform Deployed/Docker/docker_swarm_workers/docker-wrk-03.lab.etsbv.internal
inventory_hostname: docker-wrk-03.lab.etsbv.internal
mac_address: 00:50:56:aa:6b:d5
memory: '4096'
network_label: VSS-VLAN-102
target: vsphere_virtual_machine.docker-wrk-03.lab.etsbv.internal
uuid: 422a809a-0cd2-cd84-756b-0822bc3f813a
vcpu: '1'
docker-wrk-04.lab.etsbv.internal:
ansible_groups: []
ansible_host: 10.0.102.183
data_type: vsphere_virtual_machine
id: Terraform Deployed/Docker/docker_swarm_workers/docker-wrk-04.lab.etsbv.internal
inventory_hostname: docker-wrk-04.lab.etsbv.internal
mac_address: 00:50:56:aa:b5:43
memory: '4096'
network_label: VSS-VLAN-102
target: vsphere_virtual_machine.docker-wrk-04.lab.etsbv.internal
uuid: 422aae57-67e8-50d8-66f6-3a11bdc87a78
vcpu: '1'
vsphere_virtual_machine:
hosts:
docker-lb-01.lab.etsbv.internal: {}
docker-lb-02.lab.etsbv.internal: {}
docker-mgr-01.lab.etsbv.internal: {}
docker-mgr-02.lab.etsbv.internal: {}
docker-mgr-03.lab.etsbv.internal: {}
docker-storage-01.lab.etsbv.internal: {}
docker-storage-02.lab.etsbv.internal: {}
docker-wrk-01.lab.etsbv.internal: {}
docker-wrk-02.lab.etsbv.internal: {}
docker-wrk-03.lab.etsbv.internal: {}
docker-wrk-04.lab.etsbv.internal: {}
Mixed
terraform_vms:
hosts:
Jumphost:
ansible_host: 10.0.2.6
data_type: azurerm_virtual_machine
location: eastus
private_ips:
- 10.0.2.6
public_ips:
- 40.117.254.203
resource_group_name: acctestrg
vm_size: Standard_B1s
acctvm0:
ansible_host: 10.0.2.6
data_type: azurerm_virtual_machine
location: eastus
private_ips:
- 10.0.2.6
public_ips: []
resource_group_name: acctestrg
vm_size: Standard_B1s
acctvm1:
ansible_host: 10.0.2.6
data_type: azurerm_virtual_machine
location: eastus
private_ips:
- 10.0.2.6
public_ips: []
resource_group_name: acctestrg
vm_size: Standard_B1s
acctvm2:
ansible_host: 10.0.2.6
data_type: azurerm_virtual_machine
location: eastus
private_ips:
- 10.0.2.6
public_ips: []
resource_group_name: acctestrg
vm_size: Standard_B1s
docker-lb-01.lab.etsbv.internal:
ansible_host: 10.0.102.163
data_type: vsphere_virtual_machine
mac_address: 00:50:56:aa:9c:b3
memory: 512
network_label: VSS-VLAN-102
uuid: 422a4adb-e7d3-ea74-a69a-3ff10c13063f
vcpu: 1
docker-lb-02.lab.etsbv.internal:
ansible_host: 10.0.102.160
data_type: vsphere_virtual_machine
mac_address: 00:50:56:aa:f8:25
memory: 512
network_label: VSS-VLAN-102
uuid: 422adcf8-347a-e9a5-e113-00114c1d2de9
vcpu: 1
docker-mgr-01.lab.etsbv.internal:
ansible_host: 10.0.102.171
data_type: vsphere_virtual_machine
mac_address: 00:50:56:aa:a9:c0
memory: 1024
network_label: VSS-VLAN-102
uuid: 422abe05-4483-88f8-34b7-e354fdc7a211
vcpu: 1
docker-mgr-02.lab.etsbv.internal:
ansible_host: 10.0.102.166
data_type: vsphere_virtual_machine
mac_address: 00:50:56:aa:ba:a0
memory: 1024
network_label: VSS-VLAN-102
uuid: 422a5d74-4de2-1df8-646b-ca62311f98ab
vcpu: 1
docker-mgr-03.lab.etsbv.internal:
ansible_host: 10.0.102.179
data_type: vsphere_virtual_machine
mac_address: 00:50:56:aa:e3:06
memory: 1024
network_label: VSS-VLAN-102
uuid: 422a8d34-68f7-a7be-9c6a-18949ce809ed
vcpu: 1
docker-storage-01.lab.etsbv.internal:
ansible_host: 10.0.102.162
data_type: vsphere_virtual_machine
mac_address: 00:50:56:aa:5f:cb
memory: 512
network_label: VSS-VLAN-102
uuid: 422a264a-0816-60ff-475c-23af6c0b9d0e
vcpu: 1
docker-storage-02.lab.etsbv.internal:
ansible_host: 10.0.102.178
data_type: vsphere_virtual_machine
mac_address: 00:50:56:aa:01:a0
memory: 512
network_label: VSS-VLAN-102
uuid: 422ad693-162f-1c32-b90c-eee1b0a73d2b
vcpu: 1
docker-wrk-01.lab.etsbv.internal:
ansible_host: 10.0.102.155
data_type: vsphere_virtual_machine
mac_address: 00:50:56:aa:e4:93
memory: 4096
network_label: VSS-VLAN-102
uuid: 422a87fe-baa2-75d6-e666-36c15f351269
vcpu: 1
docker-wrk-02.lab.etsbv.internal:
ansible_host: 10.0.102.201
data_type: vsphere_virtual_machine
mac_address: 00:50:56:aa:e0:36
memory: 4096
network_label: VSS-VLAN-102
uuid: 422a49e3-746c-b550-189c-0e0179c60418
vcpu: 1
docker-wrk-03.lab.etsbv.internal:
ansible_host: 10.0.102.207
data_type: vsphere_virtual_machine
mac_address: 00:50:56:aa:6b:d5
memory: 4096
network_label: VSS-VLAN-102
uuid: 422a809a-0cd2-cd84-756b-0822bc3f813a
vcpu: 1
docker-wrk-04.lab.etsbv.internal:
ansible_host: 10.0.102.183
data_type: vsphere_virtual_machine
mac_address: 00:50:56:aa:b5:43
memory: 4096
network_label: VSS-VLAN-102
uuid: 422aae57-67e8-50d8-66f6-3a11bdc87a78
vcpu: 1
vars:
terraform_load_balancers:
- location: eastus
name: TestLoadBalancer
public_ip_address: 40.76.73.163
sku: Basic
type: azurerm_lb
Azure Using Tags For Ansible Groups
cluster:
hosts:
acctvm0: {}
acctvm1: {}
acctvm2: {}
jumphosts:
hosts:
Jumphost: {}
terraform_vms:
hosts:
Jumphost:
ansible_host: 10.0.2.4
data_type: azurerm_virtual_machine
location: eastus
private_ips:
- 10.0.2.4
public_ips:
- 40.117.254.203
resource_group_name: acctestrg
vm_size: Standard_B1s
acctvm0:
ansible_host: 10.0.2.6
data_type: azurerm_virtual_machine
location: eastus
private_ips:
- 10.0.2.6
public_ips: []
resource_group_name: acctestrg
vm_size: Standard_B1s
acctvm1:
ansible_host: 10.0.2.7
data_type: azurerm_virtual_machine
location: eastus
private_ips:
- 10.0.2.7
public_ips: []
resource_group_name: acctestrg
vm_size: Standard_B1s
acctvm2:
ansible_host: 10.0.2.5
data_type: azurerm_virtual_machine
location: eastus
private_ips:
- 10.0.2.5
public_ips: []
resource_group_name: acctestrg
vm_size: Standard_B1s
vars:
terraform_load_balancers:
- location: eastus
name: TestLoadBalancer
public_ip_address: 40.76.73.163
sku: Basic
type: azurerm_lb
test:
hosts:
Jumphost: {}
acctvm0: {}
acctvm1: {}
acctvm2: {}
Groups Created By Data Types
You can also execute Ansible against a specific type by using these groups.
NOTE: Snippet below excludes all of the additional groups that are created to keep example clean.
aws_instance:
hosts:
ubuntu_zesty: {}
azurerm_virtual_machine:
hosts:
Jumphost: {}
acctvm0: {}
acctvm1: {}
acctvm2: {}
vsphere_virtual_machine:
hosts:
docker-lb-01.lab.etsbv.internal: {}
docker-lb-02.lab.etsbv.internal: {}
docker-mgr-01.lab.etsbv.internal: {}
docker-mgr-02.lab.etsbv.internal: {}
docker-mgr-03.lab.etsbv.internal: {}
docker-storage-01.lab.etsbv.internal: {}
docker-storage-02.lab.etsbv.internal: {}
docker-wrk-01.lab.etsbv.internal: {}
docker-wrk-02.lab.etsbv.internal: {}
docker-wrk-03.lab.etsbv.internal: {}
docker-wrk-04.lab.etsbv.internal: {}
Ansible Terraform Module Usage
When using the terraform Ansible module you have the ability to specify
target
which can be a single target or a list of targets. This is particularly
useful when your infrastructure is already provisioned and you would like to
destroy targets. We now add the actual Terraform target as a host variable named
target
as seen in the example below:
terraform_vms:
hosts:
acctvm0:
ansible_groups:
- test
- consul_cluster
ansible_host: 10.0.2.4
data_type: azurerm_virtual_machine
inventory_hostname: acctvm0
location: eastus
private_ips:
- 10.0.2.4
public_ips: []
resource_group_name: acctestrg
target: azurerm_virtual_machine.acctvm0
vm_size: Standard_B1s
acctvm1:
ansible_groups:
- test
- consul_cluster
ansible_host: 10.0.2.7
data_type: azurerm_virtual_machine
inventory_hostname: acctvm1
location: eastus
private_ips:
- 10.0.2.7
public_ips: []
resource_group_name: acctestrg
target: azurerm_virtual_machine.acctvm1
vm_size: Standard_B1s
Now if you would like to leverage the Terraform Ansible module to specifically target a resource we can do so as seen below:
playbook.yml
:
---
- hosts: localhost
gather_facts: false
become: false
vars:
scripts_dir: ../../scripts
terraform_destroy: false
terraform_destroy_vms: []
terraform_project_path: ../../Terraform
tasks:
- name: Execute Terraform (Provision)
terraform:
project_path: "{{ terraform_project_path }}"
state: present
register: _terraform_execution_provision
when: not terraform_destroy
- name: Execute Terraform (Destroy VMs Only)
terraform:
project_path: "{{ terraform_project_path }}"
state: absent
targets: "{{ terraform_destroy_vms | map('extract', hostvars, ['target']) | join(',') }}"
register: _terraform_execution_destroy
when: >
terraform_destroy_vms != [] and
terraform_destroy
Playbook execution:
First run in check mode to ensure your results are as expected.
ansible-playbook -i Ansible/inventory Ansible/playbooks/terraform.yml --extra-vars "{'terraform_destroy': true,'terraform_destroy_vms': ['acctvm0', 'acctvm1']}" --check
...
TASK [Terraform Results (Destroy VMs Only)] ****************************************************************************************************************************************************************************************************************************************************************************
ok: [localhost] => {
"_terraform_execution_destroy": {
"changed": false,
"command": "/usr/local/bin/terraform destroy -no-color -force -lock=true -target azurerm_virtual_machine.acctvm0 -target azurerm_virtual_machine.acctvm1",
"failed": false,
"outputs": {
},
"state": "absent",
"stderr": "",
"stderr_lines": [],
"stdout": "",
"stdout_lines": []
}
}
Now run normally after validating in check mode.
ansible-playbook -i Ansible/inventory Ansible/playbooks/terraform.yml --extra-vars "{'terraform_destroy': true,'terraform_destroy_vms': ['acctvm0', 'acctvm1']}"
If you would like to destroy all VMs in an Ansible group:
ansible-playbook -i Ansible/inventory Ansible/playbooks/terraform.yml --extra-vars "{'terraform_destroy': true,'terraform_destroy_vms': '{{ groups.consul_cluster }}'}" --check
License
MIT
Author Information
Larry Smith Jr.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file TerraformToAnsibleInventory-0.4.0.tar.gz
.
File metadata
- Download URL: TerraformToAnsibleInventory-0.4.0.tar.gz
- Upload date:
- Size: 22.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.19.1 setuptools/40.0.0 requests-toolbelt/0.8.0 tqdm/4.23.4 CPython/2.7.15
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d151e655979664a0e36e85e831df1acf2906295be03516e315c78093518de19b |
|
MD5 | 345553f94fa0526ab5bb49c10954b982 |
|
BLAKE2b-256 | ff6619cc351f7808fd965264a93f65c52af06be238aeb0f92153962d82b07e7e |
File details
Details for the file TerraformToAnsibleInventory-0.4.0-py2-none-any.whl
.
File metadata
- Download URL: TerraformToAnsibleInventory-0.4.0-py2-none-any.whl
- Upload date:
- Size: 21.5 kB
- Tags: Python 2
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.19.1 setuptools/40.0.0 requests-toolbelt/0.8.0 tqdm/4.23.4 CPython/2.7.15
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1aeeb4e536c8892c6fc1a9bae9b11e47b5d22a8b8e9541d163130d89a25b436f |
|
MD5 | 32ad2941b0ccf70419db320cdc6c3534 |
|
BLAKE2b-256 | 59579b83a092b4f89cec10f0f9cf6d5602a96798a5e8a2750afb8458d09ef20d |