microk8s+terraform
[iec.git] / src / foundation / microk8s / main.tf
diff --git a/src/foundation/microk8s/main.tf b/src/foundation/microk8s/main.tf
new file mode 100644 (file)
index 0000000..ea33da5
--- /dev/null
@@ -0,0 +1,128 @@
+provider "aws" {
+  region = var.aws_region
+  access_key = var.access_key
+  secret_key = var.secret_key
+
+}
+
+resource "aws_instance" "master" {
+  ami           = var.aws_ami
+  instance_type = var.aws_instance
+  vpc_security_group_ids = [aws_security_group.instance.id]
+  subnet_id =  var.aws_subnet_id
+  user_data = <<-EOF
+              #!/bin/bash
+              sudo su
+              apt update -y >> microk8s_install.log
+              apt install snapd -y >> microk8s_install.log
+              snap install core >> microk8s_install.log
+              export PATH=$PATH:/snap/bin
+              snap install microk8s --classic >> microk8s_install.log
+              microk8s status --wait-ready
+              microk8s enable dns >> microk8s_install.log
+              microk8s add-node > microk8s.join_token
+              microk8s config > configFile
+              EOF
+  key_name = "terraform"
+  tags = {
+    Name = "master"
+  }
+  provisioner "remote-exec" {
+  inline = ["until [ -f /microk8s.join_token ]; do sleep 5; done; cat /microk8s.join_token",
+            "sudo sed -i 's/#MOREIPS/IP.7 = ${self.public_ip}\\n#MOREIPS/g' /var/snap/microk8s/current/certs/csr.conf.template",
+            "sudo sleep 1m",
+            "sudo microk8s stop",
+            "sudo microk8s start"
+           ]
+  }
+
+  connection {
+    host = self.public_ip
+    type     = "ssh"
+    user     = "ubuntu"
+    password = ""
+    private_key = "${file("terraform.pem")}"
+  }
+
+  provisioner "local-exec" {
+    command = <<EOT
+               ssh-keyscan -H ${self.public_dns} >> ~/.ssh/known_hosts
+               scp -i terraform.pem ubuntu@${self.public_dns}:/microk8s.join_token .
+               tail -n1 microk8s.join_token >> token
+               scp -i terraform.pem ubuntu@${self.public_dns}:/configFile .
+              EOT
+  }
+
+  lifecycle {
+    create_before_destroy = true
+  }
+}
+
+resource "aws_security_group" "instance" {
+  name = "master_microk8s"
+  vpc_id = var.vpc_id
+  ingress {
+    from_port   = 0
+    to_port     = 0
+    protocol    = "-1"
+    cidr_blocks = ["0.0.0.0/0"]
+  }
+  egress {
+    from_port   = 0
+    to_port     = 0
+    protocol    = "-1"
+    cidr_blocks = ["0.0.0.0/0"]
+  }
+
+}
+
+data "local_file" "tokenContent" {
+  filename = "token"
+  depends_on = [
+    aws_instance.master,
+  ]
+}
+
+
+locals {
+    public_dns = aws_instance.master.public_dns
+    join = data.local_file.tokenContent.content
+}
+
+
+resource "aws_instance" "worker" {
+  ami           = var.aws_ami
+  instance_type = var.aws_instance
+  vpc_security_group_ids = [aws_security_group.instance.id]
+  subnet_id =  var.aws_subnet_id
+  user_data = templatefile("worker_user_data.tmpl", { token = local.join } )
+  key_name = "terraform"
+  tags = {
+    Name = "worker"
+  }
+
+  provisioner "remote-exec" {
+  inline = ["until [ -f /microk8s.complete ]; do sleep 5; done"]
+  }
+
+  connection {
+    host = self.public_ip
+    type     = "ssh"
+    user     = "ubuntu"
+    password = ""
+    private_key = "${file("terraform.pem")}"
+  }
+  lifecycle {
+    create_before_destroy = true
+  }
+
+  depends_on = [
+    aws_instance.master,
+  ]
+}
+
+
+output "master_ip" {
+  value         = aws_instance.master.public_ip
+}
+