lavenderguitar
3 years ago
6 changed files with 210 additions and 0 deletions
@ -0,0 +1,63 @@ |
|||
resource "linode_firewall_device" "site-firewall-vms" { |
|||
count = length(var.app_servers) |
|||
firewall_id = linode_firewall.site-firewall.id |
|||
entity_id = "${element(linode_instance.site-vm.*.id, count.index)}" |
|||
} |
|||
|
|||
resource "linode_firewall" "site-firewall" { |
|||
label = "site-firewall" |
|||
tags = [ |
|||
"${var.site}-firewall" |
|||
] |
|||
|
|||
inbound_policy = "DROP" |
|||
outbound_policy = "ACCEPT" |
|||
|
|||
inbound { |
|||
label = "inbound-http" |
|||
protocol = "TCP" |
|||
action = "ACCEPT" |
|||
ports = "80" |
|||
ipv4 = ["0.0.0.0/0"] |
|||
} |
|||
|
|||
outbound { |
|||
label = "outbound-http" |
|||
protocol = "TCP" |
|||
action = "ACCEPT" |
|||
ports = "80" |
|||
ipv4 = ["0.0.0.0/0"] |
|||
} |
|||
|
|||
inbound { |
|||
label = "inbound-https" |
|||
protocol = "TCP" |
|||
action = "ACCEPT" |
|||
ports = "443" |
|||
ipv4 = ["0.0.0.0/0"] |
|||
} |
|||
|
|||
outbound { |
|||
label = "outbound-https" |
|||
protocol = "TCP" |
|||
action = "ACCEPT" |
|||
ports = "443" |
|||
ipv4 = ["0.0.0.0/0"] |
|||
} |
|||
|
|||
inbound { |
|||
label = "inbound-ssh-22" |
|||
protocol = "TCP" |
|||
action = "ACCEPT" |
|||
ports = "22" |
|||
ipv4 = ["0.0.0.0/0"] |
|||
} |
|||
|
|||
inbound { |
|||
label = "inbound-ssh-8822" |
|||
protocol = "TCP" |
|||
action = "ACCEPT" |
|||
ports = "8822" |
|||
ipv4 = ["0.0.0.0/0"] |
|||
} |
|||
} |
@ -0,0 +1,55 @@ |
|||
resource "linode_nodebalancer" "site-nodebalancer" { |
|||
label = "site-nodebalancer" |
|||
region = var.region |
|||
tags = [ |
|||
"${var.site}-nodebalancer" |
|||
] |
|||
} |
|||
|
|||
resource "linode_nodebalancer_config" "site-nodebalancer-config-http" { |
|||
nodebalancer_id = linode_nodebalancer.site-nodebalancer.id |
|||
port = 80 |
|||
protocol = "tcp" |
|||
check = "connection" |
|||
check_path = "/" |
|||
check_attempts = 3 |
|||
check_timeout = 25 |
|||
check_interval = 30 |
|||
stickiness = "none" |
|||
algorithm = "leastconn" |
|||
} |
|||
|
|||
resource "linode_nodebalancer_config" "site-nodebalancer-config-https" { |
|||
nodebalancer_id = linode_nodebalancer.site-nodebalancer.id |
|||
port = 443 |
|||
protocol = "tcp" |
|||
check = "connection" |
|||
check_path = "/" |
|||
check_attempts = 3 |
|||
check_timeout = 25 |
|||
check_interval = 30 |
|||
stickiness = "none" |
|||
algorithm = "leastconn" |
|||
} |
|||
|
|||
resource "linode_nodebalancer_node" "site-nodebalancer-nodes-http" { |
|||
count = length(var.app_servers) |
|||
nodebalancer_id = linode_nodebalancer.site-nodebalancer.id |
|||
config_id = linode_nodebalancer_config.site-nodebalancer-config-http.id |
|||
label = "app${count.index}" |
|||
address = "${element(linode_instance.site-vm.*.private_ip_address, count.index)}:80" |
|||
mode = "accept" |
|||
} |
|||
|
|||
resource "linode_nodebalancer_node" "site-nodebalancer-nodes-https" { |
|||
count = length(var.app_servers) |
|||
nodebalancer_id = linode_nodebalancer.site-nodebalancer.id |
|||
config_id = linode_nodebalancer_config.site-nodebalancer-config-https.id |
|||
label = "app${count.index}" |
|||
address = "${element(linode_instance.site-vm.*.private_ip_address, count.index)}:443" |
|||
mode = "accept" |
|||
} |
|||
|
|||
output "nodebalancer_ip_address" { |
|||
value = linode_nodebalancer.site-nodebalancer.ipv4 |
|||
} |
@ -0,0 +1,17 @@ |
|||
terraform { |
|||
required_providers { |
|||
linode = { |
|||
source = "linode/linode" |
|||
version = "1.25.2" |
|||
} |
|||
} |
|||
} |
|||
|
|||
provider "linode" { |
|||
token = var.token |
|||
} |
|||
|
|||
resource "linode_sshkey" "main_key" { |
|||
label = "ssh_key" |
|||
ssh_key = chomp(file(var.ssh_key)) |
|||
} |
@ -0,0 +1,18 @@ |
|||
resource "linode_instance" "site-vm" { |
|||
count = length(var.app_servers) |
|||
label = "${var.site}-app${count.index}" |
|||
tags = [ |
|||
"${var.site}-app${count.index}" |
|||
] |
|||
region = var.region |
|||
private_ip = true |
|||
type = var.app_servers[count.index].type |
|||
image = var.app_servers[count.index].image |
|||
authorized_keys = [ |
|||
linode_sshkey.main_key.ssh_key |
|||
] |
|||
} |
|||
|
|||
output "linode_instance_ip_address" { |
|||
value = linode_instance.site-vm.*.ipv4 |
|||
} |
@ -0,0 +1,18 @@ |
|||
site = "example.com" |
|||
region = "us-southeast" |
|||
environment = "production" |
|||
app_servers = [ |
|||
{ |
|||
type = "g6-nanode-1" |
|||
image = "linode/ubuntu20.04" |
|||
}, |
|||
{ |
|||
type = "g6-nanode-1" |
|||
image = "linode/ubuntu20.04" |
|||
} |
|||
] |
|||
bastion_server = { |
|||
type = "g6-nanode-1" |
|||
image = "linode/ubuntu20.04" |
|||
} |
|||
ssh_key = "~/.ssh/id_rsa.pub" |
@ -0,0 +1,39 @@ |
|||
variable "token" { |
|||
description = "API token of the Linode Account" |
|||
type = string |
|||
} |
|||
variable "site" { |
|||
description = "FQDN of the static site" |
|||
type = string |
|||
} |
|||
|
|||
variable "environment" { |
|||
description = "Environment of the infrastructure (staging/production/dev/etc..)" |
|||
type = string |
|||
} |
|||
|
|||
variable "region" { |
|||
description = "Region to host the infrastructure" |
|||
type = string |
|||
} |
|||
|
|||
variable "root_pass" { |
|||
description = "The root password for the bastion instance." |
|||
default = "default-root-password" |
|||
type = string |
|||
sensitive = true |
|||
} |
|||
|
|||
variable "ssh_key" { |
|||
description = "Filepath of id_rsa.pub for root access to VMs." |
|||
} |
|||
|
|||
variable "app_servers" { |
|||
description = "Details describing the vm instances for the app" |
|||
type = list |
|||
} |
|||
|
|||
variable "bastion_server" { |
|||
description = "Details describing the bastion instance." |
|||
type = map |
|||
} |
Loading…
Reference in new issue