deploy first 3 node to pve
This commit is contained in:
+18
@@ -0,0 +1,18 @@
|
||||
# This file is maintained automatically by "terraform init".
|
||||
# Manual edits may be lost in future updates.
|
||||
|
||||
provider "registry.terraform.io/bpg/proxmox" {
|
||||
version = "0.114.0"
|
||||
constraints = "~> 0.114"
|
||||
hashes = [
|
||||
"h1:TyMVdaMr3Qd/EHcoyEqRZ4D9wqaoqHN/segKFpNZnM8=",
|
||||
]
|
||||
}
|
||||
|
||||
provider "registry.terraform.io/hashicorp/local" {
|
||||
version = "2.9.1"
|
||||
constraints = "~> 2.5"
|
||||
hashes = [
|
||||
"h1:OZGJN0LSSat5QIxZPxDXtVr4XpHb2oG7cVKJhSqBFIE=",
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
module "vm" {
|
||||
source = "../../modules/proxmox-vm"
|
||||
for_each = var.vms
|
||||
|
||||
name = each.key
|
||||
vm_id = var.vm_id_base + tonumber(split(".", each.value.ip)[3])
|
||||
node_name = var.proxmox.node_name
|
||||
template_vm_id = var.proxmox.template_vm_id
|
||||
pool_id = var.proxmox.pool_id
|
||||
datastore_id = var.proxmox.datastore_id
|
||||
bridge = var.proxmox.bridge
|
||||
|
||||
cores = each.value.cores
|
||||
memory = each.value.memory
|
||||
os_disk_size = each.value.os_disk_size
|
||||
osd_disks = each.value.osd_disks
|
||||
osd_disk_size = each.value.osd_disk_size
|
||||
|
||||
ipv4_address = "${each.value.ip}/${var.network.prefix}"
|
||||
ipv4_gateway = var.network.gateway
|
||||
dns_servers = var.network.dns_servers
|
||||
|
||||
ssh_user = var.ssh.user
|
||||
ssh_public_keys = [trimspace(file(pathexpand(var.ssh.public_key_file)))]
|
||||
|
||||
tags = concat(["ceph-course", var.install_name], each.value.roles)
|
||||
}
|
||||
|
||||
locals {
|
||||
roles = sort(distinct(flatten([for vm in var.vms : vm.roles])))
|
||||
|
||||
# Роли из tfvars превращаются в группы Ansible, а дальше в labels cephadm
|
||||
inventory = {
|
||||
all = {
|
||||
vars = {
|
||||
ansible_user = var.ssh.user
|
||||
}
|
||||
children = merge(
|
||||
{
|
||||
ceph = {
|
||||
hosts = { for name, vm in module.vm : name => { ansible_host = vm.ipv4 } }
|
||||
}
|
||||
},
|
||||
{
|
||||
for role in local.roles : role => {
|
||||
hosts = { for name, vm in var.vms : name => null if contains(vm.roles, role) }
|
||||
}
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
resource "local_file" "inventory" {
|
||||
filename = "${path.root}/../../../ansible/inventories/${var.install_name}/hosts.yml"
|
||||
content = "# Сгенерировано Terraform (terraform/envs/${var.install_name}), не редактировать вручную\n${yamlencode(local.inventory)}"
|
||||
file_permission = "0644"
|
||||
directory_permission = "0755"
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
output "vms" {
|
||||
value = { for name, vm in module.vm : name => { vm_id = vm.vm_id, ip = vm.ipv4 } }
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
# Установка 1: три узла, на каждом все роли, одна сеть
|
||||
install_name = "install-1"
|
||||
|
||||
proxmox = {
|
||||
node_name = "pve1"
|
||||
template_vm_id = 9000
|
||||
pool_id = "ceph-course"
|
||||
datastore_id = "zfs1"
|
||||
bridge = "vmbr0"
|
||||
}
|
||||
|
||||
network = {
|
||||
prefix = 24
|
||||
gateway = "192.168.3.1"
|
||||
dns_servers = ["192.168.3.1"]
|
||||
}
|
||||
|
||||
# 192.168.3.201 -> VMID 3201
|
||||
vm_id_base = 3000
|
||||
|
||||
ssh = {
|
||||
user = "aprokopenko"
|
||||
public_key_file = "~/.ssh/aprokopenko_ed25519.pub"
|
||||
}
|
||||
|
||||
vms = {
|
||||
"i1-node-01" = { ip = "192.168.3.201", cores = 4, memory = 10240, osd_disks = 3, roles = ["mon", "mgr", "osd", "rgw", "mds"] }
|
||||
"i1-node-02" = { ip = "192.168.3.202", cores = 4, memory = 10240, osd_disks = 3, roles = ["mon", "mgr", "osd", "rgw", "mds"] }
|
||||
"i1-node-03" = { ip = "192.168.3.203", cores = 4, memory = 10240, osd_disks = 3, roles = ["mon", "mgr", "osd", "rgw", "mds"] }
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
variable "install_name" {
|
||||
description = "Имя установки, используется в тегах и пути к inventory"
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "proxmox" {
|
||||
type = object({
|
||||
node_name = string
|
||||
template_vm_id = number
|
||||
pool_id = string
|
||||
datastore_id = string
|
||||
bridge = string
|
||||
})
|
||||
}
|
||||
|
||||
variable "network" {
|
||||
type = object({
|
||||
prefix = number
|
||||
gateway = string
|
||||
dns_servers = list(string)
|
||||
})
|
||||
}
|
||||
|
||||
variable "vm_id_base" {
|
||||
description = "VMID = vm_id_base + последний октет IP"
|
||||
type = number
|
||||
}
|
||||
|
||||
variable "ssh" {
|
||||
type = object({
|
||||
user = string
|
||||
public_key_file = string
|
||||
})
|
||||
}
|
||||
|
||||
variable "vms" {
|
||||
description = "Топология установки: ВМ, их ресурсы и роли Ceph"
|
||||
type = map(object({
|
||||
ip = string
|
||||
cores = number
|
||||
memory = number
|
||||
os_disk_size = optional(number, 40)
|
||||
osd_disks = optional(number, 0)
|
||||
osd_disk_size = optional(number, 40)
|
||||
roles = list(string)
|
||||
}))
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
terraform {
|
||||
required_version = ">= 1.9"
|
||||
|
||||
required_providers {
|
||||
proxmox = {
|
||||
source = "bpg/proxmox"
|
||||
version = "~> 0.114"
|
||||
}
|
||||
local = {
|
||||
source = "hashicorp/local"
|
||||
version = "~> 2.5"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Адрес и токен берутся из окружения:
|
||||
# PROXMOX_VE_ENDPOINT=https://<pve1>:8006/
|
||||
# PROXMOX_VE_API_TOKEN='terraform@pve!tf=<секрет>'
|
||||
provider "proxmox" {
|
||||
insecure = true
|
||||
}
|
||||
Reference in New Issue
Block a user