mirror of
https://github.com/kubernetes-sigs/kubespray.git
synced 2026-10-30 06:13:29 -02:30
97 lines
3.7 KiB
Terraform
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
|
|
}
|