_support/terraform/terraform/main.tf (219 lines of code) (raw):
variable "project" { default = "gitlab-internal-153318" }
variable "demo_region" { default = "us-east4" }
variable "demo_zone" { default = "us-east4-c" }
variable "praefect_demo_cluster_name" { }
variable "ssh_user" { }
variable "ssh_pubkey" { }
variable "os_image" { default = "ubuntu-os-cloud/ubuntu-1804-lts" }
variable "gitlab_root_password" { }
variable "startup_script" {
default = <<EOF
set -e
if [ -d /opt/gitlab ] ; then exit; fi
curl -s https://packages.gitlab.com/install/repositories/gitlab/nightly-builds/script.deb.sh | sudo bash
sudo apt-get install -y gitlab-ee
EOF
}
variable "gitaly_machine_type" { default = "n1-standard-2" }
variable "praefect_machine_type" { default = "n1-standard-1" }
variable "gitaly_disk_size" { default = "100" }
variable "praefect_disk_size" { default = "10" }
variable "praefect_sql_password" { }
provider "google" {
version = "~> 3.90"
project = var.project
region = var.demo_region
zone = var.demo_zone
}
resource "random_id" "db_name_suffix" {
byte_length = 4
}
resource "google_compute_address" "pgbouncer" {
name = "${var.praefect_demo_cluster_name}-praefect-pgbouncer"
}
resource "google_sql_database_instance" "praefect_sql" {
# It appears CloudSQL does not like Terraform re-using database names.
# Adding a random ID prevents name reuse.
name = "${var.praefect_demo_cluster_name}-praefect-postgresql-${random_id.db_name_suffix.hex}"
database_version = "POSTGRES_12"
region = var.demo_region
deletion_protection = false
settings {
tier = "db-f1-micro"
database_flags {
name = "log_min_duration_statement"
value = "500"
}
ip_configuration{
ipv4_enabled = true
authorized_networks {
name = "allow-${google_compute_address.pgbouncer.name}"
value = google_compute_address.pgbouncer.address
}
dynamic authorized_networks {
for_each = google_compute_instance.praefect
iterator = praefects
content {
name = "allow-${praefects.value.name}"
value = praefects.value.network_interface.0.access_config.0.nat_ip
}
}
}
}
}
output "praefect_pgbouncer_ip" {
value = module.pgbouncer.private_ip_address
}
output "praefect_postgres_ip" {
value = google_sql_database_instance.praefect_sql.public_ip_address
}
resource "google_sql_user" "users" {
name = "praefect"
instance = google_sql_database_instance.praefect_sql.name
password = var.praefect_sql_password
deletion_policy = "ABANDON"
}
resource "google_sql_database" "praefect-database" {
name = "praefect_production"
instance = google_sql_database_instance.praefect_sql.name
}
module "pgbouncer" {
source = "christippett/cloud-sql-pgbouncer/google"
version = "~>1.1"
project = var.project
name = "${var.praefect_demo_cluster_name}-pgbouncer"
zone = var.demo_zone
subnetwork = "default"
public_ip_address = google_compute_address.pgbouncer.address
port = 5432
database_host = google_sql_database_instance.praefect_sql.public_ip_address
users = [
{ name = google_sql_user.users.name, password = google_sql_user.users.password, admin = true },
]
auth_query = "SELECT usename, passwd FROM pg_shadow WHERE usename=$1"
}
resource "google_compute_instance" "gitlab" {
name = format("%s-gitlab", var.praefect_demo_cluster_name)
machine_type = "n1-standard-2"
boot_disk {
initialize_params {
image = var.os_image
size = var.gitaly_disk_size
}
}
network_interface {
subnetwork = "default"
access_config {}
}
metadata = {
ssh-keys = format("%s:%s", var.ssh_user, var.ssh_pubkey)
startup-script = <<EOF
${var.startup_script}
GITLAB_ROOT_PASSWORD=${var.gitlab_root_password} gitlab-ctl reconfigure
EOF
}
tags = ["http-server", "https-server"]
}
output "gitlab_internal_ip" {
value = google_compute_instance.gitlab.network_interface[0].network_ip
}
output "gitlab_external_ip" {
value = google_compute_instance.gitlab.network_interface[0].access_config[0].nat_ip
}
resource "google_compute_instance" "praefect" {
count = 3
name = "${var.praefect_demo_cluster_name}-praefect-${count.index + 1}"
machine_type = var.praefect_machine_type
boot_disk {
initialize_params {
image = var.os_image
size = var.praefect_disk_size
}
}
network_interface {
subnetwork = "default"
access_config {}
}
metadata = {
ssh-keys = format("%s:%s", var.ssh_user, var.ssh_pubkey)
startup-script = var.startup_script
}
}
resource "google_compute_instance_group" "praefect-cluster" {
name = "${var.praefect_demo_cluster_name}-praefect-cluster"
instances = google_compute_instance.praefect.*.self_link
named_port {
name = "praefect-transport"
port = "2305"
}
}
resource "google_compute_forwarding_rule" "praefect-forwarding-rule" {
name = "${var.praefect_demo_cluster_name}-praefect-lb"
load_balancing_scheme = "INTERNAL"
backend_service = google_compute_region_backend_service.praefect-lb.self_link
ports = ["2305"]
}
resource "google_compute_region_backend_service" "praefect-lb" {
name = "${var.praefect_demo_cluster_name}-praefect-lb"
protocol = "TCP"
timeout_sec = 10
session_affinity = "NONE"
backend {
group = google_compute_instance_group.praefect-cluster.self_link
}
health_checks = [
google_compute_health_check.praefect-healthcheck.self_link
]
}
resource "google_compute_health_check" "praefect-healthcheck" {
name = "${var.praefect_demo_cluster_name}-praefect-healthcheck"
check_interval_sec = 5
timeout_sec = 5
tcp_health_check {
port = "2305"
}
}
output "praefect_loadbalancer_ip" {
value = google_compute_forwarding_rule.praefect-forwarding-rule.ip_address
}
output "praefect_internal_ip" {
value = {
for instance in google_compute_instance.praefect:
instance.name => instance.network_interface[0].network_ip
}
}
output "praefect_ssh_ip" {
value = {
for instance in google_compute_instance.praefect:
instance.name => instance.network_interface[0].access_config[0].nat_ip
}
}
resource "google_compute_instance" "gitaly" {
count = 3
name = "${var.praefect_demo_cluster_name}-gitaly-${count.index + 1}"
machine_type = var.gitaly_machine_type
boot_disk {
initialize_params {
image = var.os_image
size = var.gitaly_disk_size
}
}
network_interface {
subnetwork = "default"
access_config {}
}
metadata = {
ssh-keys = format("%s:%s", var.ssh_user, var.ssh_pubkey)
startup-script = var.startup_script
}
}
output "gitaly_internal_ip" {
value = {
for instance in google_compute_instance.gitaly:
instance.name => instance.network_interface[0].network_ip
}
}
output "gitaly_ssh_ip" {
value = {
for instance in google_compute_instance.gitaly:
instance.name => instance.network_interface[0].access_config[0].nat_ip
}
}