From 5059720757807f03eaa9f16814d9d623768ab915 Mon Sep 17 00:00:00 2001 From: Philippe Caseiro Date: Thu, 2 Feb 2023 14:43:16 +0100 Subject: [PATCH] feat(module): adding Nebula module for OpenNebula virtual machine creation with a 'variable' --- modules/nebula/main.tf | 116 ++++++++++++++++++++++++++++++++++++++ modules/nebula/output.tf | 11 ++++ modules/nebula/version.tf | 9 +++ 3 files changed, 136 insertions(+) create mode 100644 modules/nebula/main.tf create mode 100644 modules/nebula/output.tf create mode 100644 modules/nebula/version.tf diff --git a/modules/nebula/main.tf b/modules/nebula/main.tf new file mode 100644 index 0000000..188c81a --- /dev/null +++ b/modules/nebula/main.tf @@ -0,0 +1,116 @@ +variable "vms" { + type = map + description = "Virtual Machines description" +} + +variable "image_driver" { + default = "qcow2" +} + +variable "image_format" { + default = "qcow2" +} + +variable "dev_prefix" { + default = "vd" +} + +variable "permissions" { + default = "600" +} + +variable "graphics" { + default = { + keymap = "fr" + listen = "0.0.0.0" + type = "VNC" + } + +} + +variable "one_prod_ds" { + default = "101" +} + +// system image +resource "opennebula_image" "system" { + for_each = var.vms + + name = "system-${each.key}.${each.value.domain}" + description = "System disk for ${each.key}" + datastore_id = var.one_prod_ds + path = "https://vulcain.cadoles.com/empty_20G" + persistent = each.value.system_image_persistent + driver = var.image_driver + format = var.image_format + dev_prefix = var.dev_prefix + permissions = var.permissions +} + +// data image +resource "opennebula_image" "data" { + for_each = var.vms + + name = "data-${each.key}.${each.value.domain}" + path = "https://vulcain.cadoles.com/empty_40G" + datastore_id = var.one_prod_ds + description = "data disk for ${each.key}" + persistent = each.value.data_image_persistent + driver = var.image_driver + format = var.image_format + dev_prefix = var.dev_prefix + permissions = var.permissions +} + +resource "opennebula_template" "vm_template" { + for_each = var.vms + + name = each.key + cpu = each.value.cpu + vcpu = each.value.vcpu + memory = each.value.ram + graphics { + keymap = var.graphics.keymap + listen = var.graphics.listen + type = var.graphics.type + } + context = { + SET_HOSTNAME = "$NAME" + DNS_HOSTNAME = "YES" + NETWORK = "YES" + SSH_PUBLIC_KEY = "$USER[SSH_PUBLIC_KEY]" + USERNAME = "root" + } + disk { + image_id = opennebula_image.system[each.key].id + } + disk { + image_id = opennebula_image.data[each.key].id + } + + os { + arch = "x86_64" + boot = "disk0,nic0" + } + //labels = var.tag_labels + + dynamic "nic" { + for_each = each.value.network_interfaces + + content { + network_id = nic.value.network_id + model = "virtio" + ip = nic.value.ip + } + } + permissions = var.permissions + depends_on = [ opennebula_image.system, + opennebula_image.data ] +} + +resource "opennebula_virtual_machine" "vm" { + for_each = var.vms + name = "${each.key}.${each.value.domain}" + template_id = opennebula_template.vm_template[each.key].id + depends_on = [ opennebula_template.vm_template ] +} diff --git a/modules/nebula/output.tf b/modules/nebula/output.tf new file mode 100644 index 0000000..d8a7919 --- /dev/null +++ b/modules/nebula/output.tf @@ -0,0 +1,11 @@ +output "shortnames" { + value = keys(var.vms) +} + +output "first_macs" { + value = opennebula_virtual_machine.vm //FIXME .template_nic[0].computed_mac +} + +output "virtual_machines" { + value = opennebula_virtual_machine.vm //template_nic[0].computed_mac) +} \ No newline at end of file diff --git a/modules/nebula/version.tf b/modules/nebula/version.tf new file mode 100644 index 0000000..4af80ce --- /dev/null +++ b/modules/nebula/version.tf @@ -0,0 +1,9 @@ +terraform { + required_providers { + opennebula = { + source = "OpenNebula/opennebula" + version = "~> 1.0" + } + } +} +