diff options
-rw-r--r-- | .gitmodules | 3 | ||||
-rw-r--r-- | ansible/ansible.cfg | 3 | ||||
-rw-r--r-- | ansible/hosts | 5 | ||||
m--------- | ansible/kubespray | 0 | ||||
-rw-r--r-- | ansible/playbooks/docker.yml | 5 | ||||
-rw-r--r-- | ansible/playbooks/k8s.yml | 8 | ||||
-rw-r--r-- | ansible/roles/docker/defaults/main.yml | 9 | ||||
-rw-r--r-- | ansible/roles/docker/tasks/main.yml | 5 | ||||
-rw-r--r-- | opentofu/docker-server.tf | 24 | ||||
-rwxr-xr-x | opentofu/inventory.ini | 14 | ||||
-rw-r--r-- | opentofu/inventory.tf | 18 | ||||
-rw-r--r-- | opentofu/k8s-cluster.tf | 27 | ||||
-rw-r--r-- | opentofu/modules/README.md | 3 | ||||
-rw-r--r-- | opentofu/modules/ansible_provisioner/main.tf | 27 | ||||
-rw-r--r-- | opentofu/outputs.tf | 1 | ||||
-rw-r--r-- | opentofu/plan.out | bin | 13423 -> 9767 bytes | |||
-rw-r--r-- | opentofu/terraform.tfvars | 3 | ||||
-rw-r--r-- | opentofu/ubuntu-server-noble.tf | 57 | ||||
-rw-r--r-- | opentofu/variables.tf | 6 |
19 files changed, 108 insertions, 110 deletions
diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..efb6754 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "ansible/kubespray"] + path = ansible/kubespray + url = https://github.com/kubernetes-sigs/kubespray diff --git a/ansible/ansible.cfg b/ansible/ansible.cfg index 002a50d..5a7e920 100644 --- a/ansible/ansible.cfg +++ b/ansible/ansible.cfg @@ -1,2 +1,3 @@ [defaults] -roles_path = ./roles +roles_path = ./roles/:./kubespray/roles/ +library = ./library/:./kubespray/library/ diff --git a/ansible/hosts b/ansible/hosts deleted file mode 100644 index 0efb10e..0000000 --- a/ansible/hosts +++ /dev/null @@ -1,5 +0,0 @@ -[vps] -10.0.0.1 ansible_user=debian ansible_port=8022 -[pve] -10.0.0.5 ansible_user=mas ansible_port=8022 - diff --git a/ansible/kubespray b/ansible/kubespray new file mode 160000 +Subproject 59e1638ae1228e7ecb84ddc6b90bfef1b2f2206 diff --git a/ansible/playbooks/docker.yml b/ansible/playbooks/docker.yml index 7988d9c..12ff431 100644 --- a/ansible/playbooks/docker.yml +++ b/ansible/playbooks/docker.yml @@ -1,8 +1,7 @@ --- - -- hosts: all +- name: Install Docker on Ubuntu or Debian + hosts: all become: true roles: - role: docker - ... diff --git a/ansible/playbooks/k8s.yml b/ansible/playbooks/k8s.yml new file mode 100644 index 0000000..08a1c45 --- /dev/null +++ b/ansible/playbooks/k8s.yml @@ -0,0 +1,8 @@ +--- +- name: Deploy a Production Ready Kubernetes Cluster + hosts: all + become: true + +# Import kubespray playbook to deploy k8s cluster +- import_playbook: ../kubespray/cluster.yml +... diff --git a/ansible/roles/docker/defaults/main.yml b/ansible/roles/docker/defaults/main.yml index 615b320..bc9ec77 100644 --- a/ansible/roles/docker/defaults/main.yml +++ b/ansible/roles/docker/defaults/main.yml @@ -1,6 +1,11 @@ --- -docker_repo: "https://download.docker.com/linux/debian" -docker_gpg_key_url: "https://download.docker.com/linux/debian/gpg" +docker_repos: + Debian: "https://download.docker.com/linux/debian" + Ubuntu: "https://download.docker.com/linux/ubuntu" + +docker_gpg_keys: + Debian: "https://download.docker.com/linux/debian/gpg" + Ubuntu: "https://download.docker.com/linux/ubuntu/gpg" docker_packages: - docker-ce diff --git a/ansible/roles/docker/tasks/main.yml b/ansible/roles/docker/tasks/main.yml index df1c5d7..37d9b4d 100644 --- a/ansible/roles/docker/tasks/main.yml +++ b/ansible/roles/docker/tasks/main.yml @@ -1,4 +1,9 @@ --- +- name: Set Docker repository variables based on OS + ansible.builtin.set_fact: + docker_repo: "{{ docker_repos[ansible_distribution] }}" + docker_gpg_key_url: "{{ docker_gpg_keys[ansible_distribution] }}" + - name: Install required dependencies ansible.builtin.apt: name: "{{ docker_dependencies }}" diff --git a/opentofu/docker-server.tf b/opentofu/docker-server.tf index 3e13b42..04b2cb1 100644 --- a/opentofu/docker-server.tf +++ b/opentofu/docker-server.tf @@ -56,21 +56,11 @@ resource "proxmox_vm_qemu" "docker_server" { sshkeys = var.ssh_public_key } -# Run Ansible playbook after VM creation -resource "null_resource" "ansible_provisioner" { - triggers = { - vm_id = proxmox_vm_qemu.docker_server.id - } - - provisioner "local-exec" { - command = <<-EOT - ANSIBLE_HOST_KEY_CHECKING=False ANSIBLE_CONFIG=${path.root}/../ansible/ansible.cfg ansible-playbook \ - -i '${proxmox_vm_qemu.docker_server.default_ipv4_address},' \ - -u ${var.vm_username} \ - --private-key ${var.ssh_private_key_path} \ - ${var.ansible_playbook_path} - EOT - } - - depends_on = [proxmox_vm_qemu.docker_server] +# Run Ansible playbook after VM creation to install Docker +module "ansible_provision_docker_server" { + source = "./modules/ansible_provisioner" + vm_ip = proxmox_vm_qemu.docker_server.default_ipv4_address # Pass only the VM's IP + vm_username = var.vm_username + ssh_private_key_path = var.ssh_private_key_path + ansible_playbook_path = var.docker_ansible_playbook_path } diff --git a/opentofu/inventory.ini b/opentofu/inventory.ini new file mode 100755 index 0000000..f00a94a --- /dev/null +++ b/opentofu/inventory.ini @@ -0,0 +1,14 @@ +[kube_control_plane] +192.168.1.86 + +[etcd] +192.168.1.86 + +[kube_node] +192.168.1.84 +192.168.1.85 + + +[k8s_cluster:children] +kube_control_plane +kube_node diff --git a/opentofu/inventory.tf b/opentofu/inventory.tf new file mode 100644 index 0000000..ddf3ba4 --- /dev/null +++ b/opentofu/inventory.tf @@ -0,0 +1,18 @@ +resource "local_file" "ansible_inventory" { + filename = "${path.module}/inventory.ini" + content = <<-EOT + [kube_control_plane] + ${proxmox_vm_qemu.k8s_cp.default_ipv4_address} + + [etcd] + ${proxmox_vm_qemu.k8s_cp.default_ipv4_address} + + [kube_node] + %{for vm in proxmox_vm_qemu.k8s_worker[*]}${vm.default_ipv4_address} + %{endfor} + + [k8s_cluster:children] + kube_control_plane + kube_node + EOT +} diff --git a/opentofu/k8s-cluster.tf b/opentofu/k8s-cluster.tf index 1241399..c6392cd 100644 --- a/opentofu/k8s-cluster.tf +++ b/opentofu/k8s-cluster.tf @@ -115,22 +115,11 @@ resource "proxmox_vm_qemu" "k8s_worker" { sshkeys = var.ssh_public_key } - -## Run Ansible playbook after VM creation -#resource "null_resource" "ansible_provisioner" { -# triggers = { -# vm_id = proxmox_vm_qemu.k8s-[worker][cp]-[count.index].id -# } -# -# provisioner "local-exec" { -# command = <<-EOT -# ANSIBLE_HOST_KEY_CHECKING=False ANSIBLE_CONFIG=${path.root}/../ansible/ansible.cfg ansible-playbook \ -# -i '${proxmox_vm_qemu.k8s-[worker][cp]-[count.index].default_ipv4_address},' \ -# -u ${var.vm_username} \ -# --private-key ${var.ssh_private_key_path} \ -# ${var.ansible_playbook_path} -# EOT -# } -# -# depends_on = [proxmox_vm_qemu.docker_server] -#} +# Provision the control plane node and the workers +module "ansible_provision_k8s" { + source = "./modules/ansible_provisioner" + inventory_file_path = local_file.ansible_inventory.filename # Pass inventory path here + vm_username = var.vm_username + ssh_private_key_path = var.ssh_private_key_path + ansible_playbook_path = var.k8s_ansible_playbook_path +} diff --git a/opentofu/modules/README.md b/opentofu/modules/README.md index 4ba37a9..2dab9cb 100644 --- a/opentofu/modules/README.md +++ b/opentofu/modules/README.md @@ -1,6 +1,3 @@ # OpenTofu Modules This folder contains reusable OpenTofu modules for provisioning infrastructure. - -## Available Modules -- diff --git a/opentofu/modules/ansible_provisioner/main.tf b/opentofu/modules/ansible_provisioner/main.tf new file mode 100644 index 0000000..54e3346 --- /dev/null +++ b/opentofu/modules/ansible_provisioner/main.tf @@ -0,0 +1,27 @@ +variable "vm_ip" { + default = null +} + +variable "inventory_file_path" { + default = null +} + +variable "vm_username" {} +variable "ssh_private_key_path" {} +variable "ansible_playbook_path" {} + +resource "null_resource" "ansible_provisioner" { + triggers = { + ip_or_inventory = coalesce(var.vm_ip, var.inventory_file_path) # Choose based on what is provided + } + + provisioner "local-exec" { + command = <<-EOT + ANSIBLE_HOST_KEY_CHECKING=False ANSIBLE_CONFIG=${path.root}/../ansible/ansible.cfg ansible-playbook \ + -i ${var.inventory_file_path != null ? var.inventory_file_path : "${var.vm_ip},"} \ + -u ${var.vm_username} \ + --private-key ${var.ssh_private_key_path} \ + ${var.ansible_playbook_path} + EOT + } +} diff --git a/opentofu/outputs.tf b/opentofu/outputs.tf index 7779a10..c6c3d88 100644 --- a/opentofu/outputs.tf +++ b/opentofu/outputs.tf @@ -3,7 +3,6 @@ locals { [proxmox_vm_qemu.k8s_cp], proxmox_vm_qemu.k8s_worker, [proxmox_vm_qemu.docker_server], - [proxmox_vm_qemu.ubuntu_server_noble] ]) } diff --git a/opentofu/plan.out b/opentofu/plan.out Binary files differindex 0a6bf9f..a295e16 100644 --- a/opentofu/plan.out +++ b/opentofu/plan.out diff --git a/opentofu/terraform.tfvars b/opentofu/terraform.tfvars index a457908..bbb7b1b 100644 --- a/opentofu/terraform.tfvars +++ b/opentofu/terraform.tfvars @@ -5,4 +5,5 @@ ubuntu_server_noble_packer_image_name = "ubuntu-server-noble-24-04-1-amd64" vm_username = "mas" ssh_private_key_path = "~/.ssh/id_ecdsa" ssh_public_key = "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCtB9NZgJMVovVR4foT0OOV9GdHeHZoPtK1TGko2W4wli/reKjpUYBhlSPWbaWD9WUbl0RRqdzkODy1fB001zxs= mas@TMV2" -ansible_playbook_path = "../ansible/playbooks/docker.yml" +docker_ansible_playbook_path = "../ansible/playbooks/docker.yml" +k8s_ansible_playbook_path = "../ansible/playbooks/k8s.yml" diff --git a/opentofu/ubuntu-server-noble.tf b/opentofu/ubuntu-server-noble.tf deleted file mode 100644 index fe64af9..0000000 --- a/opentofu/ubuntu-server-noble.tf +++ /dev/null @@ -1,57 +0,0 @@ -resource "proxmox_vm_qemu" "ubuntu_server_noble" { - - lifecycle { - ignore_changes = [ - bootdisk, - ] - } - - name = "ubuntu-server-noble" - desc = "Plain ubuntu server noble" - agent = 1 # Qemu Guest Agent - target_node = var.proxmox_node - tags = "ubuntu" - - clone = var.ubuntu_server_noble_packer_image_name - full_clone = true - - qemu_os = "other" - cores = 2 - sockets = 1 - cpu_type = "host" - memory = 4096 - - scsihw = "virtio-scsi-pci" - bootdisk = "scsi0" - - disks { - ide { - ide0 { - cloudinit { - storage = "local-lvm" - } - } - } - virtio { - virtio0 { - disk { - storage = "local-lvm" - size = "20G" - iothread = true - replicate = false - } - } - } - } - - network { - id = 0 - model = "virtio" - bridge = "vmbr0" - } - - # Cloud-Init settings - ipconfig0 = "ip=dhcp" - ciuser = "mas" - sshkeys = var.ssh_public_key -} diff --git a/opentofu/variables.tf b/opentofu/variables.tf index bdbc17f..c777b21 100644 --- a/opentofu/variables.tf +++ b/opentofu/variables.tf @@ -43,11 +43,15 @@ variable "ssh_public_key" { sensitive = true } -variable "ansible_playbook_path" { +variable "docker_ansible_playbook_path" { description = "Path to the Ansible playbook for Docker installation" type = string } +variable "k8s_ansible_playbook_path" { + description = "Path to the Ansible playbook for k8s installation" + type = string +} variable "k8s_worker_vm_name_prefix" { description = "VM name prefix" |