Using Terraform.io 
Build & Change an Infrastructure with Terraform 
2014/09/09
`whoami` 
@sjourdan 
@greenalto
Vagrant?
Vagrant 
For development environments
Vagrant 
Mimic production environments
Vagrant 
!sharing 
!durability 
!evolution 
!services 
!production
Terraform
Terraform 
Infrastructure? 
servers, VMs (EC2, DigitalOcean…) 
services (Heroku, ELB, EIP…) 
DNS (DNSimple,…) 
email (Mailgun…)
Terraform
Terraform
Terraform 
APIs
Terraform
Terraform 
Launch infrastructure 
Change infrastructure
Terraform 
Simple file based configuration
5 days since CoreOS on DO
Terraform 
resource "digitalocean_droplet" "coreos-1" { 
}
Terraform 
resource "digitalocean_droplet" "coreos-1" { 
name = “coreos-1” 
}
Terraform 
resource "digitalocean_droplet" "coreos-1" { 
name = “coreos-1” 
size = "512mb" 
}
Terraform 
resource "digitalocean_droplet" "coreos-1" { 
name = “coreos-1” 
size = “512mb" 
image = "coreos-alpha" 
}
Terraform 
resource "digitalocean_droplet" "coreos-1" { 
name = “coreos-1” 
size = “512mb" 
image = “coreos-alpha" 
region = "nyc3" 
}
Terraform 
resource "digitalocean_droplet" "coreos-1" { 
name = “coreos-1” 
size = “512mb" 
image = “coreos-alpha" 
region = “nyc3" 
private_networking = true 
}
Terraform 
resource "digitalocean_droplet" "coreos-1" { 
name = “coreos-1” 
size = “512mb" 
image = “coreos-alpha" 
region = “nyc3" 
private_networking = true 
ssh_keys = [ "131228" ] 
}
Terraform 
$ terraform apply
Terraform 
$ terraform apply 
digitalocean_droplet.ht-coreos-1: Creating... 
image: "" => "coreos-alpha" 
name: "" => "ht-coreos-1" 
private_networking: "" => "true" 
region: "" => "nyc3" 
size: "" => "512mb" 
ssh_keys.#: "" => "1" 
ssh_keys.0: "" => "131228" 
digitalocean_droplet.ht-coreos-1: Creation complete 
! 
Apply complete! Resources: 1 added, 0 changed, 0 destroyed. 
! 
The state of your infrastructure has been saved to the path 
below. This state is required to modify and destroy your 
infrastructure, so keep it safe. To inspect the complete state 
use the `terraform show` command. 
! 
State path: terraform.tfstate
Terraform 
$ terraform show terraform.tfstate
Terraform 
$ terraform show terraform.tfstate 
digitalocean_droplet.ht-coreos-1: 
id = 2574081 
image = coreos-alpha 
ipv4_address = 104.131.47.30 
ipv4_address_private = 10.132.241.137 
locked = false 
name = ht-coreos-1 
private_networking = true 
region = nyc3 
size = 512mb 
ssh_keys.# = 1 
ssh_keys.0 = 131228 
status = active
Terraform
Terraform 
Scale? Handle Change?
Terraform
Terraform 
$ terraform plan
Terraform 
$ terraform plan -out=terraform.plan 
! 
+ digitalocean_droplet.ht-coreos-2 
! 
[…] 
! 
+ digitalocean_droplet.ht-coreos-3 
[…]
Terraform 
$ terraform apply 
digitalocean_droplet.ht-coreos-1: Refreshing 
state... (ID: 2574081) 
digitalocean_droplet.ht-coreos-2: Creating... 
[…] 
digitalocean_droplet.ht-coreos-3: Creating... 
[…] 
digitalocean_droplet.ht-coreos-3: Creation complete 
digitalocean_droplet.ht-coreos-2: Creation complete 
! 
Apply complete! Resources: 2 added, 0 changed, 0 
destroyed.
Terraform
Terraform 
Downscale ?
Terraform 
$ terraform plan -out=terraform.plan 
! 
[…] 
- digitalocean_droplet.ht-coreos-1
Terraform 
$ terraform apply 
digitalocean_droplet.ht-coreos-1: Refreshing 
state... (ID: 2574081) 
digitalocean_droplet.ht-coreos-3: Refreshing 
state... (ID: 2574214) 
digitalocean_droplet.ht-coreos-2: Refreshing 
state... (ID: 2574215) 
digitalocean_droplet.ht-coreos-1: Destroying... 
digitalocean_droplet.ht-coreos-1: Destruction 
complete 
! 
Apply complete! Resources: 0 added, 0 changed, 1 
destroyed.
Terraform
Terraform
Terraform 
terraform.tfstate 
=> git pull your infrastructure state!
Terraform
Terraform
Terraform 
Provisionners 
echo, cat or grep 
myapp.conf 
Chef, Puppet, Ansible, whatever
Terraform 
provisioner "remote-exec" { 
inline = [ 
"curl -L https://www.opscode.com/chef/ 
install.sh | sudo bash", 
"sudo chef-solo -j chef/node.json" 
] 
}
Terraform 
resource "dnsimple_record" “cluster-1" { 
domain = “humantalks.com" 
name = "cluster-1" 
value = “${digitalocean_droplet.web.ipv4_address}" 
type = "A" 
}
Terraform 
autoscaling_group 
db_instance 
security_group 
eip 
elb 
instance 
route53 
s3 
…
Terraform (Sept. 2014)
Terraform 
2014/07/28: 0.1.0 
2014/08/28: 0.2.0
Terraform 
https://github.com/hashicorp/terraform/ 
http://www.terraform.io/
Q&A 
Questions ?

Using Terraform.io (Human Talks Montpellier, Epitech, 2014/09/09)