Init commit

This commit is contained in:
Iurii Anfinogenov
2026-04-13 17:48:41 +00:00
parent 815cdc5c14
commit e40ee15da1
32 changed files with 2476 additions and 58 deletions

View File

@@ -0,0 +1,34 @@
#cloud-config
# Создать passwd hash: openssl passwd -6
timezone: Europe/Moscow
users:
- name: ubuntu
groups: [sudo]
shell: /bin/bash
lock_passwd: false
passwd: "$6$M8xzsYT0lwWjlcdH$HJRhw0rBb2WowCbqg03/WvMUlte0j5SLs9tAVCxCukEqWAt7XG0ceWYc5GRUBmRxFRTbcEDrdCVTXu5jIxN2f0"
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}
- 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"

34
lab/cloud-config/vm.yml Normal file
View File

@@ -0,0 +1,34 @@
#cloud-config
# vpn
timezone: Europe/Moscow
users:
- name: iurii
groups: [sudo]
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}
- 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"

31
lab/locals.tf Normal file
View File

@@ -0,0 +1,31 @@
# nodes — описание виртуальных машин
#
# vlan_id:
# - опциональный параметр
# - если НЕ указан → VM будет в обычной сети (untagged, vmbr0)
# - если указан → VM попадет в соответствующий VLAN (например 20 → 192.168.20.0/24)
# cloudinit:
# - опциональный параметр
# - указывает имя cloud-init файла для конкретной VM
# - файл должен находиться в root: cloud-config/<имя>.yml
# - если НЕ указан → используется "default.yml"
# - если файл НЕ найден в root → используется fallback из модуля (modules/node/cloud-config/default.yml)
#
# пример:
# - cloudinit = "worker.yml" → будет использован cloud-config/worker.yml
# - cloudinit не задан → будет использован default.yml
locals {
nodes = {
vm1 = {
cloudinit = "vm.yml"
index = 1
cpu = 1
memory = 1024
disk = var.worker_disk
datastore = var.worker_datastore
ip_offset = 0
vlan_id = 20
}
}
}

27
lab/main.tf Normal file
View File

@@ -0,0 +1,27 @@
data "local_file" "ssh_key" {
filename = pathexpand("~/.ssh/id_rsa.pub")
}
module "cluster" {
source = "../modules/node"
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
proxmox_node = var.proxmox_node
node_bridge = var.node_bridge
image_datastore = var.image_datastore
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
}

13
lab/outputs.tf Normal file
View File

@@ -0,0 +1,13 @@
output "nodes_ipv4" {
value = module.cluster.ip_addresses
}
output "nodes_hostnames" {
value = module.cluster.hostnames
}
output "nodes_vmid" {
value = module.cluster.vmids
}

20
lab/providers.tf Normal file
View File

@@ -0,0 +1,20 @@
terraform {
required_providers {
proxmox = {
source = "registry.opentofu.org/bpg/proxmox"
version = "= 0.101.1"
}
}
}
provider "proxmox" {
endpoint = var.proxmox_endpoint
api_token = "${var.proxmox_token_id}=${var.proxmox_token_secret}"
insecure = true
ssh {
username = "root"
agent = true
private_key = file(pathexpand("~/.ssh/id_rsa"))
}
}

86
lab/variables.tf Normal file
View File

@@ -0,0 +1,86 @@
variable "proxmox_endpoint" {}
variable "proxmox_token_id" {}
variable "proxmox_token_secret" {}
variable "proxmox_node" {
type = string
default = "ve"
}
variable "cloudinit_datastore" {
type = string
default = "local"
}
variable "disk_interface" {
type = string
default = "virtio0"
}
variable "image_datastore" {
type = string
default = "local"
}
variable "image_file" {
type = string
default = "import/ubuntu-24.qcow2"
}
variable "worker_cpu" {
default = 2
}
variable "worker_memory" {
default = 2048
}
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
}
variable "node_bridge" {
default = "vmbr0"
}
variable "worker_datastore" {
type = string
default = "local-lvm"
}
variable "worker_vmid_start" {
type = number
default = 3000
}
variable "data_datastore" {
type = string
default = "data1"
description = "Datastore for VM data disks"
}