Skip to content

schundu007/vmProvisioning

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

8 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Azure Infrastructure Terraform Modules

Terraform Azure License: MIT

Production-ready Terraform modules for deploying Azure infrastructure including networking, compute, monitoring, and identity resources.


πŸ“ Project Structure

azure-infra-terraform/
β”œβ”€β”€ modules/
β”‚   └── azure/
β”‚       β”œβ”€β”€ compute/
β”‚       β”‚   └── linux-vm/          # Linux VM with backup & recovery
β”‚       β”œβ”€β”€ network/
β”‚       β”‚   β”œβ”€β”€ vnet/              # Virtual Network & Subnets
β”‚       β”‚   β”œβ”€β”€ nsg/               # Network Security Groups
β”‚       β”‚   β”œβ”€β”€ nat-gateway/       # NAT Gateway
β”‚       β”‚   └── routetable/        # Route Tables
β”‚       β”œβ”€β”€ monitoring/
β”‚       β”‚   β”œβ”€β”€ log-analytics/     # Log Analytics Workspace
β”‚       β”‚   └── app-insights/      # Application Insights
β”‚       └── identity/
β”‚           └── ad-application/    # Azure AD Applications
β”œβ”€β”€ environments/
β”‚   β”œβ”€β”€ dev/                       # Development environment
β”‚   └── prod/                      # Production environment
β”œβ”€β”€ scripts/
β”‚   β”œβ”€β”€ init-backend.sh            # Initialize Terraform backend
β”‚   └── deploy.sh                  # Deployment helper script
└── examples/
    └── complete/                  # Complete deployment example

πŸš€ Quick Start

Prerequisites

1. Clone & Configure

git clone https://github.com/yourusername/azure-infra-terraform.git
cd azure-infra-terraform

# Login to Azure
az login
az account set --subscription "YOUR_SUBSCRIPTION_ID"

2. Initialize Backend

# Create Terraform state backend
./scripts/init-backend.sh -s YOUR_SUBSCRIPTION_ID -e dev -p myproject

3. Deploy Infrastructure

cd environments/dev

# Initialize Terraform
terraform init \
  -backend-config="resource_group_name=myproject-tfstate-rg" \
  -backend-config="storage_account_name=myprojecttfstate" \
  -backend-config="container_name=tfstate" \
  -backend-config="key=dev.terraform.tfstate"

# Plan and Apply
terraform plan -var-file="terraform.tfvars"
terraform apply -var-file="terraform.tfvars"

πŸ“¦ Modules

Network Module

Deploys VNet with public/private subnets, NSG, NAT Gateway, and route tables.

module "network" {
  source = "../../modules/azure/network"

  prefix              = "myapp"
  environment         = "dev"
  location            = "eastus"
  resource_group_name = azurerm_resource_group.main.name
  address_space       = "10.0.0.0/16"

  create_public_subnets   = true
  create_private_subnets  = true
  create_nat_gateway      = true
  num_public_subnets      = 2
  num_private_subnets     = 2

  tags = var.tags
}

Linux VM Module

Deploys Ubuntu/RHEL VM with managed disks, backup, and AAD authentication.

module "linux_vm" {
  source = "../../modules/azure/compute/linux-vm"

  name                = "app-server"
  resource_group_name = azurerm_resource_group.main.name
  location            = "eastus"
  subnet_id           = module.network.private_subnet_ids[0]

  vm_size             = "Standard_D4s_v5"
  admin_username      = "azureadmin"
  os_disk_size_gb     = 128
  data_disk_size_gb   = 256

  enable_backup       = true
  enable_aad_login    = true

  tags = var.tags
}

Monitoring Module

Deploys Log Analytics and Application Insights.

module "monitoring" {
  source = "../../modules/azure/monitoring/log-analytics"

  name                = "myapp-logs"
  resource_group_name = azurerm_resource_group.main.name
  location            = "eastus"
  retention_in_days   = 30

  tags = var.tags
}

βš™οΈ Configuration

Environment Variables

Variable Description Example
prefix Resource naming prefix myapp
environment Environment name dev, prod
location Azure region eastus
address_space VNet CIDR 10.0.0.0/16

Sample terraform.tfvars

prefix        = "myapp"
environment   = "dev"
location      = "eastus"
address_space = "10.0.0.0/16"

tags = {
  Environment = "dev"
  Project     = "MyProject"
  ManagedBy   = "Terraform"
}

πŸ” Security Features

  • Azure AD Authentication - SSH login via Azure AD for Linux VMs
  • Managed Identity - System-assigned identity for VMs
  • Network Security Groups - Pre-configured NSG rules
  • Key Vault Integration - Secrets stored in Azure Key Vault
  • Backup & Recovery - Automated VM backups with retention policies
  • Private Endpoints - Optional private connectivity

πŸ—οΈ Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Resource Group                      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚                 Virtual Network                 β”‚   β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β”‚   β”‚
β”‚  β”‚  β”‚  Public     β”‚      β”‚  Private    β”‚           β”‚   β”‚
β”‚  β”‚  β”‚  Subnets    β”‚      β”‚  Subnets    β”‚           β”‚   β”‚
β”‚  β”‚  β”‚  (NAT GW)   β”‚      β”‚  (VMs)      β”‚           β”‚   β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜           β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                         β”‚                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”              β”‚
β”‚  β”‚ Linux VM β”‚  β”‚ Key Vaultβ”‚  β”‚ Log      β”‚              β”‚
β”‚  β”‚ + Backup β”‚  β”‚          β”‚  β”‚ Analyticsβ”‚              β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“‹ Module Outputs

Network Module

Output Description
vnet_id Virtual Network ID
vnet_name Virtual Network name
public_subnet_ids List of public subnet IDs
private_subnet_ids List of private subnet IDs
nsg_id Network Security Group ID

Linux VM Module

Output Description
vm_id Virtual Machine ID
vm_name Virtual Machine name
private_ip Private IP address
public_ip Public IP address (if enabled)
identity_principal_id Managed Identity principal ID

πŸ”§ Customization

Adding Custom NSG Rules

custom_nsg_rules = [
  {
    name                       = "allow-https"
    priority                   = 100
    direction                  = "Inbound"
    access                     = "Allow"
    protocol                   = "Tcp"
    source_port_range          = "*"
    destination_port_range     = "443"
    source_address_prefix      = "*"
    destination_address_prefix = "*"
  }
]

VM Cloud-Init

custom_data = base64encode(<<-EOF
  #!/bin/bash
  apt-get update
  apt-get install -y docker.io
  systemctl enable docker
  systemctl start docker
EOF
)

πŸ§ͺ Testing

# Format check
terraform fmt -check -recursive

# Validate configuration
terraform validate

# Security scan
tfsec .

# Cost estimation
infracost breakdown --path .

πŸ“ Contributing

  1. Fork the repository
  2. Create feature branch (git checkout -b feature/new-module)
  3. Commit changes (git commit -am 'Add new module')
  4. Push to branch (git push origin feature/new-module)
  5. Open Pull Request

πŸ“„ License

MIT License - see LICENSE for details.


πŸ‘€ Author

Sudhakar Chundu

About

Terraform automation scripts to provision a VM advanced

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors