Skip to content

Commit 8a7872a

Browse files
authored
Merge pull request #20 from LombardiDaniel/main
Example: VMs cluster with a simple (HAProxy) L4 LoadBalancer
2 parents b555dbd + 7a274f3 commit 8a7872a

File tree

9 files changed

+414
-1
lines changed

9 files changed

+414
-1
lines changed

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
.terraform/
22
terraform.tfstate
33
.terraform.lock.hcl
4-
terraform.tfstate.backup
4+
terraform.tfstate.backup
5+
*.tfvars
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
terraform {
2+
required_providers {
3+
mgc = {
4+
source = "magalucloud/mgc"
5+
version = "0.29.2"
6+
}
7+
}
8+
}
9+
10+
module "network" {
11+
source = "./modules/network"
12+
13+
api_key = var.api_key
14+
15+
project_name = var.project_name
16+
allowed_tcp_ports = var.allowed_tcp_ports
17+
allowed_udp_ports = var.allowed_udp_ports
18+
lb_tcp_ports = var.lb_tcp_ports
19+
lb_udp_ports = var.lb_udp_ports
20+
}
21+
22+
resource "mgc_ssh_keys" "ssh_keys" {
23+
name = "${var.project_name}-ssh-key"
24+
key = var.ssh_key
25+
}
26+
27+
locals {
28+
cluster_majority = floor(0.5 + (var.cluster_size + 1) / 2)
29+
cluster_minority = var.cluster_size - local.cluster_majority
30+
}
31+
32+
resource "mgc_virtual_machine_instances" "cluster_lb" {
33+
name = "${var.project_name}-lb"
34+
machine_type = {
35+
name = var.lb_machine_type
36+
}
37+
image = {
38+
name = "cloud-debian-12 LTS"
39+
}
40+
network = {
41+
# vpc = {
42+
# id = module.network.vpc_id
43+
# }
44+
associate_public_ip = true
45+
delete_public_ip = true
46+
interface = {
47+
security_groups = [
48+
{ id = module.network.lb_sec_group_id },
49+
{ id = module.network.ssh_sec_group_id },
50+
]
51+
}
52+
}
53+
54+
ssh_key_name = mgc_ssh_keys.ssh_keys.name
55+
}
56+
57+
resource "mgc_virtual_machine_instances" "node_instances" {
58+
count = var.cluster_size
59+
name = "${var.project_name}-node-${count.index}"
60+
machine_type = {
61+
name = var.nodes_machine_type
62+
}
63+
image = {
64+
name = "cloud-debian-12 LTS"
65+
}
66+
network = {
67+
# vpc = {
68+
# id = module.network.vpc_id
69+
# }
70+
associate_public_ip = false
71+
delete_public_ip = false
72+
interface = {
73+
security_groups = [
74+
{ id = module.network.nodes_sec_group_id },
75+
{ id = module.network.lb_sec_group_id },
76+
{ id = module.network.ssh_sec_group_id },
77+
]
78+
}
79+
}
80+
81+
ssh_key_name = mgc_ssh_keys.ssh_keys.name
82+
}
83+
84+
resource "null_resource" "provision_lb" {
85+
provisioner "remote-exec" {
86+
inline = [
87+
"sudo apt-get update",
88+
"sudo apt-get install haproxy -y",
89+
"sudo bash -c 'echo \"ENABLED=1\" >> /etc/default/haproxy'"
90+
]
91+
}
92+
93+
provisioner "file" {
94+
content = <<-EOT
95+
%{for port in var.lb_tcp_ports[*]~}
96+
frontend tcp_${port}_in
97+
bind *:${port}
98+
default_backend tcp_${port}_out
99+
%{endfor~}
100+
101+
%{for port in var.lb_udp_ports[*]~}
102+
frontend udp_${port}_in
103+
bind *:${port}
104+
default_backend udp_${port}_out
105+
%{endfor~}
106+
107+
%{for port in var.lb_tcp_ports[*]~}
108+
backend tcp_${port}_out
109+
mode tcp
110+
%{for node in mgc_virtual_machine_instances.node_instances[*]~}
111+
server ${node.name} ${node.network.private_address}:${port} check
112+
%{endfor~}
113+
114+
%{endfor~}
115+
116+
%{for port in var.lb_udp_ports[*]~}
117+
backend udp_${port}_out
118+
mode udp
119+
%{for node in mgc_virtual_machine_instances.node_instances[*]~}
120+
server ${node.name} ${node.network.private_address}:${port} check
121+
%{endfor~}
122+
123+
%{endfor~}
124+
EOT
125+
# destination = "/etc/haproxy/haproxy.cfg"
126+
destination = "/home/debian/haproxy.cfg"
127+
}
128+
129+
provisioner "remote-exec" {
130+
inline = [
131+
"sudo mv /home/debian/haproxy.cfg /etc/haproxy/haproxy.cfg",
132+
"sudo service haproxy restart",
133+
]
134+
}
135+
136+
connection {
137+
type = "ssh"
138+
user = "debian"
139+
private_key = file(var.ssh_private_key_path)
140+
host = mgc_virtual_machine_instances.cluster_lb.network.public_address
141+
}
142+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
terraform {
2+
required_providers {
3+
mgc = {
4+
source = "magalucloud/mgc"
5+
version = "0.29.2"
6+
}
7+
}
8+
}
9+
10+
# resource "mgc_network_vpcs" "cluster_vpc" {
11+
# name = "${var.project_name}-vpc"
12+
# description = "${var.project_name}-vpc"
13+
# }
14+
15+
resource "mgc_network_security_groups" "ssh_sec_group" {
16+
name = "${var.project_name}-ssh-sec-group"
17+
}
18+
19+
resource "mgc_network_security_groups" "instances_sec_group" {
20+
name = "${var.project_name}-workers-sec-group"
21+
}
22+
23+
resource "mgc_network_security_groups" "lb_sec_group" {
24+
name = "${var.project_name}-lb-sec-group"
25+
}
26+
27+
resource "mgc_network_security_groups_rules" "allow_ssh" {
28+
direction = "ingress"
29+
ethertype = "IPv4"
30+
port_range_max = 22
31+
port_range_min = 22
32+
protocol = "tcp"
33+
remote_ip_prefix = "0.0.0.0/0"
34+
security_group_id = mgc_network_security_groups.ssh_sec_group.id
35+
}
36+
37+
resource "mgc_network_security_groups_rules" "allow_tcp" {
38+
for_each = toset([for port in var.allowed_tcp_ports : tostring(port)])
39+
direction = "ingress"
40+
ethertype = "IPv4"
41+
port_range_max = each.key
42+
port_range_min = each.key
43+
protocol = "tcp"
44+
remote_ip_prefix = "0.0.0.0/0"
45+
security_group_id = mgc_network_security_groups.instances_sec_group.id
46+
}
47+
48+
resource "mgc_network_security_groups_rules" "allow_udp" {
49+
for_each = toset([for port in var.allowed_udp_ports : tostring(port)])
50+
direction = "ingress"
51+
ethertype = "IPv4"
52+
port_range_max = each.key
53+
port_range_min = each.key
54+
protocol = "udp"
55+
remote_ip_prefix = "0.0.0.0/0"
56+
security_group_id = mgc_network_security_groups.instances_sec_group.id
57+
}
58+
59+
resource "mgc_network_security_groups_rules" "allow_tcp_lb" {
60+
for_each = toset([for port in var.lb_tcp_ports : tostring(port)])
61+
direction = "ingress"
62+
ethertype = "IPv4"
63+
port_range_max = each.key
64+
port_range_min = each.key
65+
protocol = "tcp"
66+
remote_ip_prefix = "0.0.0.0/0"
67+
security_group_id = mgc_network_security_groups.lb_sec_group.id
68+
}
69+
70+
resource "mgc_network_security_groups_rules" "allow_udp_lb" {
71+
for_each = toset([for port in var.lb_udp_ports : tostring(port)])
72+
direction = "ingress"
73+
ethertype = "IPv4"
74+
port_range_max = each.key
75+
port_range_min = each.key
76+
protocol = "tcp"
77+
remote_ip_prefix = "0.0.0.0/0"
78+
security_group_id = mgc_network_security_groups.lb_sec_group.id
79+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# output "vpc_id" {
2+
# value = mgc_network_vpcs.cluster_vpc.id
3+
# }
4+
5+
output "nodes_sec_group_id" {
6+
value = mgc_network_security_groups.instances_sec_group.id
7+
}
8+
9+
output "lb_sec_group_id" {
10+
value = mgc_network_security_groups.lb_sec_group.id
11+
}
12+
13+
output "ssh_sec_group_id" {
14+
value = mgc_network_security_groups.ssh_sec_group.id
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
provider "mgc" {
2+
alias = "sudeste"
3+
region = "br-se1"
4+
api_key = var.api_key
5+
}
6+
7+
# provider "mgc" {
8+
# alias = "nordeste"
9+
# region = "br-ne1"
10+
# api_key = var.api_key
11+
# }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
variable "project_name" {
2+
type = string
3+
}
4+
5+
variable "allowed_udp_ports" {
6+
type = list(number)
7+
default = []
8+
}
9+
10+
variable "allowed_tcp_ports" {
11+
type = list(number)
12+
default = []
13+
}
14+
15+
variable "lb_tcp_ports" {
16+
type = list(number)
17+
default = []
18+
}
19+
20+
variable "lb_udp_ports" {
21+
type = list(number)
22+
default = []
23+
}
24+
25+
variable "api_key" {
26+
description = "MGC_API_KEY"
27+
type = string
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
output "cluster_info" {
2+
value = <<-EOT
3+
Cluster:
4+
Cluter Size: ${var.cluster_size}
5+
Marjority: ${local.cluster_majority}
6+
Minority: ${local.cluster_minority}
7+
Bastion/LB IP: ${mgc_virtual_machine_instances.cluster_lb.network.public_address}
8+
EOT
9+
}
10+
11+
resource "local_file" "hosts_ini" {
12+
filename = var.hosts_ini_path
13+
content = <<-EOT
14+
[bastion]
15+
${mgc_virtual_machine_instances.cluster_lb.network.public_address}
16+
17+
[nodes]
18+
%{for node in mgc_virtual_machine_instances.node_instances[*]~}
19+
${node.network.private_address} ansible_ssh_common_args="-J debian@${mgc_virtual_machine_instances.cluster_lb.network.public_address}"
20+
%{endfor~}
21+
22+
[all]
23+
${mgc_virtual_machine_instances.cluster_lb.network.public_address}
24+
%{for node in mgc_virtual_machine_instances.node_instances[*]~}
25+
${node.network.private_address} ansible_ssh_common_args="-J debian@${mgc_virtual_machine_instances.cluster_lb.network.public_address}"
26+
%{endfor~}
27+
EOT
28+
}
29+
30+
31+
# output "haproxy_cfg" {
32+
# value = <<-EOT
33+
# %{for port in var.lb_tcp_ports[*]~}
34+
# frontend tcp_${port}_in
35+
# bind *:${port}
36+
# default_backend tcp_${port}_out
37+
# %{endfor~}
38+
39+
# %{for port in var.lb_udp_ports[*]~}
40+
# frontend udp_${port}_in
41+
# bind *:${port}
42+
# default_backend udp_${port}_out
43+
# %{endfor~}
44+
45+
# %{for port in var.lb_tcp_ports[*]~}
46+
# backend tcp_${port}_out
47+
# mode tcp
48+
# %{for node in mgc_virtual_machine_instances.node_instances[*]~}
49+
# server ${node.name} ${node.network.private_address}:${port} check
50+
# %{endfor~}
51+
52+
# %{endfor~}
53+
54+
# %{for port in var.lb_udp_ports[*]~}
55+
# backend udp_${port}_out
56+
# mode udp
57+
# %{for node in mgc_virtual_machine_instances.node_instances[*]~}
58+
# server ${node.name} ${node.network.private_address}:${port} check
59+
# %{endfor~}
60+
61+
# %{endfor~}
62+
# EOT
63+
# }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
provider "mgc" {
2+
alias = "sudeste"
3+
region = "br-se1"
4+
api_key = var.api_key
5+
}
6+
7+
# provider "mgc" {
8+
# alias = "nordeste"
9+
# region = "br-ne1"
10+
# api_key = var.api_key
11+
# }
12+
13+
provider "time" {}

0 commit comments

Comments
 (0)