Files

97 lines
3.7 KiB
Terraform

provider "opennebula" {
# Credentials/endpoint fall back to the OPENNEBULA_* environment variables
# when the corresponding variable is left empty.
endpoint = var.one_endpoint != "" ? var.one_endpoint : null
username = var.one_username != "" ? var.one_username : null
password = var.one_password != "" ? var.one_password : null
insecure = var.one_insecure
}
data "opennebula_template" "node" {
name = var.template_name
lifecycle {
precondition {
condition = length([
for machine in local.machines : machine if machine.node_type == "master"
]) > 0
error_message = "Define at least one control-plane node: set master_count >= 1 or add a machines entry with node_type \"master\"."
}
}
}
data "opennebula_virtual_network" "network" {
name = var.network_name
}
locals {
# Effective node set: the explicit machines map wins; otherwise it is
# generated from master_count/worker_count (master-0.., worker-0..).
machines = length(var.machines) > 0 ? var.machines : merge(
{ for i in range(var.master_count) : "master-${i}" => { node_type = "master", ip = "" } },
{ for i in range(var.worker_count) : "worker-${i}" => { node_type = "worker", ip = "" } },
)
# The provider's data source flattens template disks that reference their
# image by name (IMAGE=) as image_id = -1; treat that sentinel as unusable.
template_disk_image_id = try(data.opennebula_template.node.disk[0].image_id, -1) >= 0 ? data.opennebula_template.node.disk[0].image_id : null
# Preserve the template's DISK-level SIZE override when the OS disk has to
# be re-declared (0 = no override, use the image's size)
template_disk_size = try(data.opennebula_template.node.disk[0].size, 0)
}
module "kubernetes" {
source = "./modules/kubernetes-cluster"
prefix = var.prefix
machines = local.machines
template_id = data.opennebula_template.node.id
template_disk_image_id = local.template_disk_image_id
template_disk_size = local.template_disk_size
network_id = data.opennebula_virtual_network.network.id
## Master ##
master_cpu = var.master_cpu
master_vcpu = var.master_vcpu
master_memory = var.master_memory
master_disk_size = var.master_disk_size
## Worker ##
worker_cpu = var.worker_cpu
worker_vcpu = var.worker_vcpu
worker_memory = var.worker_memory
worker_disk_size = var.worker_disk_size
## OpenNebula extras ##
additional_disk_size = var.additional_disk_size
image_datastore_name = var.image_datastore_name
masters_anti_affinity = var.masters_anti_affinity
network_reservation_size = var.network_reservation_size
network_reservation_first_ip = var.network_reservation_first_ip
network_reservation_ar_id = var.network_reservation_ar_id
ssh_public_keys = var.ssh_public_keys
vm_create_timeout = var.vm_create_timeout
}
#
# Generate ansible inventory
#
resource "local_file" "inventory" {
content = templatefile("${path.module}/templates/inventory.tpl", {
connection_strings_master = join("\n", formatlist("%s ansible_user=${var.ansible_user} ansible_host=%s ip=%s etcd_member_name=etcd%d",
keys(module.kubernetes.master_ip),
values(module.kubernetes.master_ip),
values(module.kubernetes.master_ip),
range(1, length(module.kubernetes.master_ip) + 1))),
connection_strings_worker = join("\n", formatlist("%s ansible_user=${var.ansible_user} ansible_host=%s ip=%s",
keys(module.kubernetes.worker_ip),
values(module.kubernetes.worker_ip),
values(module.kubernetes.worker_ip))),
list_master = join("\n", keys(module.kubernetes.master_ip)),
list_worker = join("\n", keys(module.kubernetes.worker_ip))
})
filename = var.inventory_file
}