3.File.Storage/Hammerspace/node.metadata.tf (203 lines of code) (raw):
######################################################################################################
# Hammerspace (https://azuremarketplace.microsoft.com/marketplace/apps/hammerspace.hammerspace-byol) #
######################################################################################################
locals {
hsHighAvailability = length(local.hsMetadataNodes) > 1 ? true : false
hsMetadataNodes = [
for i in range(var.hammerspace.metadata.machine.count) : merge(var.hammerspace.metadata, {
machine = merge(var.hammerspace.metadata.machine, {
index = i
name = "${var.hammerspace.namePrefix}${var.hammerspace.metadata.machine.namePrefix}${i + 1}"
adminLogin = merge(var.hammerspace.metadata.machine.adminLogin, {
userName = var.hammerspace.metadata.machine.adminLogin.userName != "" ? var.hammerspace.metadata.machine.adminLogin.userName : data.azurerm_key_vault_secret.admin_username.value
userPassword = var.hammerspace.metadata.machine.adminLogin.userPassword != "" ? var.hammerspace.metadata.machine.adminLogin.userPassword : data.azurerm_key_vault_secret.admin_password.value
sshKeyPublic = var.hammerspace.metadata.machine.adminLogin.sshKeyPublic != "" ? var.hammerspace.metadata.machine.adminLogin.sshKeyPublic : data.azurerm_key_vault_secret.ssh_key_public.value
})
})
})
]
hsMetadataNodeConfig = {
cluster = {
domainname = var.hammerspace.domainName
}
node = {
hostname = ""
ha_mode = ""
}
}
hsMetadataNodeConfigHA = local.hsHighAvailability ? merge(local.hsMetadataNodeConfig, {
node = merge(local.hsMetadataNodeConfig.node, {
networks = {
eth0 = {
cluster_ips = [
"${azurerm_lb.metadata[0].frontend_ip_configuration[0].private_ip_address}${local.hsSubnetSize}"
]
}
eth1 = {
dhcp = true
}
}
})
}) : null
}
###################################################################################################
# Availability Set (https://learn.microsoft.com/azure/virtual-machines/availability-set-overview) #
###################################################################################################
resource azurerm_availability_set metadata {
name = "${var.hammerspace.namePrefix}${var.hammerspace.metadata.machine.namePrefix}"
resource_group_name = azurerm_resource_group.hammerspace.name
location = azurerm_resource_group.hammerspace.location
proximity_placement_group_id = var.hammerspace.proximityPlacementGroup.enable ? azurerm_proximity_placement_group.hammerspace[0].id : null
}
#########################################################################
# Virtual Machines (https://learn.microsoft.com/azure/virtual-machines) #
#########################################################################
resource azurerm_network_interface metadata {
for_each = {
for node in local.hsMetadataNodes : node.machine.name => node
}
name = each.value.machine.name
resource_group_name = azurerm_resource_group.hammerspace.name
location = azurerm_resource_group.hammerspace.location
ip_configuration {
name = "ipConfig"
private_ip_address_allocation = "Dynamic"
subnet_id = data.azurerm_subnet.storage.id
}
accelerated_networking_enabled = each.value.network.acceleration.enable
}
resource azurerm_network_interface metadata_ha {
for_each = {
for node in local.hsMetadataNodes : node.machine.name => node if local.hsHighAvailability
}
name = each.value.machine.name
resource_group_name = azurerm_resource_group.hammerspace.name
location = azurerm_resource_group.hammerspace.location
ip_configuration {
name = "ipConfig"
private_ip_address_allocation = "Dynamic"
subnet_id = data.azurerm_subnet.storage.id
}
accelerated_networking_enabled = each.value.network.acceleration.enable
}
resource azurerm_linux_virtual_machine metadata {
for_each = {
for node in local.hsMetadataNodes : node.machine.name => node
}
name = each.value.machine.name
resource_group_name = azurerm_resource_group.hammerspace.name
location = azurerm_resource_group.hammerspace.location
size = each.value.machine.size
admin_username = each.value.machine.adminLogin.userName
admin_password = each.value.machine.adminLogin.userPassword
disable_password_authentication = each.value.machine.adminLogin.passwordAuth.disable
availability_set_id = azurerm_availability_set.metadata.id
proximity_placement_group_id = var.hammerspace.proximityPlacementGroup.enable ? azurerm_proximity_placement_group.hammerspace[0].id : null
custom_data = base64encode(jsonencode(
local.hsHighAvailability ? merge(local.hsMetadataNodeConfigHA, {
node = {
hostname = each.value.machine.name
ha_mode = each.value.machine.index == 0 ? "Primary" : "Secondary"
}
}) : merge(local.hsMetadataNodeConfig, {
node = {
hostname = each.value.machine.name
ha_mode = "Standalone"
}
})
))
network_interface_ids = distinct(local.hsHighAvailability ? [
azurerm_network_interface.metadata[each.value.machine.name].id,
azurerm_network_interface.metadata_ha[each.value.machine.name].id
] : [
azurerm_network_interface.metadata[each.value.machine.name].id,
azurerm_network_interface.metadata[each.value.machine.name].id
])
os_disk {
storage_account_type = each.value.machine.osDisk.storageType
caching = each.value.machine.osDisk.cachingMode
disk_size_gb = each.value.machine.osDisk.sizeGB > 0 ? each.value.machine.osDisk.sizeGB : null
}
source_image_reference {
publisher = local.hsImage.publisher
offer = local.hsImage.product
sku = local.hsImage.name
version = local.hsImage.version
}
plan {
publisher = lower(local.hsImage.publisher)
product = lower(local.hsImage.product)
name = lower(local.hsImage.name)
}
dynamic admin_ssh_key {
for_each = each.value.machine.adminLogin.sshKeyPublic != "" ? [1] : []
content {
username = each.value.machine.adminLogin.userName
public_key = each.value.machine.adminLogin.sshKeyPublic
}
}
}
resource azurerm_managed_disk metadata {
for_each = {
for node in local.hsMetadataNodes : node.machine.name => node
}
name = each.value.machine.name
resource_group_name = azurerm_resource_group.hammerspace.name
location = azurerm_resource_group.hammerspace.location
storage_account_type = each.value.machine.dataDisk.storageType
disk_size_gb = each.value.machine.dataDisk.sizeGB
create_option = "Empty"
public_network_access_enabled = false
}
resource azurerm_virtual_machine_data_disk_attachment metadata {
for_each = {
for node in local.hsMetadataNodes : node.machine.name => node
}
virtual_machine_id = "${azurerm_resource_group.hammerspace.id}/providers/Microsoft.Compute/virtualMachines/${each.value.machine.name}"
managed_disk_id = "${azurerm_resource_group.hammerspace.id}/providers/Microsoft.Compute/disks/${each.value.machine.name}"
caching = each.value.machine.dataDisk.cachingMode
lun = 0
depends_on = [
azurerm_managed_disk.metadata,
azurerm_linux_virtual_machine.metadata
]
}
##########################################################################################
# Load Balancer (https://learn.microsoft.com/azure/load-balancer/load-balancer-overview) #
##########################################################################################
resource azurerm_lb metadata {
count = local.hsHighAvailability ? 1 : 0
name = "${var.hammerspace.namePrefix}${var.hammerspace.metadata.machine.namePrefix}"
resource_group_name = azurerm_resource_group.hammerspace.name
location = azurerm_resource_group.hammerspace.location
sku = "Standard"
frontend_ip_configuration {
name = "ipConfig"
subnet_id = data.azurerm_subnet.storage.id
}
}
resource azurerm_lb_backend_address_pool metadata {
count = local.hsHighAvailability ? 1 : 0
name = "MetadataPool"
loadbalancer_id = azurerm_lb.metadata[0].id
}
resource azurerm_network_interface_backend_address_pool_association metadata {
for_each = {
for node in local.hsMetadataNodes : node.machine.name => node if local.hsHighAvailability
}
backend_address_pool_id = azurerm_lb_backend_address_pool.metadata[0].id
network_interface_id = "${azurerm_resource_group.hammerspace.id}/providers/Microsoft.Network/networkInterfaces/${each.value.machine.name}"
ip_configuration_name = "ipConfig"
depends_on = [
azurerm_network_interface.metadata
]
}
resource azurerm_lb_rule metadata {
count = local.hsHighAvailability ? 1 : 0
name = "MetadataRule"
loadbalancer_id = azurerm_lb.metadata[0].id
frontend_ip_configuration_name = azurerm_lb.metadata[0].frontend_ip_configuration[0].name
probe_id = azurerm_lb_probe.metadata[0].id
enable_floating_ip = true
protocol = "All"
frontend_port = 0
backend_port = 0
backend_address_pool_ids = [
azurerm_lb_backend_address_pool.metadata[0].id
]
}
resource azurerm_lb_probe metadata {
count = local.hsHighAvailability ? 1 : 0
name = "MetadataProbe"
loadbalancer_id = azurerm_lb.metadata[0].id
protocol = "Tcp"
port = 4505
}