Terraform:

Infraestructura como código

bit.ly/pablokbs-1

Pablo Fredrikson

@pablokbs

  • Devops Leader @ invisionapp
  • Nerd
  • 10 años con Linux

En la prehistoria...

En la prehistoria...

Y encima...

Ah, y también

Recapitulemos

  • Código para los servicios
  • Código para aprovisionar servidores (chef, puppet)
  • Código para generar los trabajos para Jenkins (Job DSL)
  • Servidores (+DNS, +ELBs, etc) a mano

¿Qué necesitamos?

  • Poder tener una lista de nuestra infraestructura completa (conteniendo servers y recursos externos como DNS, CDN, S3, SQS, etc)
  • Manejar infraestructura de forma simple y rápida
  • Manejar el ciclo de vida de los recursos
  • Portabilidad entre proveedores (Google, Digital Ocean, AWS, DNSimple, CloudFare)
  • Que sea seguro
  • OpenSource
resource "digitalocean_droplet" "web" {
  name = "tf-web"
  size = "512mb"
  image = "centos-5-8-x32"
  region = "sfo1"
}

resource "dnsimple_record" "hello" {
  domain = "example.com"
  name = "test"
  value = "${digitalocean_droplet.web.ipv4_address}"
  type = "A"
}

Terraform

$ terraform plan

¿Cómo se usa?

$ terraform apply
+ digitalocean_droplet.web
    backups:              "" => "<computed>"
    image:                "" => "centos-5-8-x32"
    ipv4_address:         "" => "<computed>"
    ipv4_address_private: "" => "<computed>"
    name:                 "" => "tf-web"
    private_networking    "" => "<computed>"
    region:               "" => "sfo1"
    size:                 "" => "512mb"
    status                "" => "<computed>"

+ dnsimple_record.hello
    domain:    "" => "example.com"
    domain_id: "" => "<computed>"
    hostname:  "" => "<computed>"
    name:      "" => "test"
    priority:  "" => "<computed>"
    ttl:       "" => "<computed>"
    type:      "" => "A"
    value:     "" => "${digitalocean_droplet.web.ipv4_address}"

Terraform

Siempre usar plan

$ terraform apply
...
Apply complete! Resources: 0 added, 0 changed, 180 destroyed.

TERRORFORM

Plugins y proveedores

terraform modules

module "consul" {
  source = "github.com/hashicorp/consul/terraform/aws"
  servers = 5
  version = "0.4.0"
}

resource "dnsimple_record" "consul" {
  domain = "example.com"
  name = "consul"
  value = "${module.consul.ip_address}"
  type = "A"
}

Demo - Q&A

Terraform

By Pablo Fredrikson

Terraform

Charla para nerdear.la 2016

  • 1,045