diff --git a/jenkins-packer-demo/cloudinit.tf b/jenkins-packer-demo/cloudinit.tf new file mode 100644 index 0000000..2de0ab7 --- /dev/null +++ b/jenkins-packer-demo/cloudinit.tf @@ -0,0 +1,20 @@ +provider "cloudinit" {} + +data "template_file" "jenkins-init" { + template = "${file("scripts/jenkins-init.sh")}" + vars { + DEVICE = "${var.INSTANCE_DEVICE_NAME}" + JENKINS_VERSION = "${var.JENKINS_VERSION}" + } +} +data "template_cloudinit_config" "cloudinit-jenkins" { + + gzip = false + base64_encode = false + + part { + content_type = "text/x-shellscript" + content = "${data.template_file.jenkins-init.rendered}" + } + +} diff --git a/jenkins-packer-demo/instance.tf b/jenkins-packer-demo/instance.tf new file mode 100644 index 0000000..f8d7a2e --- /dev/null +++ b/jenkins-packer-demo/instance.tf @@ -0,0 +1,33 @@ +resource "aws_instance" "jenkins-instance" { + ami = "${lookup(var.AMIS, var.AWS_REGION)}" + instance_type = "t2.small" + + # the VPC subnet + subnet_id = "${aws_subnet.main-public-1.id}" + + # the security group + vpc_security_group_ids = ["${aws_security_group.jenkins-securitygroup.id}"] + + # the public SSH key + key_name = "${aws_key_pair.mykeypair.key_name}" + + # user data + user_data = "${data.template_cloudinit_config.cloudinit-jenkins.rendered}" + +} + +resource "aws_ebs_volume" "jenkins-data" { + availability_zone = "eu-west-1a" + size = 20 + type = "gp2" + tags { + Name = "jenkins-data" + } +} + +resource "aws_volume_attachment" "jenkins-data-attachment" { + device_name = "${var.INSTANCE_DEVICE_NAME}" + volume_id = "${aws_ebs_volume.jenkins-data.id}" + instance_id = "${aws_instance.jenkins-instance.id}" +} + diff --git a/jenkins-packer-demo/key.tf b/jenkins-packer-demo/key.tf new file mode 100644 index 0000000..0d3c220 --- /dev/null +++ b/jenkins-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/jenkins-packer-demo/provider.tf b/jenkins-packer-demo/provider.tf new file mode 100644 index 0000000..ded6d8c --- /dev/null +++ b/jenkins-packer-demo/provider.tf @@ -0,0 +1,3 @@ +provider "aws" { + region = "${var.AWS_REGION}" +} diff --git a/jenkins-packer-demo/scripts/install_software.sh b/jenkins-packer-demo/scripts/install_software.sh new file mode 100644 index 0000000..41537ff --- /dev/null +++ b/jenkins-packer-demo/scripts/install_software.sh @@ -0,0 +1,3 @@ +#!/bin/bash +apt-get update +apt-get install -y nginx docker.io vim lvm2 diff --git a/jenkins-packer-demo/scripts/jenkins-init.sh b/jenkins-packer-demo/scripts/jenkins-init.sh new file mode 100644 index 0000000..913895f --- /dev/null +++ b/jenkins-packer-demo/scripts/jenkins-init.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +vgchange -ay + +DEVICE_FS=`blkid -o value -s TYPE ${DEVICE}` +if [ "`echo -n $DEVICE_FS`" == "" ] ; then + pvcreate ${DEVICE} + vgcreate data ${DEVICE} + lvcreate --name volume1 -l 100%FREE data + mkfs.ext4 /dev/data/volume1 +fi +mkdir -p /data +echo '/dev/data/volume1 /data ext4 defaults 0 0' >> /etc/fstab +mount /data + +cd /tmp +wget http://pkg.jenkins-ci.org/debian-stable/binary/${JENKINS_VERSION} +dpkg -i ${JENKINS_VERSION} +rm ${JENKINS_VERSION} diff --git a/jenkins-packer-demo/securitygroup.tf b/jenkins-packer-demo/securitygroup.tf new file mode 100644 index 0000000..9c990bd --- /dev/null +++ b/jenkins-packer-demo/securitygroup.tf @@ -0,0 +1,21 @@ +resource "aws_security_group" "jenkins-securitygroup" { + 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 = "jenkins-securitygroup" + } +} diff --git a/jenkins-packer-demo/vars.tf b/jenkins-packer-demo/vars.tf new file mode 100644 index 0000000..7901e50 --- /dev/null +++ b/jenkins-packer-demo/vars.tf @@ -0,0 +1,23 @@ +variable "AWS_REGION" { + default = "eu-west-1" +} +variable "PATH_TO_PRIVATE_KEY" { + default = "mykey" +} +variable "PATH_TO_PUBLIC_KEY" { + default = "mykey.pub" +} +variable "AMIS" { + type = "map" + default = { + us-east-1 = "ami-13be557e" + us-west-2 = "ami-06b94666" + eu-west-1 = "ami-844e0bf7" + } +} +variable "INSTANCE_DEVICE_NAME" { + default = "/dev/xvdh" +} +variable "JENKINS_VERSION" { + default = "jenkins_2.7.4_all.deb" +} diff --git a/jenkins-packer-demo/vpc.tf b/jenkins-packer-demo/vpc.tf new file mode 100644 index 0000000..1325feb --- /dev/null +++ b/jenkins-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}" +}