terraform/modules/gitlab_azure_instance/main.tf (87 lines of code) (raw):

terraform { required_version = ">= 1.9" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~> 4.0" } } } data "azurerm_public_ip" "gitlab_external_ips" { name = each.key resource_group_name = var.resource_group_name for_each = toset(var.external_ip_names) } locals { external_ip_ids = [for ip in data.azurerm_public_ip.gitlab_external_ips : ip.id] external_ips = length(local.external_ip_ids) == 0 ? azurerm_public_ip.gitlab[*].id : local.external_ip_ids } resource "azurerm_public_ip" "gitlab" { count = length(local.external_ip_ids) == 0 && var.setup_external_ip ? var.node_count : 0 name = "${var.prefix}-${var.node_type}-ip-${count.index + 1}" resource_group_name = var.resource_group_name location = var.location allocation_method = "Static" sku = var.external_ip_type lifecycle { # Ignore changes in the Zones which force recreation of the resource. This # avoids accidental deletion of IPs after AzureRM v3.0 upgrade # https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/guides/3.0-upgrade-guide#resource-azurerm_public_ip ignore_changes = [ zones ] } } resource "azurerm_network_interface" "gitlab" { count = var.node_count name = "${var.prefix}-${var.node_type}-network-interface-${count.index + 1}" location = var.location resource_group_name = var.resource_group_name # Dynamic allocation is used because otherwise we will need to "manually" specify # private_ip_address for each NIC/VM. The difference between Static and Dynamic: # https://docs.microsoft.com/en-us/azure/virtual-network/private-ip-addresses#allocation-method ip_configuration { name = "${var.prefix}-${var.node_type}-internal-ip-configuration-${count.index + 1}" subnet_id = var.subnet_id private_ip_address_allocation = "Dynamic" public_ip_address_id = var.setup_external_ip ? local.external_ips[count.index] : null } } # Connect the application group to the network interface if provided resource "azurerm_network_interface_application_security_group_association" "gitlab" { count = var.node_count == 0 || var.application_security_group == null ? 0 : var.node_count network_interface_id = azurerm_network_interface.gitlab[count.index].id application_security_group_id = var.application_security_group.id } resource "azurerm_linux_virtual_machine" "gitlab" { count = var.node_count name = "${var.prefix}-${var.node_type}-${count.index + 1}" resource_group_name = var.resource_group_name location = var.location size = var.size # The username of the local administrator used for the Virtual Machine. admin_username = var.vm_admin_username admin_ssh_key { username = var.vm_admin_username public_key = var.ssh_public_key } network_interface_ids = [ azurerm_network_interface.gitlab[count.index].id, ] os_disk { caching = "ReadWrite" storage_account_type = var.storage_account_type disk_size_gb = var.disk_size } source_image_reference { publisher = var.source_image_reference["publisher"] offer = var.source_image_reference["offer"] sku = var.source_image_reference["sku"] version = var.source_image_reference["version"] } ## TODO: additional_tags is deprecated and will be removed in 4.x tags = merge({ gitlab_node_prefix = var.prefix gitlab_node_type = var.node_type gitlab_node_level = var.label_secondaries == true ? (count.index == 0 ? "${var.node_type}-primary" : "${var.node_type}-secondary") : null gitlab_geo_site = var.geo_site gitlab_geo_deployment = var.geo_deployment gitlab_geo_full_role = var.geo_site == null ? null : (count.index == 0 ? "${var.geo_site}-${var.node_type}-primary" : "${var.geo_site}-${var.node_type}-secondary") }, var.additional_tags, var.custom_tags) lifecycle { ignore_changes = [ source_image_reference ] } }