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

Preview:

DESCRIPTION

How to build an infrastructure & handle change with Hashicorp's Terraform. The talk was "distributed teams" oriented.

Citation preview

Using Terraform.ioBuild & 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"

}

Terraformresource "digitalocean_droplet" "coreos-1" {

name = “coreos-1”

size = “512mb"

image = “coreos-alpha"

region = “nyc3"

private_networking = true

}

Terraformresource "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 ?

Recommended