View
789
Download
4
Category
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