From 90e493ff9fe1103f6d987324ec52f539245c42a8 Mon Sep 17 00:00:00 2001 From: Edward Viaene Date: Mon, 17 Oct 2016 12:42:10 +0000 Subject: [PATCH] terraform packer demo --- packer-demo/build-and-launch.sh | 4 ++ packer-demo/instance.tf | 13 ++++ packer-demo/key.tf | 4 ++ packer-demo/packer-example.json | 22 +++++++ packer-demo/provider.tf | 3 + packer-demo/securitygroup.tf | 22 +++++++ packer-demo/vars.tf | 9 +++ packer-demo/vpc.tf | 110 ++++++++++++++++++++++++++++++++ 8 files changed, 187 insertions(+) create mode 100644 packer-demo/build-and-launch.sh create mode 100644 packer-demo/instance.tf create mode 100644 packer-demo/key.tf create mode 100644 packer-demo/packer-example.json create mode 100644 packer-demo/provider.tf create mode 100644 packer-demo/securitygroup.tf create mode 100644 packer-demo/vars.tf create mode 100644 packer-demo/vpc.tf diff --git a/packer-demo/build-and-launch.sh b/packer-demo/build-and-launch.sh new file mode 100644 index 0000000..46b71b0 --- /dev/null +++ b/packer-demo/build-and-launch.sh @@ -0,0 +1,4 @@ +#!/bin/bash +AMI_ID=`packer build -machine-readable packer.json | awk -F, '$0 ~/artifact,0,id/ {print $6}'` +echo 'variable "AMI_ID" { default = "'${AMI_ID}'" }' > amivar.tf +terraform apply diff --git a/packer-demo/instance.tf b/packer-demo/instance.tf new file mode 100644 index 0000000..76dc9da --- /dev/null +++ b/packer-demo/instance.tf @@ -0,0 +1,13 @@ +resource "aws_instance" "example" { + ami = "${var.AMI_ID}" + instance_type = "t2.micro" + + # the VPC subnet + subnet_id = "${aws_subnet.main-public-1.id}" + + # the security group + vpc_security_group_ids = ["${aws_security_group.example-instance.id}"] + + # the public SSH key + key_name = "${aws_key_pair.mykeypair.key_name}" +} diff --git a/packer-demo/key.tf b/packer-demo/key.tf new file mode 100644 index 0000000..0d3c220 --- /dev/null +++ b/packer-demo/key.tf @@ -0,0 +1,4 @@ +resource "aws_key_pair" "mykeypair" { + key_name = "mykeypair" + public_key = "${file("${var.PATH_TO_PUBLIC_KEY}")}" +} diff --git a/packer-demo/packer-example.json b/packer-demo/packer-example.json new file mode 100644 index 0000000..b7e2acb --- /dev/null +++ b/packer-demo/packer-example.json @@ -0,0 +1,22 @@ +{ + "variables": { + "aws_access_key": "", + "aws_secret_key": "" + }, + "builders": [{ + "type": "amazon-ebs", + "access_key": "{{user `aws_access_key`}}", + "secret_key": "{{user `aws_secret_key`}}", + "region": "eu-west-1", + "source_ami": "ami-844e0bf7", + "instance_type": "t2.micro", + "ssh_username": "ubuntu", + "ami_name": "packer-example {{timestamp}}" + }], + "provisioners": [{ + "type": "shell", + "scripts": [ "scripts/install_software.sh" ], + "execute_command": "{{ .Vars }} sudo -E sh '{{ .Path }}'", + "pause_before": "10s" + }] +} diff --git a/packer-demo/provider.tf b/packer-demo/provider.tf new file mode 100644 index 0000000..ded6d8c --- /dev/null +++ b/packer-demo/provider.tf @@ -0,0 +1,3 @@ +provider "aws" { + region = "${var.AWS_REGION}" +} diff --git a/packer-demo/securitygroup.tf b/packer-demo/securitygroup.tf new file mode 100644 index 0000000..b796e18 --- /dev/null +++ b/packer-demo/securitygroup.tf @@ -0,0 +1,22 @@ +resource "aws_security_group" "example-instance" { + vpc_id = "${aws_vpc.main.id}" + name = "allow-ssh" + description = "security group that allows ssh and all egress traffic" + egress { + from_port = 0 + to_port = 0 + protocol = "-1" + cidr_blocks = ["0.0.0.0/0"] + } + + ingress { + from_port = 22 + to_port = 22 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + } +tags { + Name = "example-instance" + } +} + diff --git a/packer-demo/vars.tf b/packer-demo/vars.tf new file mode 100644 index 0000000..ce2e56b --- /dev/null +++ b/packer-demo/vars.tf @@ -0,0 +1,9 @@ +variable "AWS_REGION" { + default = "eu-west-1" +} +variable "PATH_TO_PRIVATE_KEY" { + default = "mykey" +} +variable "PATH_TO_PUBLIC_KEY" { + default = "mykey.pub" +} diff --git a/packer-demo/vpc.tf b/packer-demo/vpc.tf new file mode 100644 index 0000000..1325feb --- /dev/null +++ b/packer-demo/vpc.tf @@ -0,0 +1,110 @@ +# Internet VPC +resource "aws_vpc" "main" { + cidr_block = "10.0.0.0/16" + instance_tenancy = "default" + enable_dns_support = "true" + enable_dns_hostnames = "true" + enable_classiclink = "false" + tags { + Name = "main" + } +} + + +# Subnets +resource "aws_subnet" "main-public-1" { + vpc_id = "${aws_vpc.main.id}" + cidr_block = "10.0.1.0/24" + map_public_ip_on_launch = "true" + availability_zone = "eu-west-1a" + + tags { + Name = "main-public-1" + } +} +resource "aws_subnet" "main-public-2" { + vpc_id = "${aws_vpc.main.id}" + cidr_block = "10.0.2.0/24" + map_public_ip_on_launch = "true" + availability_zone = "eu-west-1b" + + tags { + Name = "main-public-2" + } +} +resource "aws_subnet" "main-public-3" { + vpc_id = "${aws_vpc.main.id}" + cidr_block = "10.0.3.0/24" + map_public_ip_on_launch = "true" + availability_zone = "eu-west-1c" + + tags { + Name = "main-public-3" + } +} +resource "aws_subnet" "main-private-1" { + vpc_id = "${aws_vpc.main.id}" + cidr_block = "10.0.4.0/24" + map_public_ip_on_launch = "false" + availability_zone = "eu-west-1a" + + tags { + Name = "main-private-1" + } +} +resource "aws_subnet" "main-private-2" { + vpc_id = "${aws_vpc.main.id}" + cidr_block = "10.0.5.0/24" + map_public_ip_on_launch = "false" + availability_zone = "eu-west-1b" + + tags { + Name = "main-private-2" + } +} +resource "aws_subnet" "main-private-3" { + vpc_id = "${aws_vpc.main.id}" + cidr_block = "10.0.6.0/24" + map_public_ip_on_launch = "false" + availability_zone = "eu-west-1c" + + tags { + Name = "main-private-3" + } +} + +# Internet GW +resource "aws_internet_gateway" "main-gw" { + vpc_id = "${aws_vpc.main.id}" + + tags { + Name = "main" + } +} + +# route tables +resource "aws_route_table" "main-public" { + vpc_id = "${aws_vpc.main.id}" + route { + cidr_block = "0.0.0.0/0" + gateway_id = "${aws_internet_gateway.main-gw.id}" + } + + tags { + Name = "main-public-1" + } +} + +# route associations public +resource "aws_route_table_association" "main-public-1-a" { + subnet_id = "${aws_subnet.main-public-1.id}" + route_table_id = "${aws_route_table.main-public.id}" +} +resource "aws_route_table_association" "main-public-2-a" { + subnet_id = "${aws_subnet.main-public-2.id}" + route_table_id = "${aws_route_table.main-public.id}" +} +resource "aws_route_table_association" "main-public-3-a" { + subnet_id = "${aws_subnet.main-public-3.id}" + route_table_id = "${aws_route_table.main-public.id}" +}