1.Virtual.Network/AD/vm.tf (87 lines of code) (raw):
#################################################################################################################################################
# Active Directory (https://learn.microsoft.com/windows-server/identity/ad-ds/get-started/virtual-dc/active-directory-domain-services-overview) #
#################################################################################################################################################
variable activeDirectory {
type = object({
domainName = string
machine = object({
name = string
size = string
image = object({
publisher = string
product = string
name = string
version = string
})
osDisk = object({
storageType = string
cachingMode = string
sizeGB = number
})
adminLogin = object({
userName = string
userPassword = string
})
})
network = object({
acceleration = object({
enable = bool
})
staticAddress = string
})
})
}
#########################################################################
# Virtual Machines (https://learn.microsoft.com/azure/virtual-machines) #
#########################################################################
resource azurerm_network_interface active_directory {
name = var.activeDirectory.machine.name
resource_group_name = azurerm_resource_group.active_directory.name
location = azurerm_resource_group.active_directory.location
ip_configuration {
name = "ipConfig"
private_ip_address_allocation = "Static"
private_ip_address = var.activeDirectory.network.staticAddress
subnet_id = data.azurerm_subnet.identity.id
}
accelerated_networking_enabled = var.activeDirectory.network.acceleration.enable
}
resource azurerm_windows_virtual_machine active_directory {
name = var.activeDirectory.machine.name
resource_group_name = azurerm_resource_group.active_directory.name
location = azurerm_resource_group.active_directory.location
size = var.activeDirectory.machine.size
admin_username = local.activeDirectory.machine.adminLogin.userName
admin_password = local.activeDirectory.machine.adminLogin.userPassword
identity {
type = "UserAssigned"
identity_ids = [
data.azurerm_user_assigned_identity.studio.id
]
}
network_interface_ids = [
azurerm_network_interface.active_directory.id
]
os_disk {
storage_account_type = var.activeDirectory.machine.osDisk.storageType
caching = var.activeDirectory.machine.osDisk.cachingMode
disk_size_gb = var.activeDirectory.machine.osDisk.sizeGB > 0 ? var.activeDirectory.machine.osDisk.sizeGB : null
}
source_image_reference {
publisher = var.activeDirectory.machine.image.publisher
offer = var.activeDirectory.machine.image.product
sku = var.activeDirectory.machine.image.name
version = var.activeDirectory.machine.image.version
}
}
resource azurerm_virtual_machine_extension active_directory {
name = "Custom"
type = "CustomScriptExtension"
publisher = "Microsoft.Compute"
type_handler_version = data.azurerm_app_configuration_keys.studio.items[index(data.azurerm_app_configuration_keys.studio.items[*].key, data.terraform_remote_state.core.outputs.appConfig.key.scriptExtensionWindows)].value
automatic_upgrade_enabled = false
auto_upgrade_minor_version = true
virtual_machine_id = azurerm_windows_virtual_machine.active_directory.id
protected_settings = jsonencode({
commandToExecute = "PowerShell -ExecutionPolicy Unrestricted -EncodedCommand ${textencodebase64(
templatefile("cse.ps1", {
activeDirectory = local.activeDirectory
machineType = "WinServer"
}), "UTF-16LE"
)}"
})
}