Created TF module "postgres"
Created TF project "ckan-catalogue-engines" see #28235
This commit is contained in:
parent
d79da0e5cd
commit
faf9658f26
|
@ -0,0 +1,103 @@
|
|||
# Define required providers
|
||||
terraform {
|
||||
required_version = ">= 0.14.0"
|
||||
required_providers {
|
||||
openstack = {
|
||||
source = "terraform-provider-openstack/openstack"
|
||||
version = ">= 1.54.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data "terraform_remote_state" "privnet_dns_router" {
|
||||
backend = "local"
|
||||
|
||||
config = {
|
||||
path = "../project-setup/terraform.tfstate"
|
||||
}
|
||||
}
|
||||
|
||||
#
|
||||
# Uses common_variables as module
|
||||
#
|
||||
module "common_variables" {
|
||||
source = "../../modules/common_variables"
|
||||
}
|
||||
|
||||
# Module used
|
||||
module "ssh_settings" {
|
||||
source = "../../modules/ssh-key-ref"
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# Creates the server group "ckan-catalogue", NB but I'm not using it!!!!
|
||||
#
|
||||
resource "openstack_compute_servergroup_v2" "ckan-catalogue" {
|
||||
name = "ckan-catalogue"
|
||||
policies = [module.common_variables.policy_list.soft_anti_affinity]
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# Postgres instances via "postgres" module
|
||||
#
|
||||
module "instance_postgres_via_module" {
|
||||
source = "../../modules/postgres"
|
||||
|
||||
# Postgres networking configuration.
|
||||
# NB. use this configuration by settings properly all the key fields
|
||||
# postgres_networking_data = {
|
||||
# description = "Data for the PostgreSQL server, including network CIDR and server IP"
|
||||
# networking_security_group_name = "my network security name"
|
||||
# network_cidr = "192.168.0.0/22"
|
||||
# server_ip = "192.168.0.5"
|
||||
# network_name = "the_network_name"
|
||||
# server_cidr = "192.168.0.5/22"
|
||||
# port_range_min = 5432
|
||||
# port_range_max = 5432
|
||||
# }
|
||||
|
||||
# Postgres instance
|
||||
postgres_instance_data = {
|
||||
postgres-ckan-dev = {
|
||||
name = "postgres-ckan-dev",
|
||||
description = "The Postgres ckan-dev instance",
|
||||
flavor = module.common_variables.flavor_list.m1_large,
|
||||
networks = [data.terraform_remote_state.privnet_dns_router.outputs.main_private_network.name, module.common_variables.networks_list.shared_postgresql],
|
||||
security_groups = [data.terraform_remote_state.privnet_dns_router.outputs.default_security_group_name, data.terraform_remote_state.privnet_dns_router.outputs.security_group_list.http_and_https_from_the_load_balancers],
|
||||
server_groups_ids = [],
|
||||
image_ref = module.common_variables.ubuntu_2204,
|
||||
volume = {
|
||||
name = "postgres-ckan-dev_data_volume",
|
||||
size = "20",
|
||||
device = "/dev/vdb",
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# Solr instances via "instance_with_data_volume" module
|
||||
#
|
||||
module "instance_with_data_volume" {
|
||||
source = "../../modules/instance_with_data_volume"
|
||||
|
||||
instances_with_data_volume_map = {
|
||||
solr-ckan-dev = {
|
||||
name = "solr-ckan-dev",
|
||||
description = "The Solr ckan-dev instance",
|
||||
flavor = module.common_variables.flavor_list.m1_large,
|
||||
networks = [data.terraform_remote_state.privnet_dns_router.outputs.main_private_network.name],
|
||||
security_groups = [data.terraform_remote_state.privnet_dns_router.outputs.default_security_group_name, data.terraform_remote_state.privnet_dns_router.outputs.security_group_list.http_and_https_from_the_load_balancers],
|
||||
server_groups_ids = [],
|
||||
image_ref = module.common_variables.ubuntu_2204,
|
||||
volume = {
|
||||
name = "solr-ckan-dev_data_volume",
|
||||
size = "20",
|
||||
device = "/dev/vdb"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
provider "openstack" {
|
||||
cloud = "d4s-dev"
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
|
||||
# Default instances without data volume is EMPTY. Override it to create a proper instance plan
|
||||
variable "ckan_instances" {
|
||||
type = list(string)
|
||||
default = ["ckan-dev"]
|
||||
}
|
|
@ -0,0 +1,139 @@
|
|||
####################################################################################################################################################################
|
||||
#
|
||||
# Optional configuration for networking on Postgres
|
||||
#
|
||||
####################################################################################################################################################################
|
||||
|
||||
# Security group for ingress to PostgreSQL
|
||||
resource "openstack_networking_secgroup_v2" "postgresql_networking_ingress" {
|
||||
count = length(var.postgres_networking_data["networking_security_group_name"]) > 0 ? 1 : 0
|
||||
|
||||
name = "${var.postgres_networking_data["networking_security_group_name"]}_ingress"
|
||||
delete_default_rules = true
|
||||
description = "Access to the PostgreSQL service using the dedicated network"
|
||||
}
|
||||
|
||||
# Ingress rule for PostgreSQL
|
||||
resource "openstack_networking_secgroup_rule_v2" "postgresql_ingress_rule" {
|
||||
count = length(var.postgres_networking_data["networking_security_group_name"]) > 0 ? 1 : 0
|
||||
|
||||
security_group_id = openstack_networking_secgroup_v2.postgresql_networking_ingress[0].id
|
||||
description = "Allow connections to port ranges ${var.postgres_networking_data["port_range_min"]} / ${var.postgres_networking_data["port_range_max"]} from the dedicated ${var.postgres_networking_data["network_cidr"]} network"
|
||||
direction = "ingress"
|
||||
ethertype = "IPv4"
|
||||
protocol = "tcp"
|
||||
port_range_min = var.postgres_networking_data["port_range_min"]
|
||||
port_range_max = var.postgres_networking_data["port_range_max"]
|
||||
remote_ip_prefix = var.postgres_networking_data["network_cidr"]
|
||||
}
|
||||
|
||||
# Security group for egress from VM to PostgreSQL server
|
||||
resource "openstack_networking_secgroup_v2" "postgresql_egress" {
|
||||
count = length(var.postgres_networking_data["networking_security_group_name"]) > 0 ? 1 : 0
|
||||
|
||||
name = "${var.postgres_networking_data["networking_security_group_name"]}_egress"
|
||||
delete_default_rules = true
|
||||
description = "Access to the shared PostgreSQL service from the VM port in the dedicated network"
|
||||
}
|
||||
|
||||
# Egress rule for PostgreSQL (TCP)
|
||||
resource "openstack_networking_secgroup_rule_v2" "postgresql_egress_rule_tcp" {
|
||||
count = length(var.postgres_networking_data["networking_security_group_name"]) > 0 ? 1 : 0
|
||||
|
||||
security_group_id = openstack_networking_secgroup_v2.postgresql_egress[0].id
|
||||
description = "Allow egress connections to port/s on the PostgreSQL server"
|
||||
direction = "egress"
|
||||
ethertype = "IPv4"
|
||||
protocol = "tcp"
|
||||
port_range_min = var.postgres_networking_data["port_range_min"]
|
||||
port_range_max = var.postgres_networking_data["port_range_max"]
|
||||
remote_ip_prefix = var.postgres_networking_data["server_cidr"]
|
||||
}
|
||||
|
||||
# Egress rule for PostgreSQL (ICMP)
|
||||
resource "openstack_networking_secgroup_rule_v2" "postgresql_egress_rule_icmp" {
|
||||
for_each = length(var.postgres_networking_data["networking_security_group_name"]) > 0 ? { "egress_icmp_rule" : var.postgres_networking_data } : {}
|
||||
|
||||
security_group_id = openstack_networking_secgroup_v2.postgresql_egress[0].id
|
||||
description = "Allow ICMP traffic to the PostgreSQL server"
|
||||
direction = "egress"
|
||||
ethertype = "IPv4"
|
||||
protocol = "icmp"
|
||||
remote_ip_prefix = var.postgres_networking_data["server_cidr"]
|
||||
}
|
||||
|
||||
####################################################################################################################################################################
|
||||
#
|
||||
# Posgres instance configuration
|
||||
#
|
||||
####################################################################################################################################################################
|
||||
|
||||
#Instance volume
|
||||
resource "openstack_blockstorage_volume_v3" "instance_data_volume" {
|
||||
for_each = var.postgres_instance_data
|
||||
name = each.value.volume.name
|
||||
size = each.value.volume.size
|
||||
}
|
||||
|
||||
# Generic postgres_service instance
|
||||
resource "openstack_compute_instance_v2" "postgres_service" {
|
||||
for_each = var.postgres_instance_data
|
||||
name = each.value.name
|
||||
availability_zone_hints = module.common_variables.availability_zone_no_gpu_name
|
||||
flavor_name = each.value.flavor
|
||||
key_pair = module.ssh_settings.ssh_key_name
|
||||
security_groups = each.value.security_groups
|
||||
block_device {
|
||||
uuid = each.value.image_ref.uuid
|
||||
source_type = "image"
|
||||
volume_size = each.value.image_volume_size
|
||||
boot_index = 0
|
||||
destination_type = "volume"
|
||||
delete_on_termination = false
|
||||
}
|
||||
|
||||
# Creates the networks according to input networks
|
||||
dynamic "network" {
|
||||
for_each = each.value.networks
|
||||
content {
|
||||
name = network.value
|
||||
}
|
||||
}
|
||||
|
||||
# Creates the networks according to input networks
|
||||
dynamic "network" {
|
||||
for_each = length(var.postgres_networking_data["server_ip"]) > 0 ? { "server_ip" : var.postgres_networking_data["server_ip"] } : {}
|
||||
content {
|
||||
name = var.postgres_networking_data["network_name"]
|
||||
fixed_ip_v4 = var.postgres_networking_data["server_ip"]
|
||||
}
|
||||
}
|
||||
|
||||
# Creates the scheduler_hints (i.e. server groups) according to input server_groups_ids
|
||||
dynamic "scheduler_hints" {
|
||||
for_each = each.value.server_groups_ids
|
||||
content {
|
||||
group = scheduler_hints.value
|
||||
}
|
||||
}
|
||||
|
||||
# user_data script used
|
||||
user_data = file("${each.value.image_ref.user_data_file}")
|
||||
# Do not replace the instance when the ssh key changes
|
||||
lifecycle {
|
||||
ignore_changes = [
|
||||
# Ignore changes to tags, e.g. because a management agent
|
||||
# updates these based on some ruleset managed elsewhere.
|
||||
key_pair, user_data, network
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
# Attach the additional volume
|
||||
resource "openstack_compute_volume_attach_v2" "attach_volume" {
|
||||
for_each = var.postgres_instance_data
|
||||
instance_id = openstack_compute_instance_v2.postgres_service[each.key].id
|
||||
volume_id = openstack_blockstorage_volume_v3.instance_data_volume[each.key].id
|
||||
device = each.value.volume.device
|
||||
depends_on = [openstack_compute_instance_v2.postgres_service]
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
|
||||
output "postgres_instance_data" {
|
||||
value = var.postgres_instance_data
|
||||
}
|
||||
|
||||
output "postgres_networking_data" {
|
||||
value = var.postgres_networking_data
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
# Define required providers
|
||||
terraform {
|
||||
required_version = ">= 0.14.0"
|
||||
required_providers {
|
||||
openstack = {
|
||||
source = "terraform-provider-openstack/openstack"
|
||||
version = "~> 1.54.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# SSH settings
|
||||
module "ssh_settings" {
|
||||
source = "../../modules/ssh-key-ref"
|
||||
}
|
||||
|
||||
# Global variables (constants, really)
|
||||
module "common_variables" {
|
||||
source = "../../modules/common_variables"
|
||||
}
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
|
||||
# Variables.Override them to create a proper instance plan
|
||||
|
||||
# Postgres instances
|
||||
variable "postgres_instance_data" {
|
||||
type = map(object({
|
||||
name = string
|
||||
description = string
|
||||
flavor = string
|
||||
networks = list(string)
|
||||
security_groups = list(string)
|
||||
server_groups_ids = list(string)
|
||||
image_ref = map(string)
|
||||
image_volume_size = optional(number, 10)
|
||||
volume = map(string)
|
||||
}))
|
||||
default = {
|
||||
smartgears_service = {
|
||||
name = "",
|
||||
description = "",
|
||||
flavor = "",
|
||||
networks = [],
|
||||
security_groups = [],
|
||||
server_groups_ids = [],
|
||||
image_ref = {},
|
||||
volume = {}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
# Postgres networking configuration.
|
||||
# NB. use this configuration by settings properly all the key fields
|
||||
variable "postgres_networking_data" {
|
||||
description = "Data for the PostgreSQL server, including network CIDR and server IP"
|
||||
type = map(string)
|
||||
# default = {
|
||||
# networking_security_group_name = "my network security name"
|
||||
# network_cidr = "192.168.0.0/22"
|
||||
# server_ip = "192.168.0.5"
|
||||
# network_name = "the_network_name"
|
||||
# server_cidr = "192.168.0.5/22"
|
||||
# port_range_min = 5432
|
||||
# port_range_max = 5432
|
||||
# }
|
||||
|
||||
default = {
|
||||
networking_security_group_name = ""
|
||||
network_cidr = ""
|
||||
server_ip = ""
|
||||
network_name = ""
|
||||
server_cidr = ""
|
||||
port_range_min = ""
|
||||
port_range_max = ""
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue