terraform template libvirt

Signed-off-by: Malte Poll <mp@edgeless.systems>
This commit is contained in:
Malte Poll 2022-05-22 15:39:30 +02:00 committed by Malte Poll
parent 869448c3e1
commit ff657a2ee7
8 changed files with 267 additions and 0 deletions

View file

@ -0,0 +1,24 @@
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="os">
<os firmware="efi">
<xsl:apply-templates select="@*|node()"/>
</os>
</xsl:template>
<xsl:template match="/domain/devices/tpm/backend">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
<xsl:element name ="active_pcr_banks">
<xsl:element name="sha1"></xsl:element>
<xsl:element name="sha256"></xsl:element>
<xsl:element name="sha384"></xsl:element>
<xsl:element name="sha512"></xsl:element>
</xsl:element>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

View file

@ -0,0 +1,72 @@
terraform {
required_providers {
libvirt = {
source = "dmacvicar/libvirt"
version = "0.6.14"
}
}
}
locals {
state_disk_size_byte = 1073741824 * var.state_disk_size
}
resource "libvirt_domain" "instance_group" {
name = "${var.role}-${count.index}"
count = var.amount
memory = var.memory
vcpu = var.vcpus
machine = "q35"
tpm {
backend_type = "emulator"
backend_version = "2.0"
}
disk = [
{
volume_id = element(libvirt_volume.boot_volume.*.id, count.index)
scsi : true,
// fix for https://github.com/dmacvicar/terraform-provider-libvirt/issues/728
block_device : null,
file : null,
url : null,
wwn : null
},
{
volume_id = element(libvirt_volume.state_volume.*.id, count.index)
// fix for https://github.com/dmacvicar/terraform-provider-libvirt/issues/728
block_device : null,
file : null,
scsi : null,
url : null,
wwn : null
},
]
network_interface {
network_id = var.network_id
hostname = "${var.role}-${count.index}"
addresses = [cidrhost(var.cidr, var.ip_range_start + count.index)]
wait_for_lease = true
}
console {
type = "pty"
target_port = "0"
}
xml {
xslt = file("modules/instance_group/domain.xsl")
}
}
resource "libvirt_volume" "boot_volume" {
name = "constellation-${var.role}-${count.index}-boot"
count = var.amount
pool = var.pool
base_volume_id = var.boot_volume_id
}
resource "libvirt_volume" "state_volume" {
name = "constellation-${var.role}-${count.index}-state"
count = var.amount
pool = var.pool
size = local.state_disk_size_byte
format = "qcow2"
}

View file

@ -0,0 +1,3 @@
output "instance_ips" {
value = flatten(libvirt_domain.instance_group[*].network_interface[*].addresses[*])
}

View file

@ -0,0 +1,48 @@
variable "amount" {
type = number
description = "amount of nodes"
}
variable "vcpus" {
type = number
description = "amount of vcpus per instance"
}
variable "memory" {
type = number
description = "amount of memory per instance (MiB)"
}
variable "state_disk_size" {
type = number
description = "size of state disk (GiB)"
}
variable "ip_range_start" {
type = number
description = "first ip address to use within subnet"
}
variable "cidr" {
type = string
description = "subnet to use for dhcp"
}
variable "network_id" {
type = string
description = "id of the network to use"
}
variable "pool" {
type = string
description = "name of the storage pool to use"
}
variable "boot_volume_id" {
type = string
description = "id of the constellation boot disk"
}
variable "role" {
type = string
}