├── prod.tfvars ├── .gitignore ├── README.md ├── modules └── k3s-cluster │ ├── scripts │ ├── kubeconfig.sh │ └── bootstrap.sh │ ├── variables.tf │ └── main.tf ├── variables.tf └── main.tf /prod.tfvars: -------------------------------------------------------------------------------- 1 | project_name = "mkdev" 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .terraform 2 | *.tfstate 3 | *.tfstate.backup 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Terraform Lightning Course 2 | 3 | Source code for Terraform Lightning Course: https://www.youtube.com/playlist?list=PLozcbFx8FoPHM7n2DGLa6G8ZwtWFsVZsP 4 | -------------------------------------------------------------------------------- /modules/k3s-cluster/scripts/kubeconfig.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | scp -o StrictHostKeyChecking=no root@$1:/etc/rancher/k3s/k3s.yaml ./ 4 | sed -i "s/127.0.0.1/$1/" k3s.yaml 5 | -------------------------------------------------------------------------------- /modules/k3s-cluster/scripts/bootstrap.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | yum install -y container-selinux selinux-policy-base 6 | rpm -i https://rpm.rancher.io/k3s-selinux-0.1.1-rc1.el7.noarch.rpm 7 | 8 | curl -sfL https://get.k3s.io | sh - 9 | -------------------------------------------------------------------------------- /variables.tf: -------------------------------------------------------------------------------- 1 | variable "auth_token" { 2 | type = string 3 | description = "Packet Cloud Auth Token" 4 | } 5 | 6 | variable "project_name" { 7 | type = string 8 | description = "Packet Project name for all resources" 9 | } 10 | -------------------------------------------------------------------------------- /modules/k3s-cluster/variables.tf: -------------------------------------------------------------------------------- 1 | variable "environment" { 2 | type = string 3 | default = "prod" 4 | description = "Environment the server belongs to" 5 | } 6 | 7 | variable "project_id" { 8 | type = string 9 | description = "Packet Project ID" 10 | } 11 | -------------------------------------------------------------------------------- /main.tf: -------------------------------------------------------------------------------- 1 | provider "packet" { 2 | auth_token = var.auth_token 3 | } 4 | 5 | data "packet_project" "mkdev" { 6 | name = var.project_name 7 | } 8 | 9 | module "production-cluster" { 10 | source = "./modules/k3s-cluster" 11 | environment = "prod" 12 | project_id = data.packet_project.mkdev.id 13 | } 14 | 15 | -------------------------------------------------------------------------------- /modules/k3s-cluster/main.tf: -------------------------------------------------------------------------------- 1 | data "terraform_remote_state" "globals" { 2 | backend = "s3" 3 | 4 | config = { 5 | bucket = "mkdev-terraform" 6 | region = "eu-central-1" 7 | key = "globals.tfstate" 8 | } 9 | } 10 | 11 | resource "packet_project_ssh_key" "mkdev" { 12 | name = "mkdev" 13 | public_key = file("/home/fodoj/.ssh/id_rsa.pub") 14 | project_id = var.project_id 15 | } 16 | 17 | resource "packet_device" "test" { 18 | hostname = "mkdev-${var.environment}.test" 19 | plan = "t1.small.x86" 20 | facilities = ["ams1"] 21 | operating_system = "centos_7" 22 | billing_cycle = "hourly" 23 | project_ssh_key_ids = [packet_project_ssh_key.mkdev.id] 24 | project_id = var.project_id 25 | 26 | provisioner "remote-exec" { 27 | script = "${path.module}/scripts/bootstrap.sh" 28 | 29 | connection { 30 | user = "root" 31 | host = "${self.access_public_ipv4}" 32 | } 33 | } 34 | 35 | provisioner "local-exec" { 36 | command = "${path.module}/scripts/kubeconfig.sh ${self.access_public_ipv4}" 37 | } 38 | } 39 | 40 | resource "aws_route53_record" "dns" { 41 | zone_id = data.terraform_remote_state.globals.outputs.zone_id 42 | name = "mkdev-${var.environment}.labs.mkdev.me" 43 | type = "A" 44 | ttl = "300" 45 | 46 | records = [packet_device.test.access_public_ipv4] 47 | } 48 | 49 | output "public_ip" { 50 | value = packet_device.test.access_public_ipv4 51 | } 52 | 53 | --------------------------------------------------------------------------------