-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.tf
More file actions
216 lines (188 loc) · 6.65 KB
/
Copy pathmain.tf
File metadata and controls
216 lines (188 loc) · 6.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
# Provider configuration
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "4.40.0"
}
}
}
provider "azurerm" {
features {}
subscription_id = "30c669d0-afb4-45f6-a261-dd314a10bf69"
}
# Resource Group
resource "azurerm_resource_group" "rg" {
name = var.resource_group_name
location = var.location
}
# Virtual Network
resource "azurerm_virtual_network" "vnet" {
name = var.vnet_name
address_space = var.vnet_address_space
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
}
# Subnet
resource "azurerm_subnet" "subnet" {
name = var.subnet_name
resource_group_name = azurerm_resource_group.rg.name
virtual_network_name = azurerm_virtual_network.vnet.name
address_prefixes = var.subnet_address_prefixes
}
# Network Security Group (NSG) for SSH and HTTP
resource "azurerm_network_security_group" "nsg" {
name = var.nsg_name
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
security_rule {
name = "allow-ssh"
priority = 100
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "22"
source_address_prefix = "*" # Restrict in production
destination_address_prefix = "*"
}
security_rule {
name = "allow-http"
priority = 110
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "80"
source_address_prefix = "*" # Restrict in production
destination_address_prefix = "*"
}
}
# Public IP for Load Balancer
resource "azurerm_public_ip" "lb_public_ip" {
name = var.lb_public_ip_name
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
allocation_method = "Static"
sku = "Standard"
}
# Load Balancer
resource "azurerm_lb" "lb" {
name = var.lb_name
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
sku = "Standard"
frontend_ip_configuration {
name = "lb-frontend"
public_ip_address_id = azurerm_public_ip.lb_public_ip.id
}
}
# Backend Address Pool
resource "azurerm_lb_backend_address_pool" "lb_backend" {
loadbalancer_id = azurerm_lb.lb.id
name = var.lb_backend_name
}
# Health Probe
resource "azurerm_lb_probe" "lb_probe" {
loadbalancer_id = azurerm_lb.lb.id
name = var.lb_probe_name
protocol = "Http"
port = 80
request_path = "/"
}
# Load Balancing Rule
resource "azurerm_lb_rule" "lb_rule" {
loadbalancer_id = azurerm_lb.lb.id
name = var.lb_rule_name
protocol = "Tcp"
frontend_port = 80
backend_port = 80
frontend_ip_configuration_name = "lb-frontend"
backend_address_pool_ids = [azurerm_lb_backend_address_pool.lb_backend.id]
probe_id = azurerm_lb_probe.lb_probe.id
}
# NAT Rule for SSH
resource "azurerm_lb_nat_rule" "ssh_nat" {
resource_group_name = azurerm_resource_group.rg.name
loadbalancer_id = azurerm_lb.lb.id
name = var.lb_nat_rule_name
protocol = "Tcp"
frontend_port = 2222
backend_port = 22
frontend_ip_configuration_name = "lb-frontend"
}
# Availability Set
resource "azurerm_availability_set" "avset" {
name = var.avset_name
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
platform_fault_domain_count = 2
platform_update_domain_count = 2
}
# Network Interface (NIC)
resource "azurerm_network_interface" "nic" {
name = var.nic_name
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
ip_configuration {
name = "internal"
subnet_id = azurerm_subnet.subnet.id
private_ip_address_allocation = "Dynamic"
}
}
# Associate NIC with Load Balancer Backend Pool
resource "azurerm_network_interface_backend_address_pool_association" "nic_lb_assoc" {
network_interface_id = azurerm_network_interface.nic.id
ip_configuration_name = "internal"
backend_address_pool_id = azurerm_lb_backend_address_pool.lb_backend.id
}
# Associate NIC with NAT Rule for SSH
resource "azurerm_network_interface_nat_rule_association" "nic_nat_assoc" {
network_interface_id = azurerm_network_interface.nic.id
ip_configuration_name = "internal"
nat_rule_id = azurerm_lb_nat_rule.ssh_nat.id
}
# Associate NSG with NIC
resource "azurerm_network_interface_security_group_association" "nic_nsg_assoc" {
network_interface_id = azurerm_network_interface.nic.id
network_security_group_id = azurerm_network_security_group.nsg.id
}
# Virtual Machine (VM)
resource "azurerm_linux_virtual_machine" "vm" {
name = var.vm_name
resource_group_name = azurerm_resource_group.rg.name
location = azurerm_resource_group.rg.location
size = var.vm_size
network_interface_ids = [azurerm_network_interface.nic.id]
availability_set_id = azurerm_availability_set.avset.id
disable_password_authentication = false
admin_username = var.admin_username
admin_password = var.admin_password
os_disk {
caching = "ReadWrite"
storage_account_type = "Standard_LRS"
}
source_image_reference {
publisher = "Canonical"
offer = "UbuntuServer"
sku = "18.04-LTS"
version = "latest"
}
custom_data = base64encode(<<-EOF
#!/bin/bash
apt-get update -y
apt-get install -y nginx git
systemctl enable nginx
systemctl start nginx
rm -f /var/www/html/index.nginx-debian.html
git clone https://github.com/devopsinsiders/starbucks-clone.git /tmp/starbucks-clone
cp -r /tmp/starbucks-clone/* /var/www/html/
chown -R www-data:www-data /var/www/html/
systemctl restart nginx
EOF
)
}
# Output the Load Balancer Public IP
output "lb_public_ip" {
value = azurerm_public_ip.lb_public_ip.ip_address
}