From 680e9bea9856935049defb2842cddf5010b5c4db Mon Sep 17 00:00:00 2001 From: Gianluca Arbezzano Date: Thu, 10 Sep 2020 16:02:49 +0200 Subject: [PATCH] New home for terraform setup (cp from tink repo) This is coming from the tink repo. Signed-off-by: Gianluca Arbezzano --- deploy/terraform/.gitignore | 4 + deploy/terraform/terraform/hardware_data.tpl | 32 ++++ deploy/terraform/terraform/install_package.sh | 66 ++++++++ deploy/terraform/terraform/main.tf | 141 ++++++++++++++++++ deploy/terraform/terraform/outputs.tf | 15 ++ deploy/terraform/terraform/variables.tf | 32 ++++ deploy/terraform/terraform/versions.tf | 3 + 7 files changed, 293 insertions(+) create mode 100644 deploy/terraform/.gitignore create mode 100644 deploy/terraform/terraform/hardware_data.tpl create mode 100644 deploy/terraform/terraform/install_package.sh create mode 100644 deploy/terraform/terraform/main.tf create mode 100644 deploy/terraform/terraform/outputs.tf create mode 100644 deploy/terraform/terraform/variables.tf create mode 100644 deploy/terraform/terraform/versions.tf diff --git a/deploy/terraform/.gitignore b/deploy/terraform/.gitignore new file mode 100644 index 0000000..e911d17 --- /dev/null +++ b/deploy/terraform/.gitignore @@ -0,0 +1,4 @@ +.terraform +terraform.tfstate +terraform.tfstate.backup +terraform.tfvars diff --git a/deploy/terraform/terraform/hardware_data.tpl b/deploy/terraform/terraform/hardware_data.tpl new file mode 100644 index 0000000..ce13c1d --- /dev/null +++ b/deploy/terraform/terraform/hardware_data.tpl @@ -0,0 +1,32 @@ +{ + "id": "${id}", + "metadata": { + "facility": { + "facility_code": "${facility_code}", + "plan_slug": "${plan_slug}", + "plan_version_slug": "" + }, + "instance": {}, + "state": "" + }, + "network": { + "interfaces": [ + { + "dhcp": { + "arch": "x86_64", + "ip": { + "address": "${address}", + "gateway": "192.168.1.1", + "netmask": "255.255.255.248" + }, + "mac": "${mac}", + "uefi": false + }, + "netboot": { + "allow_pxe": true, + "allow_workflow": true + } + } + ] + } +} diff --git a/deploy/terraform/terraform/install_package.sh b/deploy/terraform/terraform/install_package.sh new file mode 100644 index 0000000..95e86fd --- /dev/null +++ b/deploy/terraform/terraform/install_package.sh @@ -0,0 +1,66 @@ +#!/usr/bin/env bash + +YUM="yum" +APT="apt" +PIP3="pip3" +YUM_CONFIG_MGR="yum-config-manager" +WHICH_YUM=$(command -v $YUM) +WHICH_APT=$(command -v $APT) +YUM_INSTALL="$YUM install" +APT_INSTALL="$APT install" +PIP3_INSTALL="$PIP3 install" +declare -a YUM_LIST=("https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm" + "docker-ce" + "docker-ce-cli" + "epel-release" + "pass" + "python3") +declare -a APT_LIST=("docker" + "docker-compose" "pass") + +add_yum_repo() ( + $YUM_CONFIG_MGR --add-repo https://download.docker.com/linux/centos/docker-ce.repo +) + +update_yum() ( + $YUM_INSTALL -y yum-utils + add_yum_repo +) + +update_apt() ( + $APT update + DEBIAN_FRONTEND=noninteractive $APT --yes --force-yes -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" upgrade +) + +restart_docker_service() ( + service docker restart +) +install_yum_packages() ( + $YUM_INSTALL "${YUM_LIST[@]}" -y +) + +install_pip3_packages() ( + $PIP3_INSTALL docker-compose +) + +install_apt_packages() ( + $APT_INSTALL "${APT_LIST[@]}" -y +) + +main() ( + if [[ -n $WHICH_YUM ]]; then + update_yum + install_yum_packages + install_pip3_packages + restart_docker_service + elif [[ -n $WHICH_APT ]]; then + update_apt + install_apt_packages + restart_docker_service + else + echo "Unknown platform. Error while installing the required packages" + exit 1 + fi +) + +main diff --git a/deploy/terraform/terraform/main.tf b/deploy/terraform/terraform/main.tf new file mode 100644 index 0000000..9cd4f12 --- /dev/null +++ b/deploy/terraform/terraform/main.tf @@ -0,0 +1,141 @@ +# Configure the Packet Provider. +terraform { + required_providers { + packet = { + source = "packethost/packet" + version = "~> 3.0.1" + } + null = { + source = "hashicorp/null" + } + } +} + +provider "packet" { + auth_token = var.packet_api_token +} + +# Create a new VLAN in datacenter "ewr1" +resource "packet_vlan" "provisioning_vlan" { + description = "provisioning_vlan" + facility = var.facility + project_id = var.project_id +} + +# Create a device and add it to tf_project_1 +resource "packet_device" "tink_provisioner" { + hostname = "tink-provisioner" + plan = var.device_type + facilities = [var.facility] + operating_system = "ubuntu_18_04" + billing_cycle = "hourly" + project_id = var.project_id + user_data = file("install_package.sh") +} + +resource "null_resource" "tink_directory" { + connection { + type = "ssh" + user = var.ssh_user + host = packet_device.tink_provisioner.network[0].address + } + + provisioner "remote-exec" { + inline = [ + "mkdir -p /root/tink/deploy" + ] + } + + provisioner "file" { + source = "../../setup.sh" + destination = "/root/tink/setup.sh" + } + + provisioner "file" { + source = "../../generate-envrc.sh" + destination = "/root/tink/generate-envrc.sh" + } + + provisioner "file" { + source = "../../deploy" + destination = "/root/tink" + } + + provisioner "remote-exec" { + inline = [ + "chmod +x /root/tink/*.sh /root/tink/deploy/tls/*.sh" + ] + } +} + +resource "packet_device_network_type" "tink_provisioner_network_type" { + device_id = packet_device.tink_provisioner.id + type = "hybrid" +} + +# Create a device and add it to tf_project_1 +resource "packet_device" "tink_worker" { + count = var.worker_count + + hostname = "tink-worker-${count.index}" + plan = var.device_type + facilities = [var.facility] + operating_system = "custom_ipxe" + ipxe_script_url = "https://boot.netboot.xyz" + always_pxe = "true" + billing_cycle = "hourly" + project_id = var.project_id +} + +resource "packet_device_network_type" "tink_worker_network_type" { + count = var.worker_count + + device_id = packet_device.tink_worker[count.index].id + type = "layer2-individual" +} + +# Attach VLAN to provisioner +resource "packet_port_vlan_attachment" "provisioner" { + depends_on = [packet_device_network_type.tink_provisioner_network_type] + device_id = packet_device.tink_provisioner.id + port_name = "eth1" + vlan_vnid = packet_vlan.provisioning_vlan.vxlan +} + +# Attach VLAN to worker +resource "packet_port_vlan_attachment" "worker" { + count = var.worker_count + depends_on = [packet_device_network_type.tink_worker_network_type] + + device_id = packet_device.tink_worker[count.index].id + port_name = "eth0" + vlan_vnid = packet_vlan.provisioning_vlan.vxlan +} + +data "template_file" "worker_hardware_data" { + count = var.worker_count + template = file("${path.module}/hardware_data.tpl") + vars = { + id = packet_device.tink_worker[count.index].id + facility_code = packet_device.tink_worker[count.index].deployed_facility + plan_slug = packet_device.tink_worker[count.index].plan + address = "192.168.1.${count.index + 5}" + mac = packet_device.tink_worker[count.index].ports[1].mac + } +} + +resource "null_resource" "hardware_data" { + count = var.worker_count + depends_on = [null_resource.tink_directory] + + connection { + type = "ssh" + user = var.ssh_user + host = packet_device.tink_provisioner.network[0].address + } + + provisioner "file" { + content = data.template_file.worker_hardware_data[count.index].rendered + destination = "/root/tink/deploy/hardware-data-${count.index}.json" + } +} diff --git a/deploy/terraform/terraform/outputs.tf b/deploy/terraform/terraform/outputs.tf new file mode 100644 index 0000000..936b2ed --- /dev/null +++ b/deploy/terraform/terraform/outputs.tf @@ -0,0 +1,15 @@ +output "provisioner_dns_name" { + value = "${split("-", packet_device.tink_provisioner.id)[0]}.packethost.net" +} + +output "provisioner_ip" { + value = packet_device.tink_provisioner.network[0].address +} + +output "worker_mac_addr" { + value = formatlist("%s", packet_device.tink_worker[*].ports[1].mac) +} + +output "worker_sos" { + value = formatlist("%s@sos.%s.packet.net", packet_device.tink_worker[*].id, packet_device.tink_worker[*].deployed_facility) +} diff --git a/deploy/terraform/terraform/variables.tf b/deploy/terraform/terraform/variables.tf new file mode 100644 index 0000000..7b369ed --- /dev/null +++ b/deploy/terraform/terraform/variables.tf @@ -0,0 +1,32 @@ +variable "packet_api_token" { + description = "Packet user api token" + type = string +} + +variable "project_id" { + description = "Project ID" + type = string +} + +variable "worker_count" { + description = "Number of Workers" + type = number + default = 1 +} +variable "facility" { + description = "Packet facility to provision in" + type = string + default = "sjc1" +} + +variable "device_type" { + type = string + description = "Type of device to provision" + default = "c3.small.x86" +} + +variable "ssh_user" { + description = "Username that will be used to transfer file from your local environment to the provisioner" + type = string + default = "root" +} diff --git a/deploy/terraform/terraform/versions.tf b/deploy/terraform/terraform/versions.tf new file mode 100644 index 0000000..6b6318d --- /dev/null +++ b/deploy/terraform/terraform/versions.tf @@ -0,0 +1,3 @@ +terraform { + required_version = ">= 0.13" +}