From e5598685f47112b2c09f5d49d404602785271f8d Mon Sep 17 00:00:00 2001 From: Iurii Anfinogenov Date: Mon, 4 May 2026 07:02:00 +0000 Subject: [PATCH] fix --- .codeassistant/mcp.json | 13 ++ .../vm.yml => infra/cloud-config/rocky.yml | 17 +- infra/locals.tf | 179 +++++++++++++++--- infra/main.tf | 5 - infra/variables.tf | 18 +- lab/cloud-config/{lab.yml => master.yml} | 0 lab/cloud-config/rocky.yml | 21 ++ .../vm.yml => lab/cloud-config/worker.yml | 2 +- lab/locals.tf | 165 ++++++++++++++-- lab/main.tf | 5 - lab/variables.tf | 18 +- 11 files changed, 334 insertions(+), 109 deletions(-) create mode 100644 .codeassistant/mcp.json rename lab/cloud-config/vm.yml => infra/cloud-config/rocky.yml (57%) rename lab/cloud-config/{lab.yml => master.yml} (100%) create mode 100644 lab/cloud-config/rocky.yml rename infra/cloud-config/vm.yml => lab/cloud-config/worker.yml (93%) diff --git a/.codeassistant/mcp.json b/.codeassistant/mcp.json new file mode 100644 index 0000000..7bf1ce1 --- /dev/null +++ b/.codeassistant/mcp.json @@ -0,0 +1,13 @@ +{ + "mcpServers": { + "sourcecraft": { + "type": "streamable-http", + "url": "https://api.sourcecraft.tech/mcp", + "disabled": false, + "headers": {}, + "disabledTools": [], + "timeout": 60, + "alwaysAllow": [] + } + } +} \ No newline at end of file diff --git a/lab/cloud-config/vm.yml b/infra/cloud-config/rocky.yml similarity index 57% rename from lab/cloud-config/vm.yml rename to infra/cloud-config/rocky.yml index d2d933a..7309db3 100644 --- a/lab/cloud-config/vm.yml +++ b/infra/cloud-config/rocky.yml @@ -1,11 +1,9 @@ #cloud-config -# vpn - timezone: Europe/Moscow users: - name: iurii - groups: [sudo] + groups: [wheel] shell: /bin/bash lock_passwd: false passwd: "$6$Zc8nwvtw0Kns5.sD$FpQ4aBSeGogefqjM4we4U5QQd4YBtC98tuG3rR4j9ZmbtC1kyFf2sY/IodYW3wG.U81aEntlZrtOTOqw3ZcOc0" @@ -20,15 +18,4 @@ packages: runcmd: - systemctl enable --now qemu-guest-agent - - hostnamectl set-hostname ${hostname} - - systemctl disable --now packagekit - - systemctl disable --now ModemManager - - systemctl disable --now multipathd - -write_files: - - path: /etc/motd - content: | - Managed by OpenTofu - - -final_message: "cloud-init finished" \ No newline at end of file + - hostnamectl set-hostname ${hostname} \ No newline at end of file diff --git a/infra/locals.tf b/infra/locals.tf index cc609e7..ad0b759 100644 --- a/infra/locals.tf +++ b/infra/locals.tf @@ -1,43 +1,160 @@ # nodes — описание виртуальных машин # +# Общая идея: +# - каждая VM может иметь несколько сетевых интерфейсов (network_devices) +# - каждый интерфейс полностью описывает свою сеть (bridge, VLAN, IP, gateway) +# - порядок элементов в network_devices важен: +# [0] → eth0 (основной интерфейс, обычно с default gateway) +# [1] → eth1 +# [2] → eth2 +# +# network_devices: +# - список сетевых интерфейсов VM +# +# поля: +# +# bridge: +# - имя Proxmox bridge (например vmbr0, vmbr1) +# - ОБЯЗАТЕЛЬНО +# # vlan_id: -# - опциональный параметр -# - если НЕ указан → VM будет в обычной сети (untagged, vmbr0) -# - если указан → VM попадет в соответствующий VLAN (например 20 → 192.168.20.0/24) +# - опционально +# - если НЕ указан → интерфейс untagged +# - если указан → интерфейс будет в VLAN (например 20 → зависит от настройки Proxmox bridge) +# +# ip: +# - IPv4 адрес без CIDR (например "192.168.20.11") +# - если не указан → будет использован DHCP (если доступен в сети) +# +# cidr: +# - маска сети (например 24) +# - используется вместе с ip → итог: ip/cidr +# +# gateway: +# - опционально +# - указывать ТОЛЬКО для одного интерфейса (обычно первого) +# - задаёт default route внутри VM +# +# ВАЖНО: +# - gateway должен быть только у одного интерфейса +# - порядок network_devices критичен (eth0, eth1 и т.д.) +# - неправильный порядок → потеря доступа к VM +# +# # cloudinit: # - опциональный параметр -# - указывает имя cloud-init файла для конкретной VM -# - файл должен находиться в root: cloud-config/<имя>.yml -# - если НЕ указан → используется "default.yml" -# - если файл НЕ найден в root → используется fallback из модуля (modules/node/cloud-config/default.yml) +# - имя cloud-init файла +# - ищется в: +# cloud-config/<имя>.yml (root) +# - если не найден → fallback: +# modules/node/cloud-config/default.yml # # пример: -# - cloudinit = "worker.yml" → будет использован cloud-config/worker.yml -# - cloudinit не задан → будет использован default.yml +# - cloudinit = "worker.yml" → cloud-config/worker.yml +# - не указан → default.yml +# +# +# пример одной сети (single NIC): +# +# network_devices = [ +# { +# bridge = "vmbr0" +# vlan_id = 20 +# ip = "192.168.20.11" +# cidr = 24 +# gateway = "192.168.20.1" +# } +# ] +# +# +# пример двух сетей: +# +# network_devices = [ +# { +# bridge = "vmbr0" +# vlan_id = 20 +# ip = "192.168.20.23" +# cidr = 24 +# gateway = "192.168.20.1" +# }, +# { +# bridge = "vmbr1" +# ip = "192.168.22.26" +# cidr = 24 +# } +# ] +# +# +# РЕКОМЕНДАЦИИ: +# - первый интерфейс (eth0) → management сеть +# - второй интерфейс → storage / overlay / secondary +# - не задавать gateway на вторичных интерфейсах +# +# +# ПОВЕДЕНИЕ: +# - ip_config генерируется автоматически из network_devices +# - соответствие: порядок массива = порядок интерфейсов +# locals { nodes = { - # sing-box-tun= { - # cloudinit = "vm.yml" - # index = 2 - # cpu = 1 - # memory = 2048 - # disk = 7 - # datastore = "local-lvm" - # ip_offset = 0 - # ip = "192.168.22.50" - # } - - lesson= { - cloudinit = "vm.yml" - index = 2 - cpu = 2 - memory = 2048 - disk = 7 - datastore = "local-lvm" - ip_offset = 0 - ip = "192.168.22.52" - } + k8s-master-1 = { + cloudinit = "rocky.yml" + image_file = "import/rocky9.qcow2" + index = 1 + cpu = var.worker_cpu + memory = 4092 + disk = var.worker_disk + datastore = var.worker_datastore + network_devices = [ + { + bridge = var.node_bridge + vlan_id = 20 + ip = "192.168.20.11" + cidr = 24 + gateway = "192.168.20.1" + } + ] + } + # k8s-worker-1 = { + # cloudinit = "worker.yml" + # index = 2 + # cpu = var.worker_cpu + # memory = 8192 + # disk = var.worker_disk + # datastore = var.worker_datastore + + # network_devices = [ + # { + # bridge = var.node_bridge + # vlan_id = 20 + # ip = "192.168.20.22" + # cidr = 24 + # gateway = "192.168.20.1" + # } + # ] + # }, + # k8s-worker-2 = { + # cloudinit = "worker.yml" + # index = 3 + # cpu = var.worker_cpu + # memory = 8192 + # disk = var.worker_disk + # datastore = var.worker_datastore + + # network_devices = [ + # { + # bridge = var.node_bridge + # vlan_id = 20 + # ip = "192.168.20.23" + # cidr = 24 + # gateway = "192.168.20.1" + # }, + # { + # bridge = "vmbr0" + # } + # ] + # } } -} +} \ No newline at end of file diff --git a/infra/main.tf b/infra/main.tf index beb3713..f57953d 100644 --- a/infra/main.tf +++ b/infra/main.tf @@ -8,7 +8,6 @@ module "cluster" { nodes = local.nodes ssh_key = trimspace(data.local_file.ssh_key.content) - cluster_ip_start = var.cluster_ip_start worker_vmid_start = var.worker_vmid_start cloudinit_datastore = var.cloudinit_datastore @@ -19,9 +18,5 @@ module "cluster" { image_file = var.image_file disk_interface = var.disk_interface - network_base = var.network_base - network_cidr = var.network_cidr - cluster_gateway = var.cluster_gateway - data_datastore = var.data_datastore } diff --git a/infra/variables.tf b/infra/variables.tf index 7929429..2ded399 100644 --- a/infra/variables.tf +++ b/infra/variables.tf @@ -41,23 +41,6 @@ variable "worker_disk" { default = 20 } -variable "network_base" { - default = "192.168.22" -} - -variable "network_cidr" { - default = "24" -} - -variable "cluster_gateway" { - default = "192.168.22.1" -} - -variable "cluster_ip_start" { - default = 10 -} - - variable "worker_ip_offset" { default = 5 } @@ -66,6 +49,7 @@ variable "node_bridge" { default = "vmbr0" } + variable "worker_datastore" { type = string default = "local-lvm" diff --git a/lab/cloud-config/lab.yml b/lab/cloud-config/master.yml similarity index 100% rename from lab/cloud-config/lab.yml rename to lab/cloud-config/master.yml diff --git a/lab/cloud-config/rocky.yml b/lab/cloud-config/rocky.yml new file mode 100644 index 0000000..7309db3 --- /dev/null +++ b/lab/cloud-config/rocky.yml @@ -0,0 +1,21 @@ +#cloud-config +timezone: Europe/Moscow + +users: + - name: iurii + groups: [wheel] + shell: /bin/bash + lock_passwd: false + passwd: "$6$Zc8nwvtw0Kns5.sD$FpQ4aBSeGogefqjM4we4U5QQd4YBtC98tuG3rR4j9ZmbtC1kyFf2sY/IodYW3wG.U81aEntlZrtOTOqw3ZcOc0" + sudo: ["ALL=(ALL) NOPASSWD:ALL"] + ssh_authorized_keys: + - ${ssh_key} + +package_update: true + +packages: + - qemu-guest-agent + +runcmd: + - systemctl enable --now qemu-guest-agent + - hostnamectl set-hostname ${hostname} \ No newline at end of file diff --git a/infra/cloud-config/vm.yml b/lab/cloud-config/worker.yml similarity index 93% rename from infra/cloud-config/vm.yml rename to lab/cloud-config/worker.yml index d2d933a..d77615e 100644 --- a/infra/cloud-config/vm.yml +++ b/lab/cloud-config/worker.yml @@ -1,5 +1,5 @@ #cloud-config -# vpn +# Создать passwd hash: openssl passwd -6 timezone: Europe/Moscow diff --git a/lab/locals.tf b/lab/locals.tf index cec4421..ad0b759 100644 --- a/lab/locals.tf +++ b/lab/locals.tf @@ -1,31 +1,160 @@ # nodes — описание виртуальных машин # +# Общая идея: +# - каждая VM может иметь несколько сетевых интерфейсов (network_devices) +# - каждый интерфейс полностью описывает свою сеть (bridge, VLAN, IP, gateway) +# - порядок элементов в network_devices важен: +# [0] → eth0 (основной интерфейс, обычно с default gateway) +# [1] → eth1 +# [2] → eth2 +# +# network_devices: +# - список сетевых интерфейсов VM +# +# поля: +# +# bridge: +# - имя Proxmox bridge (например vmbr0, vmbr1) +# - ОБЯЗАТЕЛЬНО +# # vlan_id: -# - опциональный параметр -# - если НЕ указан → VM будет в обычной сети (untagged, vmbr0) -# - если указан → VM попадет в соответствующий VLAN (например 20 → 192.168.20.0/24) +# - опционально +# - если НЕ указан → интерфейс untagged +# - если указан → интерфейс будет в VLAN (например 20 → зависит от настройки Proxmox bridge) +# +# ip: +# - IPv4 адрес без CIDR (например "192.168.20.11") +# - если не указан → будет использован DHCP (если доступен в сети) +# +# cidr: +# - маска сети (например 24) +# - используется вместе с ip → итог: ip/cidr +# +# gateway: +# - опционально +# - указывать ТОЛЬКО для одного интерфейса (обычно первого) +# - задаёт default route внутри VM +# +# ВАЖНО: +# - gateway должен быть только у одного интерфейса +# - порядок network_devices критичен (eth0, eth1 и т.д.) +# - неправильный порядок → потеря доступа к VM +# +# # cloudinit: # - опциональный параметр -# - указывает имя cloud-init файла для конкретной VM -# - файл должен находиться в root: cloud-config/<имя>.yml -# - если НЕ указан → используется "default.yml" -# - если файл НЕ найден в root → используется fallback из модуля (modules/node/cloud-config/default.yml) +# - имя cloud-init файла +# - ищется в: +# cloud-config/<имя>.yml (root) +# - если не найден → fallback: +# modules/node/cloud-config/default.yml # # пример: -# - cloudinit = "worker.yml" → будет использован cloud-config/worker.yml -# - cloudinit не задан → будет использован default.yml +# - cloudinit = "worker.yml" → cloud-config/worker.yml +# - не указан → default.yml +# +# +# пример одной сети (single NIC): +# +# network_devices = [ +# { +# bridge = "vmbr0" +# vlan_id = 20 +# ip = "192.168.20.11" +# cidr = 24 +# gateway = "192.168.20.1" +# } +# ] +# +# +# пример двух сетей: +# +# network_devices = [ +# { +# bridge = "vmbr0" +# vlan_id = 20 +# ip = "192.168.20.23" +# cidr = 24 +# gateway = "192.168.20.1" +# }, +# { +# bridge = "vmbr1" +# ip = "192.168.22.26" +# cidr = 24 +# } +# ] +# +# +# РЕКОМЕНДАЦИИ: +# - первый интерфейс (eth0) → management сеть +# - второй интерфейс → storage / overlay / secondary +# - не задавать gateway на вторичных интерфейсах +# +# +# ПОВЕДЕНИЕ: +# - ip_config генерируется автоматически из network_devices +# - соответствие: порядок массива = порядок интерфейсов +# locals { nodes = { - vm1 = { - cloudinit = "vm.yml" + k8s-master-1 = { + cloudinit = "rocky.yml" + image_file = "import/rocky9.qcow2" index = 1 - cpu = 1 - memory = 1024 + cpu = var.worker_cpu + memory = 4092 disk = var.worker_disk datastore = var.worker_datastore - ip_offset = 0 - vlan_id = 20 - } - } -} + + network_devices = [ + { + bridge = var.node_bridge + vlan_id = 20 + ip = "192.168.20.11" + cidr = 24 + gateway = "192.168.20.1" + } + ] + } + # k8s-worker-1 = { + # cloudinit = "worker.yml" + # index = 2 + # cpu = var.worker_cpu + # memory = 8192 + # disk = var.worker_disk + # datastore = var.worker_datastore + + # network_devices = [ + # { + # bridge = var.node_bridge + # vlan_id = 20 + # ip = "192.168.20.22" + # cidr = 24 + # gateway = "192.168.20.1" + # } + # ] + # }, + # k8s-worker-2 = { + # cloudinit = "worker.yml" + # index = 3 + # cpu = var.worker_cpu + # memory = 8192 + # disk = var.worker_disk + # datastore = var.worker_datastore + + # network_devices = [ + # { + # bridge = var.node_bridge + # vlan_id = 20 + # ip = "192.168.20.23" + # cidr = 24 + # gateway = "192.168.20.1" + # }, + # { + # bridge = "vmbr0" + # } + # ] + # } + } +} \ No newline at end of file diff --git a/lab/main.tf b/lab/main.tf index beb3713..f57953d 100644 --- a/lab/main.tf +++ b/lab/main.tf @@ -8,7 +8,6 @@ module "cluster" { nodes = local.nodes ssh_key = trimspace(data.local_file.ssh_key.content) - cluster_ip_start = var.cluster_ip_start worker_vmid_start = var.worker_vmid_start cloudinit_datastore = var.cloudinit_datastore @@ -19,9 +18,5 @@ module "cluster" { image_file = var.image_file disk_interface = var.disk_interface - network_base = var.network_base - network_cidr = var.network_cidr - cluster_gateway = var.cluster_gateway - data_datastore = var.data_datastore } diff --git a/lab/variables.tf b/lab/variables.tf index 7929429..2ded399 100644 --- a/lab/variables.tf +++ b/lab/variables.tf @@ -41,23 +41,6 @@ variable "worker_disk" { default = 20 } -variable "network_base" { - default = "192.168.22" -} - -variable "network_cidr" { - default = "24" -} - -variable "cluster_gateway" { - default = "192.168.22.1" -} - -variable "cluster_ip_start" { - default = 10 -} - - variable "worker_ip_offset" { default = 5 } @@ -66,6 +49,7 @@ variable "node_bridge" { default = "vmbr0" } + variable "worker_datastore" { type = string default = "local-lvm"