14 Commits

Author SHA1 Message Date
b209942b3d fix(module): updating default group creation for virtualMachine 2023-01-20 13:54:37 +01:00
f821f97b9e fix(module): updating default vm template for virtualMachine 2023-01-20 13:51:11 +01:00
e42ce275c1 fix(module): adding default values for virtualMachine variables 2023-01-20 13:45:40 +01:00
6a9181d1b4 fix(module): correct default value for imagemode 2023-01-20 13:34:05 +01:00
e07fd1c49d fix(module): adding missing file 2023-01-20 13:32:35 +01:00
f2864ecc84 fix(module): update output with local variable instead of variable 2023-01-20 13:29:50 +01:00
55a9334df3 fix(module): remove unused variable vm_fqdn 2023-01-20 13:27:51 +01:00
97624cb42d fix(module): fix local variable usage in forbiden place 2023-01-20 13:24:52 +01:00
e8140d8b3f fix(module): fix variable usage in forbiden place 2023-01-20 13:20:52 +01:00
9f05f09e5d fix(module): updating default values on virtualMachine 2023-01-20 13:18:20 +01:00
4a676480fb fix(module): fixing provider source for OpenNebula on virtualMachine 2023-01-19 15:40:19 +01:00
911486e0e0 fix(module): adding missing variable to virtualMachine 2023-01-19 15:19:55 +01:00
65b95c56a1 feat(module): adding virtualMachine module
This module gives you the ability to create virual machines on
OpenNebula

Extracted from "Cadoles v2 Production project"
2023-01-19 14:15:52 +01:00
2185af67c5 feat(module): adding DNS module
This module create entries on a DNS Server with DNSUPDATE.

extracted from "Cadoles Production v2 project"
2023-01-19 14:14:52 +01:00
8 changed files with 295 additions and 0 deletions

View File

@ -0,0 +1,28 @@
// Dependencies management
resource "null_resource" "depends_on" {
triggers = {
depends_on = join("", var.depends)
}
}
resource "dns_a_record_set" "a_records" {
for_each = var.dns_a_records
zone = var.dns_domain
name = each.key
ttl = 300
addresses = each.value
depends_on = [ null_resource.depends_on ]
}
resource "dns_cname_record" "cname_records" {
for_each = var.dns_cname_records
zone = var.dns_domain
name = each.key
cname = each.value
ttl = 300
depends_on = [ null_resource.depends_on ]
}

View File

View File

@ -0,0 +1,23 @@
variable "dns_domain" {
description = "DNS Domain name (FQDN)"
type = string
default = "cadoles.com."
}
variable "dns_a_records" {
description = "List of dns A records to create"
type = map
default = {}
}
variable "dns_cname_records" {
description = "List of CNAME entires"
type = map
default = {}
}
variable "depends" {
description = "List of output_variables for dependences management"
type = list
default = []
}

View File

@ -0,0 +1,6 @@
locals {
fqdn = "${var.vm_shortname}.${var.vm_domain}"
system_image_name = "system.${local.fqdn}"
system_image_source = var.system_image_source
data_image_name = "data.${local.fqdn}"
}

View File

@ -0,0 +1,109 @@
resource "opennebula_group" "main" {
name = var.group
}
// OpenNebula disk image !
resource "opennebula_image" "system" {
name = local.system_image_name
description = "System disk image"
datastore_id = var.one_prod_ds
persistent = false
//lock = "MANAGE"
path = var.system_image_source
dev_prefix = "vd"
driver = "qcow2"
format = "qcow2"
permissions = var.imagemode
group = var.group
}
resource "opennebula_image" "data" {
name = local.data_image_name
description = "Data disk image"
datastore_id = var.one_prod_ds
persistent = true
//lock = "MANAGE"
path = var.data_image_source
dev_prefix = "vd"
driver = "qcow2"
format = "qcow2"
permissions = "660"
group = var.group
}
// OpenNebula (VM) Template definition
resource "opennebula_template" "vm_template" {
name = var.vm_shortname
cpu = var.cpu
vcpu = var.vcpu
memory = var.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.id
}
disk {
image_id = opennebula_image.data.id
}
os {
arch = "x86_64"
boot = "disk0,nic0"
}
//labels = var.tag_labels
dynamic "nic" {
for_each = var.network_interfaces
content {
network_id = nic.value.network_id
model = "virtio"
ip = nic.value.ip
}
}
permissions = "600"
group = var.group
depends_on = [ opennebula_image.system,
opennebula_image.data ]
}
// OpenNebula Virtual Machine
resource "opennebula_virtual_machine" "vm" {
name = local.fqdn
group = var.group
template_id = opennebula_template.vm_template.id
depends_on = [ opennebula_template.vm_template ]
}
resource "dns_a_record_set" "vm_dns_a_record" {
count = var.dns_a_record == "yes" ? 1 : 0
zone = var.vm_domain
name = var.vm_shortname
ttl = 300
addresses = [ var.network_interfaces[0].ip ]
depends_on = [ opennebula_virtual_machine.vm ]
}
resource "dns_cname_record" "vm_dns_cname_record" {
for_each = var.dns_cname_record
zone = var.vm_domain
name = each.value
cname = "${local.fqdn}."
ttl = 300
depends_on = [ opennebula_virtual_machine.vm ]
}

View File

@ -0,0 +1,15 @@
output "shortname" {
value = opennebula_virtual_machine.vm.name
}
output "fqdn" {
value = local.fqdn
}
output "first_nic_mac" {
value = opennebula_virtual_machine.vm.template_nic[0].computed_mac
}
output "network_interfaces" {
value = var.network_interfaces
}

View File

@ -0,0 +1,99 @@
variable "one_user" {
description = "OpenNebula user"
type = string
}
variable "one_prod_ds" {
description = "ID du Datastore de production"
type = string
}
variable "vm_shortname" {
description = "Virtual machine short name"
type = string
}
variable "vm_domain" {
description = "Full qualified dns domain name"
type = string
}
variable "system_image_source" {
description = "Virtual Machine system image source"
type = string
default = "https://marketplace.opennebula.io//appliance/251b0578-6c47-4ba4-b184-dc6e873201a2/download/0"
}
variable "data_image_source" {
description = "Virtual Machine data disk image source"
type = string
default = "https://marketplace.opennebula.io//appliance/251b0578-6c47-4ba4-b184-dc6e873201a2/download/0"
}
variable "tag_labels" {
description = "Labels"
type = string
}
variable "network_interfaces" {
description = "Network interfaces"
type = list
}
variable "cpu" {
description = "VM CPU"
type = string
default = "0.2"
}
variable "vcpu" {
description = "VM vCPU"
type = string
default = "2"
}
variable "ram" {
description = "VM RAM"
type = string
default = "512"
}
variable "depends" {
description = "List of output_variables for dependences management"
type = list
default = []
}
variable "dns_a_record" {
description = "Create a dns A record (yes/no)"
type = string
default = "no"
}
variable "dns_cname_record" {
description = "List of CNAME for A entry"
type = map(string)
default = {}
}
variable "group" {
description = "Group (owner group)"
type = string
default = "production"
}
variable "graphics" {
description = "Graphics declaration"
type = map(string)
default = {
keymap = "fr"
listen = "0.0.0.0"
type = "VNC"
}
}
variable "imagemode" {
description = "Disk image mode"
type = string
default = "600"
}

View File

@ -0,0 +1,15 @@
terraform {
required_providers {
dns = {
source = "hashicorp/dns"
}
null = {
source = "hashicorp/null"
}
opennebula = {
source = "OpenNebula/opennebula"
version = "~> 1.0"
}
}
required_version = ">= 0.13"
}