terraform { required_version = ">= 1.0" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~> 3.0" } } } provider "azurerm" { features {} } # Resource Group resource "azurerm_resource_group" "main" { name = var.resource_group_name location = var.location tags = var.tags } # Virtual Network resource "azurerm_virtual_network" "main" { name = "${var.resource_group_name}-vnet" address_space = [var.vnet_address_space] location = azurerm_resource_group.main.location resource_group_name = azurerm_resource_group.main.name tags = var.tags } # Subnet resource "azurerm_subnet" "main" { name = "default" resource_group_name = azurerm_resource_group.main.name virtual_network_name = azurerm_virtual_network.main.name address_prefixes = [var.subnet_address_prefix] } # Network Security Group resource "azurerm_network_security_group" "main" { name = "${var.vm_name}-nsg" location = azurerm_resource_group.main.location resource_group_name = azurerm_resource_group.main.name security_rule { name = "SSH" priority = 1001 direction = "Inbound" access = "Allow" protocol = "Tcp" source_port_range = "*" destination_port_range = "22" source_address_prefix = var.allowed_ssh_source destination_address_prefix = "*" } tags = var.tags } # Public IP resource "azurerm_public_ip" "main" { name = "${var.vm_name}-pip" location = azurerm_resource_group.main.location resource_group_name = azurerm_resource_group.main.name allocation_method = "Static" sku = "Standard" tags = var.tags } # Network Interface resource "azurerm_network_interface" "main" { name = "${var.vm_name}-nic" location = azurerm_resource_group.main.location resource_group_name = azurerm_resource_group.main.name ip_configuration { name = "internal" subnet_id = azurerm_subnet.main.id private_ip_address_allocation = "Dynamic" public_ip_address_id = azurerm_public_ip.main.id } tags = var.tags } # Associate NSG with Network Interface resource "azurerm_network_interface_security_group_association" "main" { network_interface_id = azurerm_network_interface.main.id network_security_group_id = azurerm_network_security_group.main.id } # Linux Virtual Machine resource "azurerm_linux_virtual_machine" "main" { name = var.vm_name resource_group_name = azurerm_resource_group.main.name location = azurerm_resource_group.main.location size = var.vm_size admin_username = var.admin_username admin_password = var.admin_password disable_password_authentication = false network_interface_ids = [ azurerm_network_interface.main.id, ] os_disk { caching = "ReadWrite" storage_account_type = "Standard_LRS" } source_image_reference { publisher = "Canonical" offer = "0001-com-ubuntu-server-jammy" sku = "22_04-lts-gen2" version = "latest" } tags = var.tags }