Slide 1

Slide 1 text

TERRAFORM Build,  Combine,  and  Launch  Infrastructure

Slide 2

Slide 2 text

SETH VARGO @sethvargo

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

MOTIVATION Why  Terraform?

Slide 6

Slide 6 text

How  do  I  provision  resources?              compute?              storage?              network?

Slide 7

Slide 7 text

How  do  I  manage  resource  lifecycles?

Slide 8

Slide 8 text

How  do  I  balance  service  providers   providing  core  technology  for  my   datacenter?

Slide 9

Slide 9 text

How  do  I  enforce  policy  across  all   these  resources?

Slide 10

Slide 10 text

How  do  I  automate  and  share  those   configuraCons?

Slide 11

Slide 11 text

RISING DATACENTER COMPLEXITY

Slide 12

Slide 12 text

RISING DATACENTER COMPLEXITY DC

Slide 13

Slide 13 text

RISING DATACENTER COMPLEXITY DC

Slide 14

Slide 14 text

RISING DATACENTER COMPLEXITY DC VM VM VM VM VM VM VM VM VM VM VM VM VM VM VM VM

Slide 15

Slide 15 text

RISING DATACENTER COMPLEXITY DC VM VM VM VM VM VM VM VM VM VM VM VM VM VM VM VM C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C

Slide 16

Slide 16 text

RISING DATACENTER COMPLEXITY DC DNS Database CDN

Slide 17

Slide 17 text

RISING DATACENTER COMPLEXITY DC-01 DC-02

Slide 18

Slide 18 text

RISING DATACENTER COMPLEXITY DC-01 DC-02 VM VM VM VM VM VM VM VM C C C C C C C C C C C C C C C C C C C C C C C C

Slide 19

Slide 19 text

RISING DATACENTER COMPLEXITY IaaS,  PaaS,  SaaS

Slide 20

Slide 20 text

RISING DATACENTER COMPLEXITY All logos and trademarks are copyright their respective owners

Slide 21

Slide 21 text

WHY? What  was  our  original  goal?

Slide 22

Slide 22 text

EFFECTIVELY  DELIVER AND  MAINTAIN   APPLICATIONS

Slide 23

Slide 23 text

h-ps:/ / d250n10lsq5j8r.cloudfront.n et/assets/atlas/runAme-­‐ develop-­‐icon-­‐color-­‐ ebf4ccf5f2ca3513e495bccb e9320d45.png Consistent Shareable Readily Available High production 
 parity h-ps:/ / d250n10lsq5j8r.cloudfront.n et/assets/atlas/runAme-­‐ deploy-­‐icon-­‐ color-­‐1c39f618b3b5ead204 dda4646bb2410e.png Start and configure servers / services Deploy and run application Update servers or applications Reconfigure, feature flag Monitor health Orchestrate complex changes DEVELOP DEPLOY MAINTAIN

Slide 24

Slide 24 text

h-ps:/ / d250n10lsq5j8r.cloudfront.n et/assets/atlas/runAme-­‐ develop-­‐icon-­‐color-­‐ ebf4ccf5f2ca3513e495bccb e9320d45.png h-ps:/ / d250n10lsq5j8r.cloudfront.n et/assets/atlas/runAme-­‐ deploy-­‐icon-­‐ color-­‐1c39f618b3b5ead204 dda4646bb2410e.png DEVELOP DEPLOY MAINTAIN

Slide 25

Slide 25 text

TERRAFORM'S  GOAL

Slide 26

Slide 26 text

PROVIDE A SINGLE WORKFLOW

Slide 27

Slide 27 text

WITH A UNIFIED VIEW

Slide 28

Slide 28 text

USING INFRASTRUCTURE AS CODE

Slide 29

Slide 29 text

THAT CAN BE ITERATED AND CHANGED SAFELY

Slide 30

Slide 30 text

CAPABLE OF COMPLEX N-TIER APPLICATIONS

Slide 31

Slide 31 text

DIGITAL OCEAN DROPLET WITH DNS USING DNS SIMPLE 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" }

Slide 32

Slide 32 text

DIGITAL OCEAN DROPLET WITH DNS USING DNS SIMPLE 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" }

Slide 33

Slide 33 text

DIGITAL OCEAN DROPLET WITH DNS USING DNS SIMPLE 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" }

Slide 34

Slide 34 text

DIGITAL OCEAN DROPLET WITH DNS USING DNS SIMPLE 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" }

Slide 35

Slide 35 text

HUMAN-FRIENDLY CONFIG* * JSON-COMPATIBLE FOR NON-HUMANS

Slide 36

Slide 36 text

VCS-FRIENDLY FORMAT

Slide 37

Slide 37 text

ENTIRE INFRASTRUCTURE... IN A SINGLE TEXT FILE

Slide 38

Slide 38 text

TERRAFORM  GRAPH

Slide 39

Slide 39 text

COMPOSE N-TIERS / PROVIDERS

Slide 40

Slide 40 text

TERRAFORM  PROVIDERS

Slide 41

Slide 41 text

SINGLE INTEGRATION POINT

Slide 42

Slide 42 text

EXPOSE ("PROVIDE") A RESOURCE

Slide 43

Slide 43 text

EXPOSE ("PROVIDE") A RESOURCE aws_instance dnssimple_record

Slide 44

Slide 44 text

CRUD API

Slide 45

Slide 45 text

PLUGGABLE FOR INTEGRATIONS

Slide 46

Slide 46 text

C C C C C C VM VM VM IAAS (OpenStack, etc) PHYSICAL "LAYER CAKE" PROVIDER PER LAYER UNIFIED CONFIGURATION

Slide 47

Slide 47 text

$ terraform apply

Slide 48

Slide 48 text

All logos and trademarks are copyright their respective owners

Slide 49

Slide 49 text

TERRAFORM  PLAN

Slide 50

Slide 50 text

$ terraform plan + digitalocean_droplet.web backups: "" => "" image: "" => "centos-5-8-x32" ipv4_address: "" => "" ipv4_address_private: "" => "" name: "" => "tf-web" private_networking: "" => "" region: "" => "sfo1" size: "" => "512mb" status: "" => "" + dnsimple_record.hello domain: "" => "example.com" domain_id: "" => "" hostname: "" => "" name: "" => "test" priority: "" => ""

Slide 51

Slide 51 text

$ terraform plan + digitalocean_droplet.web backups: "" => "" image: "" => "centos-5-8-x32" ipv4_address: "" => "" ipv4_address_private: "" => "" name: "" => "tf-web" private_networking: "" => "" region: "" => "sfo1" size: "" => "512mb" status: "" => "" + dnsimple_record.hello domain: "" => "example.com" domain_id: "" => "" hostname: "" => "" name: "" => "test" priority: "" => ""

Slide 52

Slide 52 text

$ terraform plan + digitalocean_droplet.web backups: "" => "" image: "" => "centos-5-8-x32" ipv4_address: "" => "" ipv4_address_private: "" => "" name: "" => "tf-web" private_networking: "" => "" region: "" => "sfo1" size: "" => "512mb" status: "" => "" + dnsimple_record.hello domain: "" => "example.com" domain_id: "" => "" hostname: "" => "" name: "" => "test" priority: "" => ""

Slide 53

Slide 53 text

$ terraform plan + digitalocean_droplet.web backups: "" => "" image: "" => "centos-5-8-x32" ipv4_address: "" => "" ipv4_address_private: "" => "" name: "" => "tf-web" private_networking: "" => "" region: "" => "sfo1" size: "" => "512mb" status: "" => "" + dnsimple_record.hello domain: "" => "example.com" domain_id: "" => "" hostname: "" => "" name: "" => "test" priority: "" => ""

Slide 54

Slide 54 text

backups: "" => "" image: "" => "centos-5-8-x32" ipv4_address: "" => "" ipv4_address_private: "" => "" name: "" => "tf-web" private_networking: "" => "" region: "" => "sfo1" size: "" => "512mb" status: "" => "" + dnsimple_record.hello domain: "" => "example.com" domain_id: "" => "" hostname: "" => "" name: "" => "test" priority: "" => "" ttl: "" => "" type: "" => "A" value: "" => "${digitalocean_droplet.web.ipv4_address}"

Slide 55

Slide 55 text

backups: "" => "" image: "" => "centos-5-8-x32" ipv4_address: "" => "" ipv4_address_private: "" => "" name: "" => "tf-web" private_networking: "" => "" region: "" => "sfo1" size: "" => "512mb" status: "" => "" + dnsimple_record.hello domain: "" => "example.com" domain_id: "" => "" hostname: "" => "" name: "" => "test" priority: "" => "" ttl: "" => "" type: "" => "A" value: "" => "${digitalocean_droplet.web.ipv4_address}"

Slide 56

Slide 56 text

SHOWS YOU WHAT WILL HAPPEN

Slide 57

Slide 57 text

EXPLAINS CERTAIN ACTIONS

Slide 58

Slide 58 text

PREVIOUSLY?

Slide 59

Slide 59 text

DEV OPS

Slide 60

Slide 60 text

DEV OPS ^ versus

Slide 61

Slide 61 text

DEVELOPERS OPERATORS Define core infrastructure Security Scalability Deploy applications Production parity

Slide 62

Slide 62 text

DEVELOPERS OPERATORS Modify Terraform configs Treat Terraform configs as a black box

Slide 63

Slide 63 text

DEVELOPERS OPERATORS Self-server Self-servee

Slide 64

Slide 64 text

C C C C C C VM VM VM IAAS (OpenStack, etc) PHYSICAL DECOMPOSE DELEGATE DEPLOY DEV OPS

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

TERRAFORM MODULE 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" }

Slide 67

Slide 67 text

ABSTRACT COMPONENTS

Slide 68

Slide 68 text

HIGHER-LEVEL REASONING

Slide 69

Slide 69 text

RE-USABLE

Slide 70

Slide 70 text

MAINTENANCE DELEGATION

Slide 71

Slide 71 text

SETH VARGO @sethvargo QUESTIONS?