mirror of
				https://github.com/optim-enterprises-bv/terraform-talos.git
				synced 2025-10-30 17:58:32 +00:00 
			
		
		
		
	proxmox and cloud-init
This commit is contained in:
		| @@ -3,3 +3,9 @@ | |||||||
| * https://console.cloud.google.com/apis/library/cloudresourcemanager.googleapis.com | * https://console.cloud.google.com/apis/library/cloudresourcemanager.googleapis.com | ||||||
| * https://console.cloud.google.com/apis/library/compute.googleapis.com | * https://console.cloud.google.com/apis/library/compute.googleapis.com | ||||||
| * https://console.cloud.google.com/apis/library/servicenetworking.googleapis.com | * https://console.cloud.google.com/apis/library/servicenetworking.googleapis.com | ||||||
|  |  | ||||||
|  |  | ||||||
|  | ```shell | ||||||
|  | gcloud auth login | ||||||
|  | gcloud auth application-default login | ||||||
|  | ``` | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ create-lb: ## Create load balancer | |||||||
| 	terraform refresh | 	terraform refresh | ||||||
|  |  | ||||||
| create-config: ## Genereate talos configs | create-config: ## Genereate talos configs | ||||||
| 	talosctl gen config --output-dir _cfgs --with-docs=false --with-examples=false talos-k8s-hetzner https://${ENDPOINT}:6443 | 	talosctl gen config --output-dir _cfgs --with-docs=false --with-examples=false ${CLUSTERNAME} https://${ENDPOINT}:6443 | ||||||
| 	talosctl --talosconfig _cfgs/talosconfig config endpoint ${ENDPOINT} | 	talosctl --talosconfig _cfgs/talosconfig config endpoint ${ENDPOINT} | ||||||
|  |  | ||||||
| create-templates: | create-templates: | ||||||
|   | |||||||
| @@ -1,19 +1,24 @@ | |||||||
|  |  | ||||||
| ENDPOINT=192.168.10.10 | ENDPOINT=192.168.10.10 | ||||||
|  | CLUSTERNAME:="talos-k8s-proxmox" | ||||||
|  |  | ||||||
| help: | help: | ||||||
| 	@awk 'BEGIN {FS = ":.*?## "} /^[0-9a-zA-Z_-]+:.*?## / {sub("\\\\n",sprintf("\n%22c"," "), $$2);printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) | 	@awk 'BEGIN {FS = ":.*?## "} /^[0-9a-zA-Z_-]+:.*?## / {sub("\\\\n",sprintf("\n%22c"," "), $$2);printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST) | ||||||
|  |  | ||||||
| create-config: ## Genereate talos configs | create-config: ## Genereate talos configs | ||||||
| 	talosctl gen config --output-dir _cfgs --with-docs=false --with-examples=false talos-k8s-proxmox https://${ENDPOINT}:6443 | 	talosctl gen config --output-dir _cfgs --with-docs=false --with-examples=false --config-patch-worker @templates/worker.patch.yaml ${CLUSTERNAME} https://${ENDPOINT}:6443 | ||||||
|  | 	talosctl --talosconfig _cfgs/talosconfig config endpoint ${ENDPOINT} | ||||||
|  |  | ||||||
| create-templates: | create-templates: | ||||||
| 	@yq ea -P '. as $$item ireduce ({}; . * $$item )' _cfgs/controlplane.yaml templates/controlplane.yaml.tpl > templates/controlplane.yaml | 	@yq ea -P '. as $$item ireduce ({}; . * $$item )' _cfgs/controlplane.yaml templates/controlplane.yaml.tpl > templates/controlplane.yaml | ||||||
| 	@echo 'podSubnets: "10.32.0.0/12,fd00:10:32::/102"'        >  _cfgs/tfstate.vars | 	@echo 'podSubnets: "10.32.0.0/12,fd00:10:32::/102"'        >  _cfgs/tfstate.vars | ||||||
| 	@echo 'serviceSubnets: "10.200.0.0/22,fd40:10:200::/112"'  >> _cfgs/tfstate.vars | 	@echo 'serviceSubnets: "10.200.0.0/22,fd40:10:200::/112"'  >> _cfgs/tfstate.vars | ||||||
|  | 	@echo 'nodeSubnets: "172.16.0.0/12"'                       >> _cfgs/tfstate.vars | ||||||
| 	@echo 'apiDomain: api.cluster.local'                       >> _cfgs/tfstate.vars | 	@echo 'apiDomain: api.cluster.local'                       >> _cfgs/tfstate.vars | ||||||
| 	@yq eval '.cluster.network.dnsDomain' _cfgs/controlplane.yaml | awk '{ print "domain: "$$1}'       >> _cfgs/tfstate.vars | 	@yq eval '.cluster.network.dnsDomain' _cfgs/controlplane.yaml | awk '{ print "domain: "$$1}'       >> _cfgs/tfstate.vars | ||||||
| 	@yq eval '.cluster.clusterName' _cfgs/controlplane.yaml       | awk '{ print "clusterName: "$$1}'  >> _cfgs/tfstate.vars | 	@yq eval '.cluster.clusterName' _cfgs/controlplane.yaml       | awk '{ print "clusterName: "$$1}'  >> _cfgs/tfstate.vars | ||||||
|  | 	@yq eval '.cluster.id' _cfgs/controlplane.yaml                | awk '{ print "clusterID: "$$1}'    >> _cfgs/tfstate.vars | ||||||
|  | 	@yq eval '.cluster.secret' _cfgs/controlplane.yaml            | awk '{ print "clusterSecret: "$$1}'>> _cfgs/tfstate.vars | ||||||
| 	@yq eval '.machine.token'  _cfgs/controlplane.yaml            | awk '{ print "tokenMachine: "$$1}' >> _cfgs/tfstate.vars | 	@yq eval '.machine.token'  _cfgs/controlplane.yaml            | awk '{ print "tokenMachine: "$$1}' >> _cfgs/tfstate.vars | ||||||
| 	@yq eval '.machine.ca.crt' _cfgs/controlplane.yaml            | awk '{ print "caMachine: "$$1}'    >> _cfgs/tfstate.vars | 	@yq eval '.machine.ca.crt' _cfgs/controlplane.yaml            | awk '{ print "caMachine: "$$1}'    >> _cfgs/tfstate.vars | ||||||
| 	@yq eval '.cluster.token'  _cfgs/controlplane.yaml            | awk '{ print "token: "$$1}'        >> _cfgs/tfstate.vars | 	@yq eval '.cluster.token'  _cfgs/controlplane.yaml            | awk '{ print "token: "$$1}'        >> _cfgs/tfstate.vars | ||||||
| @@ -21,5 +26,14 @@ create-templates: | |||||||
|  |  | ||||||
| 	@yq eval -o=json '{"kubernetes": .}' _cfgs/tfstate.vars > terraform.tfvars.json | 	@yq eval -o=json '{"kubernetes": .}' _cfgs/tfstate.vars > terraform.tfvars.json | ||||||
|  |  | ||||||
| create-kubeconfig: | create-controlplane-bootstrap: | ||||||
| 	talosctl --talosconfig _cfgs/talosconfig --nodes ${ENDPOINT} kubeconfig | 	talosctl --talosconfig _cfgs/talosconfig config endpoint ${ENDPOINT} | ||||||
|  | 	talosctl --talosconfig _cfgs/talosconfig --nodes 172.16.0.11 bootstrap | ||||||
|  |  | ||||||
|  | create-controlplane: ## Bootstrap first controlplane node | ||||||
|  | 	terraform apply -auto-approve -target=hcloud_server.controlplane | ||||||
|  |  | ||||||
|  | create-kubeconfig: ## Prepare kubeconfig | ||||||
|  | 	talosctl --talosconfig _cfgs/talosconfig --nodes 172.16.0.11 kubeconfig . | ||||||
|  | 	kubectl --kubeconfig=kubeconfig config set clusters.${CLUSTERNAME}.server https://${ENDPOINT}:6443 | ||||||
|  | 	kubectl --kubeconfig=kubeconfig config set-context --current --namespace=kube-system | ||||||
|   | |||||||
| @@ -1,7 +1,18 @@ | |||||||
|  |  | ||||||
|  | # provider "proxmox" { | ||||||
|  | #   virtual_environment { | ||||||
|  | #     endpoint = "https://${var.proxmox_host}:8006/" | ||||||
|  | #     insecure = true | ||||||
|  |  | ||||||
|  | #     username = var.proxmox_token_id | ||||||
|  | #     password = var.proxmox_token_secret | ||||||
|  | #   } | ||||||
|  | # } | ||||||
|  |  | ||||||
| provider "proxmox" { | provider "proxmox" { | ||||||
|   pm_api_url          = "https://${var.proxmox_host}:8006/api2/json" |   pm_api_url          = "https://${var.proxmox_host}:8006/api2/json" | ||||||
|   pm_api_token_id     = var.proxmox_token_id |   pm_api_token_id     = var.proxmox_token_id | ||||||
|   pm_api_token_secret = var.proxmox_token_secret |   pm_api_token_secret = var.proxmox_token_secret | ||||||
|   pm_tls_insecure     = true |   pm_tls_insecure     = true | ||||||
|  |   pm_debug            = true | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										78
									
								
								proxmox/instances-controlplane.tf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								proxmox/instances-controlplane.tf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | |||||||
|  |  | ||||||
|  | # resource "null_resource" "controlplane_machineconfig" { | ||||||
|  | #   count = lookup(var.controlplane, "count", 0) | ||||||
|  | #   connection { | ||||||
|  | #     type = "ssh" | ||||||
|  | #     user = "root" | ||||||
|  | #     host = var.proxmox_host | ||||||
|  | #   } | ||||||
|  |  | ||||||
|  | #   provisioner "file" { | ||||||
|  | #     content = templatefile("${path.module}/templates/controlplane.yaml", | ||||||
|  | #       merge(var.kubernetes, { | ||||||
|  | #         name        = "controlplane-${count.index + 1}" | ||||||
|  | #         type        = "controlplane" | ||||||
|  | #         ipv4_local  = "192.168.10.11" | ||||||
|  | #         ipv4_vip    = "192.168.10.10" | ||||||
|  | #         nodeSubnets = "${var.vpc_main_cidr}" | ||||||
|  | #       }) | ||||||
|  | #     ) | ||||||
|  |  | ||||||
|  | #     destination = "/var/lib/vz/snippets/controlplane-${count.index + 1}.yml" | ||||||
|  | #   } | ||||||
|  | # } | ||||||
|  |  | ||||||
|  | # resource "proxmox_vm_qemu" "controlplane" { | ||||||
|  | #   count       = lookup(var.controlplane, "count", 0) | ||||||
|  | #   name        = "controlplane-${count.index + 1}" | ||||||
|  | #   target_node = var.proxmox_nodename | ||||||
|  | #   clone       = var.proxmox_image | ||||||
|  |  | ||||||
|  | #   # preprovision           = false | ||||||
|  | #   define_connection_info  = false | ||||||
|  | #   os_type                 = "ubuntu" | ||||||
|  | #   ipconfig0               = "ip=${cidrhost(var.vpc_main_cidr, 11 + count.index)}/24,gw=${local.gwv4}" | ||||||
|  | #   cicustom                = "user=local:snippets/controlplane-${count.index + 1}.yml" | ||||||
|  | #   cloudinit_cdrom_storage = var.proxmox_storage | ||||||
|  |  | ||||||
|  | #   onboot  = false | ||||||
|  | #   cpu     = "host,flags=+aes" | ||||||
|  | #   cores   = 2 | ||||||
|  | #   sockets = 1 | ||||||
|  | #   memory  = 2048 | ||||||
|  | #   scsihw  = "virtio-scsi-pci" | ||||||
|  |  | ||||||
|  | #   vga { | ||||||
|  | #     memory = 0 | ||||||
|  | #     type   = "serial0" | ||||||
|  | #   } | ||||||
|  | #   serial { | ||||||
|  | #     id   = 0 | ||||||
|  | #     type = "socket" | ||||||
|  | #   } | ||||||
|  |  | ||||||
|  | #   network { | ||||||
|  | #     model    = "virtio" | ||||||
|  | #     bridge   = var.proxmox_bridge | ||||||
|  | #     firewall = false | ||||||
|  | #   } | ||||||
|  |  | ||||||
|  | #   boot = "order=scsi0" | ||||||
|  | #   disk { | ||||||
|  | #     type    = "scsi" | ||||||
|  | #     storage = var.proxmox_storage | ||||||
|  | #     size    = "16G" | ||||||
|  | #     cache   = "writethrough" | ||||||
|  | #     ssd     = 1 | ||||||
|  | #     backup  = 0 | ||||||
|  | #   } | ||||||
|  |  | ||||||
|  | #   lifecycle { | ||||||
|  | #     ignore_changes = [ | ||||||
|  | #       desc, | ||||||
|  | #       define_connection_info, | ||||||
|  | #     ] | ||||||
|  | #   } | ||||||
|  |  | ||||||
|  | #   depends_on = [null_resource.controlplane_machineconfig] | ||||||
|  | # } | ||||||
| @@ -1,78 +0,0 @@ | |||||||
|  |  | ||||||
| resource "null_resource" "controlplane_machineconfig" { |  | ||||||
|   count = lookup(var.controlplane, "count", 0) |  | ||||||
|   connection { |  | ||||||
|     type = "ssh" |  | ||||||
|     user = "root" |  | ||||||
|     host = var.proxmox_host |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   provisioner "file" { |  | ||||||
|     content = templatefile("${path.module}/templates/controlplane.yaml", |  | ||||||
|       merge(var.kubernetes, { |  | ||||||
|         name        = "master-${count.index + 1}" |  | ||||||
|         type        = "controlplane" |  | ||||||
|         ipv4_local  = "192.168.10.11" |  | ||||||
|         ipv4_vip    = "192.168.10.10" |  | ||||||
|         nodeSubnets = "${var.vpc_main_cidr}" |  | ||||||
|       }) |  | ||||||
|     ) |  | ||||||
|  |  | ||||||
|     destination = "/var/lib/vz/snippets/master-${count.index + 1}.yml" |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| resource "proxmox_vm_qemu" "controlplane" { |  | ||||||
|   count       = lookup(var.controlplane, "count", 0) |  | ||||||
|   name        = "master-${count.index + 1}" |  | ||||||
|   target_node = var.proxmox_nodename |  | ||||||
|   clone       = var.proxmox_image |  | ||||||
|  |  | ||||||
|   # preprovision           = false |  | ||||||
|   define_connection_info  = false |  | ||||||
|   os_type                 = "ubuntu" |  | ||||||
|   ipconfig0               = "ip=${cidrhost(var.vpc_main_cidr, 11 + count.index)}/24,gw=${local.gwv4}" |  | ||||||
|   cicustom                = "user=local:snippets/master-${count.index + 1}.yml" |  | ||||||
|   cloudinit_cdrom_storage = var.proxmox_storage |  | ||||||
|  |  | ||||||
|   onboot  = false |  | ||||||
|   cpu     = "host,flags=+aes" |  | ||||||
|   cores   = 2 |  | ||||||
|   sockets = 1 |  | ||||||
|   memory  = 2048 |  | ||||||
|   scsihw  = "virtio-scsi-pci" |  | ||||||
|  |  | ||||||
|   vga { |  | ||||||
|     memory = 0 |  | ||||||
|     type   = "serial0" |  | ||||||
|   } |  | ||||||
|   serial { |  | ||||||
|     id   = 0 |  | ||||||
|     type = "socket" |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   network { |  | ||||||
|     model    = "virtio" |  | ||||||
|     bridge   = var.proxmox_bridge |  | ||||||
|     firewall = false |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   boot = "order=scsi0" |  | ||||||
|   disk { |  | ||||||
|     type    = "scsi" |  | ||||||
|     storage = var.proxmox_storage |  | ||||||
|     size    = "16G" |  | ||||||
|     cache   = "writethrough" |  | ||||||
|     ssd     = 1 |  | ||||||
|     backup  = 0 |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   lifecycle { |  | ||||||
|     ignore_changes = [ |  | ||||||
|       desc, |  | ||||||
|       define_connection_info, |  | ||||||
|     ] |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   depends_on = [null_resource.controlplane_machineconfig] |  | ||||||
| } |  | ||||||
| @@ -1,37 +1,165 @@ | |||||||
|  |  | ||||||
|  | locals { | ||||||
|  |   worker_prefix = "worker" | ||||||
|  |  | ||||||
|  |   zones = [for k, v in var.instances : k] | ||||||
|  |   workers = { for k in flatten([ | ||||||
|  |     for zone in local.zones : [ | ||||||
|  |       for inx in range(lookup(try(var.instances[zone], {}), "worker_count", 0)) : { | ||||||
|  |         id : lookup(try(var.instances[zone], {}), "worker_id", 9000) + inx | ||||||
|  |         name : "${local.worker_prefix}-${lower(substr(zone, -1, -1))}${1 + inx}" | ||||||
|  |         zone : zone | ||||||
|  |         node_name : zone | ||||||
|  |         cpu : lookup(try(var.instances[zone], {}), "worker_cpu", 1) | ||||||
|  |         mem : lookup(try(var.instances[zone], {}), "worker_mem", 2048) | ||||||
|  |         ipv4 : "${cidrhost(var.vpc_main_cidr, 81 + inx)}/24" | ||||||
|  |         gwv4 : local.gwv4 | ||||||
|  |       } | ||||||
|  |     ] | ||||||
|  |   ]) : k.name => k } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | output "workers" { | ||||||
|  |   value = local.workers | ||||||
|  | } | ||||||
|  |  | ||||||
| resource "null_resource" "worker_machineconfig" { | resource "null_resource" "worker_machineconfig" { | ||||||
|   count = lookup(var.worker, "count", 0) |   for_each = var.instances | ||||||
|   connection { |   connection { | ||||||
|     type = "ssh" |     type = "ssh" | ||||||
|     user = "root" |     user = "root" | ||||||
|     host = var.proxmox_host |     host = "${each.key}.${var.proxmox_domain}" | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   provisioner "file" { |   provisioner "file" { | ||||||
|     # content     = file("init.yaml") |     source      = "${path.module}/_cfgs/worker.yaml" | ||||||
|     source      = "worker.yaml" |     destination = "/var/lib/vz/snippets/${local.worker_prefix}.yaml" | ||||||
|     destination = "/var/lib/vz/snippets/worker-${count.index + 1}.yml" |   } | ||||||
|  |  | ||||||
|  |   triggers = { | ||||||
|  |     params = filemd5("${path.module}/_cfgs/worker.yaml") | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | resource "null_resource" "worker_metadata" { | ||||||
|  |   for_each = local.workers | ||||||
|  |   connection { | ||||||
|  |     type = "ssh" | ||||||
|  |     user = "root" | ||||||
|  |     host = "${each.value.node_name}.${var.proxmox_domain}" | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   provisioner "file" { | ||||||
|  |     content = templatefile("${path.module}/templates/metadata.yaml", { | ||||||
|  |       hostname : each.value.name, | ||||||
|  |       id : each.value.id, | ||||||
|  |       type : "qemu", | ||||||
|  |       zone : each.value.zone, | ||||||
|  |       region : var.region, | ||||||
|  |     }) | ||||||
|  |     destination = "/var/lib/vz/snippets/${each.value.name}.metadata.yaml" | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   triggers = { | ||||||
|  |     params = join(",", [for k, v in local.workers[each.key] : "${k}-${v}"]) | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | # resource "proxmox_virtual_environment_vm" "talos" { | ||||||
|  | #   for_each = local.workers | ||||||
|  | #   name     = each.value.name | ||||||
|  | #   tags     = ["talos"] | ||||||
|  |  | ||||||
|  | #   node_name = each.value.node_name | ||||||
|  | #   vm_id     = each.value.id | ||||||
|  |  | ||||||
|  | #   initialization { | ||||||
|  | #     datastore_id = "local" | ||||||
|  | #     ip_config { | ||||||
|  | #       ipv6 { | ||||||
|  | #         address = "slaac" | ||||||
|  | #         # gateway = "" | ||||||
|  | #       } | ||||||
|  | #     } | ||||||
|  | #     ip_config { | ||||||
|  | #       ipv4 { | ||||||
|  | #         address = "2.3.4.5/24" | ||||||
|  | #       } | ||||||
|  | #     } | ||||||
|  | #     user_data_file_id = "" | ||||||
|  | #   } | ||||||
|  | #   clone { | ||||||
|  | #     vm_id        = 102 | ||||||
|  | #     datastore_id = var.proxmox_storage | ||||||
|  | #   } | ||||||
|  | #   disk { | ||||||
|  | #     datastore_id = var.proxmox_storage | ||||||
|  | #     interface    = "scsi0" | ||||||
|  | #     ssd          = true | ||||||
|  | #     size         = 32 | ||||||
|  | #     file_format  = "raw" | ||||||
|  | #   } | ||||||
|  | #   cpu { | ||||||
|  | #     cores   = each.value.cpu | ||||||
|  | #     sockets = 1 | ||||||
|  | #     type    = "host" | ||||||
|  | #     flags   = ["+aes"] | ||||||
|  | #   } | ||||||
|  | #   memory { | ||||||
|  | #     dedicated = each.value.mem | ||||||
|  | #   } | ||||||
|  |  | ||||||
|  | #   network_device { | ||||||
|  | #     model  = "virtio" | ||||||
|  | #     bridge = "vmbr0" | ||||||
|  | #     # firewall = true | ||||||
|  | #   } | ||||||
|  | #   network_device { | ||||||
|  | #     model  = "virtio" | ||||||
|  | #     bridge = "vmbr1" | ||||||
|  | #   } | ||||||
|  |  | ||||||
|  | #   operating_system { | ||||||
|  | #     type = "l26" | ||||||
|  | #   } | ||||||
|  | #   agent { | ||||||
|  | #     enabled = false | ||||||
|  | #   } | ||||||
|  |  | ||||||
|  | #   serial_device {} | ||||||
|  | #   lifecycle { | ||||||
|  | #     ignore_changes = [ | ||||||
|  | #       tags, | ||||||
|  | #       cpu, | ||||||
|  | #       memory, | ||||||
|  | #       network_device, | ||||||
|  | #     ] | ||||||
|  | #   } | ||||||
|  |  | ||||||
|  | #   depends_on = [null_resource.worker_machineconfig, null_resource.worker_metadata] | ||||||
|  | # } | ||||||
|  |  | ||||||
| resource "proxmox_vm_qemu" "worker" { | resource "proxmox_vm_qemu" "worker" { | ||||||
|   count       = lookup(var.worker, "count", 0) |   for_each    = local.workers | ||||||
|   name        = "worker-${count.index + 1}" |   name        = each.value.name | ||||||
|   target_node = var.proxmox_nodename |   vmid        = each.value.id | ||||||
|  |   target_node = each.value.node_name | ||||||
|   clone       = var.proxmox_image |   clone       = var.proxmox_image | ||||||
|  |  | ||||||
|   # preprovision           = false |   agent                   = 0 | ||||||
|   define_connection_info  = false |   define_connection_info  = false | ||||||
|   os_type                 = "ubuntu" |   os_type                 = "ubuntu" | ||||||
|   ipconfig0               = "ip=${cidrhost(var.vpc_main_cidr, 21 + count.index)}/24,gw=${local.gwv4}" |   qemu_os                 = "l26" | ||||||
|   cicustom                = "user=local:snippets/worker-${count.index + 1}.yml" |   ipconfig0               = "ip6=auto" | ||||||
|  |   ipconfig1               = "ip=${each.value.ipv4},gw=${each.value.gwv4}" | ||||||
|  |   cicustom                = "user=local:snippets/${local.worker_prefix}.yaml,meta=local:snippets/${each.value.name}.metadata.yaml" | ||||||
|   cloudinit_cdrom_storage = var.proxmox_storage |   cloudinit_cdrom_storage = var.proxmox_storage | ||||||
|  |  | ||||||
|   onboot  = false |   onboot  = false | ||||||
|   cpu     = "host,flags=+aes" |   cpu     = "host,flags=+aes" | ||||||
|   cores   = 1 |  | ||||||
|   sockets = 1 |   sockets = 1 | ||||||
|   memory  = 1024 |   cores   = each.value.cpu | ||||||
|  |   memory  = each.value.mem | ||||||
|   scsihw  = "virtio-scsi-pci" |   scsihw  = "virtio-scsi-pci" | ||||||
|  |  | ||||||
|   vga { |   vga { | ||||||
| @@ -45,27 +173,36 @@ resource "proxmox_vm_qemu" "worker" { | |||||||
|  |  | ||||||
|   network { |   network { | ||||||
|     model    = "virtio" |     model    = "virtio" | ||||||
|     bridge   = var.proxmox_bridge |     bridge   = "vmbr0" | ||||||
|     firewall = true |     firewall = true | ||||||
|   } |   } | ||||||
|  |   network { | ||||||
|  |     model  = "virtio" | ||||||
|  |     bridge = "vmbr1" | ||||||
|  |   } | ||||||
|  |  | ||||||
|   boot = "order=scsi0" |   boot = "order=scsi0" | ||||||
|   disk { |   disk { | ||||||
|     type    = "scsi" |     type    = "scsi" | ||||||
|     storage = var.proxmox_storage |     storage = var.proxmox_storage | ||||||
|     size    = "16G" |     size    = "32G" | ||||||
|     cache   = "writethrough" |     cache   = "writethrough" | ||||||
|     ssd     = 1 |     ssd     = 1 | ||||||
|     backup  = 0 |     backup  = false | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   lifecycle { |   lifecycle { | ||||||
|     ignore_changes = [ |     ignore_changes = [ | ||||||
|  |       boot, | ||||||
|       network, |       network, | ||||||
|       desc, |       desc, | ||||||
|  |       numa, | ||||||
|  |       agent, | ||||||
|  |       ipconfig0, | ||||||
|  |       ipconfig1, | ||||||
|       define_connection_info, |       define_connection_info, | ||||||
|     ] |     ] | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   depends_on = [null_resource.worker_machineconfig] |   depends_on = [null_resource.worker_machineconfig, null_resource.worker_metadata] | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
|  |  | ||||||
| locals { | locals { | ||||||
|   gwv4       = cidrhost(var.vpc_main_cidr, -3) |   gwv4       = cidrhost(var.vpc_main_cidr, 1) | ||||||
|   lbv4_local = cidrhost(var.vpc_main_cidr, 10) |   lbv4_local = cidrhost(var.vpc_main_cidr, 10) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -11,6 +11,7 @@ Apply a few changes to the proxmox node. | |||||||
| ansible-galaxy role install git+https://github.com/sergelogvinov/ansible-role-system.git,main | ansible-galaxy role install git+https://github.com/sergelogvinov/ansible-role-system.git,main | ||||||
| ansible-galaxy role install git+https://github.com/sergelogvinov/ansible-role-users.git,main | ansible-galaxy role install git+https://github.com/sergelogvinov/ansible-role-users.git,main | ||||||
| ansible-galaxy role install git+https://github.com/sergelogvinov/ansible-role-iptables.git,main | ansible-galaxy role install git+https://github.com/sergelogvinov/ansible-role-iptables.git,main | ||||||
|  | ansible-galaxy role install git+https://github.com/sergelogvinov/ansible-role-dnsmasq.git,main | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| 2. Update inventory file, replace the host ip here `ansible_host` | 2. Update inventory file, replace the host ip here `ansible_host` | ||||||
|   | |||||||
| @@ -15,6 +15,11 @@ system_sysctl: | |||||||
|  |  | ||||||
| # | # | ||||||
|  |  | ||||||
|  | dnsmasq_configs: ["proxmox"] | ||||||
|  | dnsmasq_interfaces: ["vmbr0"] | ||||||
|  |  | ||||||
|  | # | ||||||
|  |  | ||||||
| iptables_apply_changes: false | iptables_apply_changes: false | ||||||
| iptables_configuration_template: iptables_proxmox.j2 | iptables_configuration_template: iptables_proxmox.j2 | ||||||
| iptables6_configuration_template: iptables6_proxmox.j2 | iptables6_configuration_template: iptables6_proxmox.j2 | ||||||
|   | |||||||
| @@ -4,3 +4,4 @@ | |||||||
|     - ansible-role-system |     - ansible-role-system | ||||||
|     - ansible-role-users |     - ansible-role-users | ||||||
|     - ansible-role-iptables |     - ansible-role-iptables | ||||||
|  |     - ansible-role-dnsmasq | ||||||
|   | |||||||
							
								
								
									
										5
									
								
								proxmox/templates/metadata.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								proxmox/templates/metadata.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | hostname: ${hostname} | ||||||
|  | instance-id: ${id} | ||||||
|  | instance-type: ${type} | ||||||
|  | region: ${region} | ||||||
|  | zone: ${zone} | ||||||
							
								
								
									
										23
									
								
								proxmox/templates/worker.patch.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								proxmox/templates/worker.patch.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | machine: | ||||||
|  |   kubelet: | ||||||
|  |     extraArgs: | ||||||
|  |       cloud-provider: external | ||||||
|  |       rotate-server-certificates: true | ||||||
|  |     clusterDNS: | ||||||
|  |       - 169.254.2.53 | ||||||
|  |       - ${cidrhost(split(",",serviceSubnets)[0], 10)} | ||||||
|  |   network: | ||||||
|  |     interfaces: | ||||||
|  |       - interface: dummy0 | ||||||
|  |         addresses: | ||||||
|  |           - 169.254.2.53/32 | ||||||
|  |     extraHostEntries: | ||||||
|  |       - ip: ${lbv4} | ||||||
|  |         aliases: | ||||||
|  |           - ${apiDomain} | ||||||
|  |   sysctls: | ||||||
|  |     net.core.somaxconn: 65535 | ||||||
|  |     net.core.netdev_max_backlog: 4096 | ||||||
|  | cluster: | ||||||
|  |   proxy: | ||||||
|  |     disabled: true | ||||||
| @@ -1,4 +1,10 @@ | |||||||
|  |  | ||||||
|  | variable "proxmox_domain" { | ||||||
|  |   description = "Proxmox host" | ||||||
|  |   type        = string | ||||||
|  |   default     = "example.com" | ||||||
|  | } | ||||||
|  |  | ||||||
| variable "proxmox_host" { | variable "proxmox_host" { | ||||||
|   description = "Proxmox host" |   description = "Proxmox host" | ||||||
|   type        = string |   type        = string | ||||||
| @@ -13,6 +19,7 @@ variable "proxmox_nodename" { | |||||||
| variable "proxmox_image" { | variable "proxmox_image" { | ||||||
|   description = "Proxmox source image name" |   description = "Proxmox source image name" | ||||||
|   type        = string |   type        = string | ||||||
|  |   default     = "talos" | ||||||
| } | } | ||||||
|  |  | ||||||
| variable "proxmox_storage" { | variable "proxmox_storage" { | ||||||
| @@ -20,11 +27,6 @@ variable "proxmox_storage" { | |||||||
|   type        = string |   type        = string | ||||||
| } | } | ||||||
|  |  | ||||||
| variable "proxmox_bridge" { |  | ||||||
|   description = "Proxmox bridge name" |  | ||||||
|   type        = string |  | ||||||
| } |  | ||||||
|  |  | ||||||
| variable "proxmox_token_id" { | variable "proxmox_token_id" { | ||||||
|   description = "Proxmox token id" |   description = "Proxmox token id" | ||||||
|   type        = string |   type        = string | ||||||
| @@ -35,6 +37,12 @@ variable "proxmox_token_secret" { | |||||||
|   type        = string |   type        = string | ||||||
| } | } | ||||||
|  |  | ||||||
|  | variable "region" { | ||||||
|  |   description = "Proxmox host" | ||||||
|  |   type        = string | ||||||
|  |   default     = "nova" | ||||||
|  | } | ||||||
|  |  | ||||||
| variable "kubernetes" { | variable "kubernetes" { | ||||||
|   type = map(string) |   type = map(string) | ||||||
|   default = { |   default = { | ||||||
| @@ -65,10 +73,39 @@ variable "controlplane" { | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| variable "worker" { | variable "instances" { | ||||||
|   description = "Property of worker" |   description = "Map of region's properties" | ||||||
|   type        = map(any) |   type        = map(any) | ||||||
|   default = { |   default = { | ||||||
|     count = 0, |     "node1" = { | ||||||
|  |       web_id       = 1000 | ||||||
|  |       web_count    = 0, | ||||||
|  |       web_cpu      = 2, | ||||||
|  |       web_mem      = 4096, | ||||||
|  |       worker_id    = 1050 | ||||||
|  |       worker_count = 0, | ||||||
|  |       worker_cpu   = 2, | ||||||
|  |       worker_mem   = 4096, | ||||||
|  |     }, | ||||||
|  |     "node2" = { | ||||||
|  |       web_id       = 2000 | ||||||
|  |       web_count    = 0, | ||||||
|  |       web_cpu      = 2, | ||||||
|  |       web_mem      = 4096, | ||||||
|  |       worker_id    = 2050 | ||||||
|  |       worker_count = 0, | ||||||
|  |       worker_cpu   = 2, | ||||||
|  |       worker_mem   = 4096, | ||||||
|  |     } | ||||||
|  |     "node3" = { | ||||||
|  |       web_id       = 3000 | ||||||
|  |       web_count    = 0, | ||||||
|  |       web_cpu      = 2, | ||||||
|  |       web_mem      = 4096, | ||||||
|  |       worker_id    = 3050 | ||||||
|  |       worker_count = 0, | ||||||
|  |       worker_cpu   = 2, | ||||||
|  |       worker_mem   = 4096, | ||||||
|  |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2,8 +2,12 @@ terraform { | |||||||
|   required_providers { |   required_providers { | ||||||
|     proxmox = { |     proxmox = { | ||||||
|       source  = "Telmate/proxmox" |       source  = "Telmate/proxmox" | ||||||
|       version = "~> 2.7.4" |       version = "~> 2.9.14" | ||||||
|     } |     } | ||||||
|  |     # proxmox = { | ||||||
|  |     #   source  = "bpg/proxmox" | ||||||
|  |     #   version = "0.17.0-rc1" | ||||||
|  |     # } | ||||||
|   } |   } | ||||||
|   required_version = ">= 1.0" |   required_version = ">= 1.0" | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								system_os/proxmox/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								system_os/proxmox/README.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | |||||||
|  | * https://developer.hashicorp.com/packer/plugins/builders/proxmox/iso | ||||||
|  | * https://github.com/Telmate/proxmox-api-go | ||||||
| @@ -2,7 +2,7 @@ | |||||||
| packer { | packer { | ||||||
|   required_plugins { |   required_plugins { | ||||||
|     proxmox = { |     proxmox = { | ||||||
|       version = ">= 1.0.1" |       version = ">= 1.1.2" | ||||||
|       source  = "github.com/hashicorp/proxmox" |       source  = "github.com/hashicorp/proxmox" | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| @@ -15,9 +15,9 @@ source "proxmox" "talos" { | |||||||
|   node                     = var.proxmox_nodename |   node                     = var.proxmox_nodename | ||||||
|   insecure_skip_tls_verify = true |   insecure_skip_tls_verify = true | ||||||
|  |  | ||||||
|   iso_file = "local:iso/archlinux-2021.10.01-x86_64.iso" |   iso_file = "local:iso/archlinux-2023.03.01-x86_64.iso" | ||||||
|   # iso_url          = "https://mirror.rackspace.com/archlinux/iso/2021.10.01/archlinux-2021.10.01-x86_64.iso" |   # iso_url          = "https://mirror.rackspace.com/archlinux/iso/2023.03.01/archlinux-2023.03.01-x86_64.iso" | ||||||
|   # iso_checksum     = "sha1:77a20dcd9d838398cebb2c7c15f46946bdc3855e" |   # iso_checksum     = "sha1:3ae7c83eca8bd698b4e54c49d43e8de5dc8a4456" | ||||||
|   # iso_storage_pool = "local" |   # iso_storage_pool = "local" | ||||||
|   unmount_iso = true |   unmount_iso = true | ||||||
|  |  | ||||||
| @@ -25,24 +25,39 @@ source "proxmox" "talos" { | |||||||
|   network_adapters { |   network_adapters { | ||||||
|     bridge   = "vmbr0" |     bridge   = "vmbr0" | ||||||
|     model    = "virtio" |     model    = "virtio" | ||||||
|  |     firewall = true | ||||||
|  |   } | ||||||
|  |   network_adapters { | ||||||
|  |     bridge = "vmbr1" | ||||||
|  |     model  = "virtio" | ||||||
|   } |   } | ||||||
|   disks { |   disks { | ||||||
|     type              = "scsi" |     type              = "scsi" | ||||||
|     storage_pool      = var.proxmox_storage |     storage_pool      = var.proxmox_storage | ||||||
|     storage_pool_type = var.proxmox_storage_type |     storage_pool_type = var.proxmox_storage_type | ||||||
|     format            = "raw" |     format            = "raw" | ||||||
|     disk_size         = "1G" |     disk_size         = "5G" | ||||||
|     cache_mode        = "writethrough" |     cache_mode        = "writethrough" | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   memory       = 2048 |   cpu_type = "host" | ||||||
|  |   memory   = 3072 | ||||||
|  |   vga { | ||||||
|  |     type = "serial0" | ||||||
|  |   } | ||||||
|  |   serials = ["socket"] | ||||||
|  |  | ||||||
|   ssh_username = "root" |   ssh_username = "root" | ||||||
|   ssh_password = "packer" |   ssh_password = "packer" | ||||||
|   ssh_timeout  = "15m" |   ssh_timeout  = "15m" | ||||||
|   qemu_agent   = true |   qemu_agent   = true | ||||||
|  |  | ||||||
|  |   ssh_bastion_host       = var.proxmox_host | ||||||
|  |   ssh_bastion_username   = "root" | ||||||
|  |   ssh_bastion_agent_auth = true | ||||||
|  |  | ||||||
|   template_name        = "talos" |   template_name        = "talos" | ||||||
|   template_description = "Talos system disk" |   template_description = "Talos system disk, version ${var.talos_version}" | ||||||
|  |  | ||||||
|   boot_wait = "15s" |   boot_wait = "15s" | ||||||
|   boot_command = [ |   boot_command = [ | ||||||
| @@ -68,7 +83,7 @@ build { | |||||||
|   sources = ["source.proxmox.talos"] |   sources = ["source.proxmox.talos"] | ||||||
|  |  | ||||||
|   provisioner "file" { |   provisioner "file" { | ||||||
|     source      = "../../../talos/_out/nocloud-amd64.raw.xz" |     source      = "nocloud-amd64.raw.xz" | ||||||
|     destination = "/tmp/talos.raw.xz" |     destination = "/tmp/talos.raw.xz" | ||||||
|   } |   } | ||||||
|   provisioner "shell" { |   provisioner "shell" { | ||||||
|   | |||||||
| @@ -25,7 +25,7 @@ variable "proxmox_storage_type" { | |||||||
|  |  | ||||||
| variable "talos_version" { | variable "talos_version" { | ||||||
|   type    = string |   type    = string | ||||||
|   default = "v1.3.3" |   default = "v1.3.6" | ||||||
| } | } | ||||||
|  |  | ||||||
| locals { | locals { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Serge Logvinov
					Serge Logvinov