Compare commits

..

10 Commits

Author SHA1 Message Date
sam 6c6eb8e161 updated outputs 2025-11-07 21:53:09 +00:00
comerford0 5d09f36744 removing .yml workflow 2025-10-02 10:00:09 +00:00
comerford0 af6e73101f updating terraform 2025-10-02 09:59:10 +00:00
comerford0 c12311ab9f updating terraform 2025-10-02 09:17:15 +00:00
comerford0 dfcbe54ebe added hashed workflow 2025-10-02 08:00:22 +00:00
Sam b2b2ad94b7 Phase1-2 2025-09-26 12:38:12 +00:00
Sam 49c0913f2b Phase1-2 2025-09-26 11:19:35 +00:00
Sam 0049839d98 Phase1-2 2025-09-26 11:06:15 +00:00
Sam 59060033d3 Phase1-1 2025-09-26 10:47:35 +00:00
Sam 8496c9de14 Phase1 2025-09-26 09:36:07 +00:00
13 changed files with 257 additions and 3 deletions
View File
+31
View File
@@ -0,0 +1,31 @@
# name: Terraform
# on:
# pull_request:
# branches: [ "main" ]
# push:
# branches: [ "main" ]
# jobs:
# terraform:
# runs-on: ubuntu-latest
# steps:
# - name: Checkout code
# uses: actions/checkout@v3
# - name: Setup Terraform
# uses: hashicorp/setup-terraform@v2
# - name: Terraform Init
# run: terraform -chdir=environments/dev init
# - name: Terraform Validate
# run: terraform -chdir=environments/dev validate
# - name: Terraform Plan
# run: terraform -chdir=environments/dev plan
# - name: Terraform Apply
# if: github.event_name == 'push' && github.ref == 'refs/heads/main'
# run: terraform -chdir=environments/dev apply -auto-approve
+3
View File
@@ -1,6 +1,9 @@
# Terraform
.terraform/ .terraform/
*.tfstate *.tfstate
*.tfstate.backup *.tfstate.backup
.terraform.lock.hcl .terraform.lock.hcl
# Local configs
terraform.tfvars terraform.tfvars
*.override.tf *.override.tf
+20
View File
@@ -1 +1,21 @@
# Terraform Azure Bootcamp # Terraform Azure Bootcamp
This repo contains hands-on Terraform projects on Azure, following a structured learning path:
1. Foundations (VM, Virtual Network)
2. Modules
3. Remote State & Environments
4. Scaling & Advanced Patterns
5. Security & Testing
6. Production-Ready 3-Tier Architecture
## 📂 Structure
- `modules/` → reusable Terraform modules (network, compute, database, etc.)
- `environments/` → environment-specific configs (`dev`, `prod`)
- `.github/workflows/terraform.yml` → CI/CD with GitHub Actions
## 🚀 Usage
```bash
cd environments/dev
terraform init
terraform plan
terraform apply
+8
View File
@@ -0,0 +1,8 @@
terraform {
backend "azurerm" {
resource_group_name = "terraform"
storage_account_name = "tfstoracccom"
container_name = "tfstate"
key = "dev.terraform.tfstate"
}
}
+53
View File
@@ -0,0 +1,53 @@
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "4.46.0"
}
}
}
provider "azurerm" {
features{}
subscription_id = "4b2d6154-f4c5-4854-be82-12dfc82d4d23"
}
module "network" {
source = "../../modules/network"
vnet_name = "dev-vnet"
resource_group_name = "terraform"
location = "UK South"
address_space = ["10.0.0.0/16"]
subnets = { public = "10.0.1.0/24", private = "10.0.2.0/24" }
environment = "dev"
project = "TerraformBootcamp"
}
data "azurerm_ssh_public_key" "kp" {
name = "terraform-kp"
resource_group_name = "terraform"
}
data "azurerm_ssh_public_key" "sd" {
name = "sbcomsam-d-01"
resource_group_name = "terraform"
}
data "http" "my_ip" {
url = "https://checkip.amazonaws.com/"
}
locals {
my_ip = chomp(data.http.my_ip.response_body)
}
module "compute" {
source = "../../modules/compute"
resource_group_name = "terraform"
location = "UK South"
subnet_id = module.network.subnet_ids["public"]
vm_size = "Standard_B1s"
admin_username = "azureuser"
ssh_public_key = data.azurerm_ssh_public_key.sd.public_key
ex_ip = local.my_ip
}
+7
View File
@@ -0,0 +1,7 @@
output "my_ip" {
value = local.my_ip
}
output "vm_public_ip" {
value = module.compute.vm_public_ip.ip_address
}
+67
View File
@@ -0,0 +1,67 @@
resource "azurerm_network_interface" "nic" {
name = "vnic"
location = var.location
resource_group_name = var.resource_group_name
ip_configuration {
name = "internal"
subnet_id = var.subnet_id
private_ip_address_allocation = "Dynamic"
public_ip_address_id = azurerm_public_ip.vm_public.id
}
}
resource "azurerm_network_interface_security_group_association" "example" {
network_interface_id = azurerm_network_interface.nic.id
network_security_group_id = azurerm_network_security_group.vm_nsg.id
depends_on = [azurerm_network_security_group.vm_nsg]
}
resource "azurerm_network_security_group" "vm_nsg" {
name = "vm-nsg"
resource_group_name = var.resource_group_name
location = var.location
security_rule {
name = "SSH"
priority = 1001
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "22"
source_address_prefix = var.ex_ip
destination_address_prefix = "*"
}
}
resource "azurerm_public_ip" "vm_public" {
name = "example-pip"
location = var.location
resource_group_name = var.resource_group_name
allocation_method = "Static"
}
resource "azurerm_linux_virtual_machine" "vm" {
name = "example-vm"
resource_group_name = var.resource_group_name
location = var.location
size = var.vm_size
admin_username = var.admin_username
network_interface_ids = [azurerm_network_interface.nic.id]
admin_ssh_key {
username = var.admin_username
public_key = var.ssh_public_key
}
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"
}
}
+3
View File
@@ -0,0 +1,3 @@
output "vm_public_ip" {
value = azurerm_public_ip.vm_public
}
+7
View File
@@ -0,0 +1,7 @@
variable "resource_group_name" { type = string }
variable "location" { type = string }
variable "subnet_id" { type = string }
variable "vm_size" { type = string }
variable "admin_username" { type = string }
variable "ssh_public_key" { type = string }
variable "ex_ip" { type = string }
+14
View File
@@ -0,0 +1,14 @@
resource "azurerm_virtual_network" "main" {
name = var.vnet_name
resource_group_name = var.resource_group_name
location = var.location
address_space = var.address_space
}
resource "azurerm_subnet" "subnets" {
for_each = var.subnets
name = each.key
resource_group_name = var.resource_group_name
virtual_network_name = azurerm_virtual_network.main.name
address_prefixes = [each.value]
}
+7 -1
View File
@@ -1 +1,7 @@
output "vnet_id" { value = "<placeholder>" } output "vnet_id" {
value = azurerm_virtual_network.main.id
}
output "subnet_ids" {
value = { for s in azurerm_subnet.subnets : s.name => s.id }
}
+36 -1
View File
@@ -1 +1,36 @@
variable "resource_group_name" { type = string } variable "vnet_name" {
description = "Name of the Virtual Network"
type = string
}
variable "resource_group_name" {
description = "Resource Group to create resources in"
type = string
}
variable "location" {
description = "Azure region"
type = string
}
variable "address_space" {
description = "CIDR blocks for the VNet"
type = list(string)
}
variable "subnets" {
description = "Map of subnet names to CIDR blocks"
type = map(string)
}
variable "environment" {
description = "Environment tag (dev/prod)"
type = string
default = "dev"
}
variable "project" {
description = "Project tag"
type = string
default = "TerraformBootcamp"
}