Automation with Packer and TerraForm

14
Packer & TerraForm A brief intro in automation using Packer and TerraForm

Transcript of Automation with Packer and TerraForm

Page 1: Automation with Packer and TerraForm

Packer & TerraFormA brief intro in automation using Packer and

TerraForm

Page 2: Automation with Packer and TerraForm

Today’s challengesIncreasingly complex infrastructure to setup

• Multiple environments for testing and production

• Evolution / Changing of infrastructure

• Documentation of infrastructure

• More than one server involved

Page 3: Automation with Packer and TerraForm

Infrastructure as Code (IaC)Infrastructure as Code (IaC) is the process of managing and provisioning computing infrastructure (processes, bare-metal servers, virtual servers, etc.) and their configuration through machine-processable definition files

• Cost (reduction)

• Speed (faster execution)

• and Risk (remove errors and security violations)

Page 4: Automation with Packer and TerraForm

Introducing Packer and TerraFormPacker

Packer is a tool for creating machine and container images for multiple platforms from a single source configuration.

Treat server as immutable

Any configuration change results in a completely new server

Allows for easier tools then Chef or Puppet

JSON configuration language

TerraForm

Terraform provides a common configuration to launch infrastructure. Once launched, Terraform safely and efficiently changes infrastructure as the configuration is evolved

Describe infrastructure in a declarative way

Keep track of changes to the infrastructure

Changing infrastructure is accessible to entire team

Rollback your infrastructure to a previous point

HashiCorp Configuration Language (HCL)

Page 5: Automation with Packer and TerraForm

Why use Packer?Standardise development environments and machine images. Create near identical state infrastructure across multiple environments

Why use TerraForm?To orchestrate and create resources in your environments with ease and simplicity

Page 6: Automation with Packer and TerraForm

<plan> Objectives || Strategy || Design</plan>

Page 7: Automation with Packer and TerraForm

Packerhttps://www.packer.io/

Packer Concepts:Builders

Provisioners

Parallel Builds

Post Processors

Building Images

Page 8: Automation with Packer and TerraForm

Create a template: configuration file used to define what image we want built and how

NotesDefine the builders

Define provisioners

Define post-processors

Define variables (access keys etc)

<NB/>: Parallel Builds

Example

{ "builders": [], "description": "A packer example template", "min_packer_version": "0.8.0", "provisioners": [], "post-processors": [], "variables": []}

Page 9: Automation with Packer and TerraForm

BuildersAmazon EC2 (AMI)

DigitalOcean

Docker

Google Compute Engine

OpenStack

VirtualBox

<Commands/>:

packer buildpacker fixpacker inspectpacker validate

{ "variables": { "aws_access_key": "YOURACCESSKEY", "aws_secret_key": "YOURSECRETKEY", "do_api_token": "YOURAPITOKEN" }, "builders": [{ "type": "amazon-ebs", "access_key": "{{user `aws_access_key`}}", "secret_key": "{{user `aws_secret_key`}}", "region": "us-east-1", "source_ami": "ami-fce3c696", "instance_type": "t2.micro", "ssh_username": "ubuntu", "ami_name": "packer-example {{timestamp}}" },{ "type": "digitalocean", "api_token": "{{user `do_api_token`}}", "image": "ubuntu-14-04-x64", "region": "nyc3", "size": "512mb" }], "provisioners": [{ "type": "shell", "inline": [ "sleep 30", "sudo apt-get update", "sudo apt-get install -y redis-server" ] }]}

Page 10: Automation with Packer and TerraForm

TerraFormhttps://www.terraform.io/

TerraForm Key Features:Infrastructure as Code

Execution Plans

Resource Graph

Change Automation

Page 11: Automation with Packer and TerraForm

TerraForm: a tool for building, changing, and versioning infrastructure safely and efficiently.

Resources

Providers

terraform.tfstate: maps various resource metadata to actual resource IDs so that Terraform knows what it is managing

Input variables: variables.tf & terraform.tfvars

Output variables

Example: main.tf

provider "aws" { access_key = "ACCESS_KEY_HERE" secret_key = "SECRET_KEY_HERE" region = "us-east-1"}

resource "aws_instance" "example" { ami = "ami-0d729a60" #from packer build instance_type = "t2.micro"}

Page 12: Automation with Packer and TerraForm

Templatesmain.tf

variables.tf

terraform.tfvars

*.tpl (template resource)

<commands/>:

terraform validateterraform planterraform apply terraform destroy

# variables.tfvariable "web_count" { type = "string" description = "How many EC2 instances to deploy"}

# terraform.tfvarsweb_count = 2aws_route53_zone_id = "YOURZONEID"aws_access_key = "YOURACCESS"aws_secret_key = "YOURSECRETKEYXXXXXXXXXXXXXXX"

….# snippet from main.tfresource "template_file" "web_server_init" { count = "${var.web_count}" template = "${file("web_init.tpl")}" vars { hostname = "${lookup(var.web_hostnames, count.index)}" device_name = "/dev/xvdf" mount_point = "/srv/data" }}

#!/bin/bash -vsudo mkfs -t ext4 ${device_name}sudo mkdir ${mount_point}sudo echo "${device_name} ${mount_point} ext4 defaults,nofail 0 2" >> /etc/fstab

Page 13: Automation with Packer and TerraForm

Build StepsPlanning (Packer -> TerraForm)

Plan reqs: packer builders / provisionersPlan TerraForm resources/providers

Remote build (Packer)Packer inspect/fix/validatePacker build (store build artifact)-> update TF to use

this artifact/ami as a source

TerraForm Plan Terraform validate > graph > planStore plan output

TerraForm Apply Run terraform apply (or terraform destroy)Commit .tfstate to VCS or remote backend.

Page 14: Automation with Packer and TerraForm

Design Env Maintain

Packer and TerraForm

Packer build image TerraForm Apply

Store artifact

TerraForm update Add resourcesDestroy resourcesEtc