60 lines
1.9 KiB
Terraform
60 lines
1.9 KiB
Terraform
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"
|
|
}
|