Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,8 @@ all.yaml
buffer
patroni/automation/.terraform/
patroni/automation/tmp/
inventory.yaml
*.tfstate
*.tfstate.*
*.hcl
tmp
23 changes: 0 additions & 23 deletions patroni/automation/inventory/inventory.yaml

This file was deleted.

32 changes: 32 additions & 0 deletions patroni/automation/inventory/inventory_sample.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# db_server:
# hosts:
# node-1:
# ansible_host: 10.0.10.60
# ansible_user: ubuntu
# update_name: true
# node-2:
# ansible_host: 10.0.10.61
# ansible_user: ubuntu
# update_name: true
#
# etcd_server:
# hosts:
# node-1:
# ansible_host: 10.0.10.60
# ansible_user: ubuntu
# update_name: false
# node-2:
# ansible_host: 10.0.10.61
# ansible_user: ubuntu
# update_name: false
# node-3:
# ansible_host: 10.0.10.70
# ansible_user: ubuntu
# update_name: true
#
# ca_server:
# hosts:
# node-1:
# ansible_host: 10.0.10.70
# ansible_user: ubuntu
# update_name: false
5 changes: 0 additions & 5 deletions patroni/automation/inventory/proxy_server.yaml

This file was deleted.

220 changes: 22 additions & 198 deletions patroni/automation/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -20,216 +20,40 @@ terraform {
required_version = ">= 1.1.0"
}

provider "aws" {
region = local.region
}

resource "aws_key_pair" "pg_ha-pkey" {
key_name = local.ssh_key_name
public_key = local.ssh_pub_key_value

tags = {
PerconaCreatedBy = local.percona_user
}
}

resource "aws_vpc" "pg_ha-vpc" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = true
enable_dns_support = true

tags = {
Name = local.vpc_name
Product = local.product
Team = local.team
Owner = local.owner
Environment = local.environment
PerconaCreatedBy = local.percona_user
}
}

resource "aws_internet_gateway" "pg_ha-gw" {
vpc_id = aws_vpc.pg_ha-vpc.id

tags = {
Name = local.gw_name
Product = local.product
Team = local.team
Owner = local.owner
Environment = local.environment
PerconaCreatedBy = local.percona_user
}
}

resource "aws_route_table" "pg_ha-router" {
vpc_id = aws_vpc.pg_ha-vpc.id

route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.pg_ha-gw.id
}

tags = {
Name = local.router_name
Product = local.product
Team = local.team
Owner = local.owner
Environment = local.environment
PerconaCreatedBy = local.percona_user
}
}


resource "aws_subnet" "pg_ha-priv_subnet" {
vpc_id = aws_vpc.pg_ha-vpc.id
cidr_block = "10.0.1.0/24"
map_public_ip_on_launch = true
availability_zone = local.av-zone

tags = {
Name = local.priv_subnet_name
Product = local.product
Team = local.team
Owner = local.owner
Environment = local.environment
PerconaCreatedBy = local.percona_user
}
}

resource "aws_route_table_association" "pg_ha-priv_subnet-router" {
subnet_id = aws_subnet.pg_ha-priv_subnet.id
route_table_id = aws_route_table.pg_ha-router.id
}

resource "aws_security_group" "pg_ha-sg" {
name = "pg_ha-sg"
vpc_id = aws_vpc.pg_ha-vpc.id

ingress {
from_port = 0
to_port = 0
protocol = "tcp"
self = true
}
module "pg_ha" {
source = "./modules/pg_ha/aws/"

ingress {
from_port = 0
to_port = 0
protocol = "udp"
self = true
}
# AWS configuration block
region = "us-west-2"
zone = "us-west-2c"
ami = "ami-03f65b8614a860c29"

ingress {
from_port = 0
to_port = 0
protocol = -1
cidr_blocks = [aws_subnet.pg_ha-priv_subnet.cidr_block]
}

ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}

egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}

tags = {
Name = local.sg_name
Product = local.product
Team = local.team
Owner = local.owner
Environment = local.environment
PerconaCreatedBy = local.percona_user
}
}


############################### -- PostgreSQL pg_standby instances
resource "aws_ebs_volume" "pg_ha_node-vol" {
type = local.pg_vol_type
size = local.pg_vol_size
availability_zone = local.av-zone

tags = {
Name = "${local.pg_base_name}-${count.index + 1}-vol"
Product = local.product
Team = local.team
Owner = local.owner
Environment = local.environment
PerconaCreatedBy = local.percona_user
}
count = local.pg_num_nodes
}

resource "aws_instance" "pg_ha_node" {
# Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type
ami = local.ami
instance_type = local.pg_instance_type
subnet_id = aws_subnet.pg_ha-priv_subnet.id
key_name = local.ssh_key_name
availability_zone = local.av-zone

tags = {
Name = "${local.pg_base_name}-${count.index + 1}"
Product = local.product
Team = local.team
Owner = local.owner
Environment = local.environment
HostType = local.host_type_db
PerconaCreatedBy = local.percona_user
}

security_groups = [aws_security_group.pg_ha-sg.id]
count = local.pg_num_nodes

provisioner "remote-exec" {
inline = ["sudo hostnamectl set-hostname ${local.pg_base_name}-${count.index + 1}"]

connection {
type = "ssh"
user = local.ssh_user
private_key = file(local.ssh_priv_key_path)
host = self.public_ip
}
}

provisioner "local-exec" {
command = "ssh-keyscan -H ${self.public_ip} | tee -a ~/.ssh/known_hosts | tee ./tmp/known_hosts"
}
# Node block
pg_num_nodes = 2
dcs_num_nodes = 1
dcs_use_pg_node = true
}

resource "aws_volume_attachment" "pg_ha_node-att" {
device_name = local.pg_vol_device
volume_id = element(aws_ebs_volume.pg_ha_node-vol.*.id, count.index)
instance_id = element(aws_instance.pg_ha_node.*.id, count.index)
count = local.pg_num_nodes

# provisioner "local-exec" {
# command = "${local.ansible_cmd} -i ${element(aws_instance.pg_ha_node.*.public_ip, count.index)}, --private-key ${local.ssh_priv_key_path} ${local.ansible_secondary_playbook}"
# }
}
############################### -- PostgreSQL pg_standby instances END

############################### Inventory and Host servers
resource "local_file" "ansible_inventory" {
content = templatefile(
"./templates/inventory_db_server.tpl",
"./templates/ansible_inventory.tpl",
{
# Secondary
pg_db_pub_ip = aws_instance.pg_ha_node.*.public_ip,
pg_etcd_pub_ip = aws_instance.pg_ha_node.*.public_ip,
ssh_user = local.ssh_user,
#
pg_db_nodes = module.pg_ha.db_nodes,
pg_dcs_nodes = module.pg_ha.dcs_nodes,
}
)
filename = "./inventory/inventory.yaml"
}


output "db_nodes_dbg" {
value = module.pg_ha.db_nodes
}

output "dcs_nodes_dbg" {
value = module.pg_ha.dcs_nodes
}

############################### Host servers END
64 changes: 64 additions & 0 deletions patroni/automation/modules/pg_ha/aws/dcs_nodes.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
############################### -- PostgreSQL instances
resource "aws_ebs_volume" "dcs_ha_node-vol" {
type = var.dcs_vol_type
size = var.dcs_vol_size
availability_zone = var.zone

tags = {
Name = "${var.dcs_base_name}-${count.index + 1}-vol"
Product = var.product
Team = var.team
Owner = var.owner
Environment = var.environment
PerconaCreatedBy = var.percona_user
}

count = var.dcs_num_nodes
}

resource "aws_instance" "dcs_ha_node" {
# Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type
ami = var.ami
instance_type = var.dcs_instance_type
subnet_id = aws_subnet.pg_ha-priv_subnet.id
key_name = var.ssh_key_name
availability_zone = var.zone

tags = {
Name = "${var.dcs_base_name}-${count.index + 1}"
Product = var.product
Team = var.team
Owner = var.owner
Environment = var.environment
HostType = var.host_type_db
PerconaCreatedBy = var.percona_user
}

security_groups = [aws_security_group.pg_ha-sg.id]

provisioner "remote-exec" {
inline = ["sudo hostnamectl set-hostname ${var.dcs_base_name}-${count.index + 1}"]

connection {
type = "ssh"
user = var.ssh_user
private_key = file(var.ssh_priv_key_path)
host = self.public_ip
}
}

provisioner "local-exec" {
command = "ssh-keyscan -H ${self.public_ip} | tee -a ~/.ssh/known_hosts | tee ./tmp/known_hosts"
}

depends_on = [aws_security_group.pg_ha-sg]
count = var.dcs_num_nodes
}

resource "aws_volume_attachment" "dcs_ha_node-att" {
device_name = var.dcs_vol_device
volume_id = element(aws_ebs_volume.dcs_ha_node-vol.*.id, count.index)
instance_id = element(aws_instance.dcs_ha_node.*.id, count.index)
count = var.dcs_num_nodes
}
############################### -- PostgreSQL instances END
Loading