Skip to content
Snippets Groups Projects
Commit 17e8b417 authored by Sebastian Rieger's avatar Sebastian Rieger
Browse files

initial version of terraform openstack example incl load balancer

parent a22eb50b
Branches
No related tags found
No related merge requests found
# Define CloudComp group number
variable "group_number" {
type = string
default = "30"
}
# Define OpenStack credentials, project config etc.
locals {
auth_url = "https://private-cloud.informatik.hs-fulda.de:5000/v3"
user_name = "CloudComp${var.group_number}"
user_password = "demo"
tenant_name = "CloudComp${var.group_number}"
network_name = "CloudComp${var.group_number}-net"
image_name = "Ubuntu 18.04 - Bionic Beaver - 64-bit - Cloud Based Image"
flavor_name = "m1.small"
region_name = "RegionOne"
}
# Define OpenStack provider
terraform {
required_version = ">= 0.14.0"
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
version = ">= 1.40.0"
}
}
}
# Configure the OpenStack Provider
provider "openstack" {
user_name = local.user_name
tenant_name = local.tenant_name
password = local.user_password
auth_url = local.auth_url
region = local.region_name
use_octavia = true
}
# import keypair
resource "openstack_compute_keypair_v2" "terraform-keypair" {
name = "my-terraform-pubkey"
#public_key = file("~/.ssh/id_rsa.pub")
}
# create api security group
resource "openstack_networking_secgroup_v2" "terraform-secgroup-api" {
name = "my-terraform-secgroup-api"
description = "for API services only"
}
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-api-rule-http" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 80
port_range_max = 80
#remote_ip_prefix = "0.0.0.0/0"
security_group_id = openstack_networking_secgroup_v2.terraform-secgroup-api.id
}
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-api-rule-ssh" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 22
port_range_max = 22
#remote_ip_prefix = "0.0.0.0/0"
security_group_id = openstack_networking_secgroup_v2.terraform-secgroup-api.id
}
# create worker security group
resource "openstack_networking_secgroup_v2" "terraform-secgroup-worker" {
name = "my-terraform-secgroup-worker"
description = "for services that run on a worker node"
}
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-worker-rule-ssh" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 22
port_range_max = 22
#remote_ip_prefix = "0.0.0.0/0"
security_group_id = openstack_networking_secgroup_v2.terraform-secgroup-worker.id
}
resource "openstack_networking_secgroup_v2" "terraform-secgroup-control" {
name = "my-terraform-secgroup-control"
description = "for services that run on a control node"
}
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-control-rule-ssh" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 22
port_range_max = 22
#remote_ip_prefix = "0.0.0.0/0"
security_group_id = openstack_networking_secgroup_v2.terraform-secgroup-control.id
}
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-control-rule-http" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 80
port_range_max = 80
#remote_ip_prefix = "0.0.0.0/0"
security_group_id = openstack_networking_secgroup_v2.terraform-secgroup-control.id
}
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-control-rule-rabbitmq" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 5672
port_range_max = 5672
remote_group_id = openstack_networking_secgroup_v2.terraform-secgroup-worker.id
security_group_id = openstack_networking_secgroup_v2.terraform-secgroup-control.id
}
# create services security group
resource "openstack_networking_secgroup_v2" "terraform-secgroup-services" {
name = "my-terraform-secgroup-services"
description = "for DB and AMQP services only"
}
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-services-rule-ssh" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 22
port_range_max = 22
#remote_ip_prefix = "0.0.0.0/0"
security_group_id = openstack_networking_secgroup_v2.terraform-secgroup-services.id
}
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-services-rule-http" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 80
port_range_max = 80
#remote_ip_prefix = "0.0.0.0/0"
security_group_id = openstack_networking_secgroup_v2.terraform-secgroup-services.id
}
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-services-rule-mysql-api" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 3306
port_range_max = 3306
remote_group_id = openstack_networking_secgroup_v2.terraform-secgroup-api.id
security_group_id = openstack_networking_secgroup_v2.terraform-secgroup-services.id
}
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-services-rule-rabbitmq-worker" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 5672
port_range_max = 5672
remote_group_id = openstack_networking_secgroup_v2.terraform-secgroup-worker.id
security_group_id = openstack_networking_secgroup_v2.terraform-secgroup-services.id
}
resource "openstack_networking_secgroup_rule_v2" "terraform-secgroup-services-rule-rabbitmq-api" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 5672
port_range_max = 5672
remote_group_id = openstack_networking_secgroup_v2.terraform-secgroup-api.id
security_group_id = openstack_networking_secgroup_v2.terraform-secgroup-services.id
}
###########################################################################
#
# create app-services instance
#
###########################################################################
resource "openstack_compute_instance_v2" "terraform-instance-app-services" {
name = "my-terraform-app-services"
image_name = local.image_name
flavor_name = local.flavor_name
key_pair = openstack_compute_keypair_v2.terraform-keypair.name
security_groups = [openstack_networking_secgroup_v2.terraform-secgroup-services.name]
network {
name = local.network_name
}
user_data = <<-EOF
#!/usr/bin/env bash
curl -L -s https://gogs.informatik.hs-fulda.de/srieger/cloud-computing-msc-ai-examples/raw/master/faafo/contrib/install.sh | bash -s -- \
-i database -i messaging
rabbitmqctl add_user faafo guest
rabbitmqctl set_user_tags faafo administrator
rabbitmqctl set_permissions -p / faafo ".*" ".*" ".*"
EOF
}
###########################################################################
#
# create app-api instances
#
###########################################################################
resource "openstack_compute_instance_v2" "terraform-instance-app-api-1" {
name = "my-terraform-app-api-1"
image_name = local.image_name
flavor_name = local.flavor_name
key_pair = openstack_compute_keypair_v2.terraform-keypair.name
security_groups = [openstack_networking_secgroup_v2.terraform-secgroup-api.name]
network {
name = local.network_name
}
user_data = <<-EOF
#!/usr/bin/env bash
curl -L -s https://gogs.informatik.hs-fulda.de/srieger/cloud-computing-msc-ai-examples/raw/master/faafo/contrib/install.sh | bash -s -- \
-i faafo -r api -m 'amqp://faafo:guest@${openstack_compute_instance_v2.terraform-instance-app-services.access_ip_v4}:5672/' \
-d 'mysql+pymysql://faafo:password@${openstack_compute_instance_v2.terraform-instance-app-services.access_ip_v4}:3306/faafo'
EOF
}
resource "openstack_compute_instance_v2" "terraform-instance-app-api-2" {
name = "my-terraform-app-api-2"
image_name = local.image_name
flavor_name = local.flavor_name
key_pair = openstack_compute_keypair_v2.terraform-keypair.name
security_groups = [openstack_networking_secgroup_v2.terraform-secgroup-api.id]
network {
name = local.network_name
}
user_data = <<-EOF
#!/usr/bin/env bash
curl -L -s https://gogs.informatik.hs-fulda.de/srieger/cloud-computing-msc-ai-examples/raw/master/faafo/contrib/install.sh | bash -s -- \
-i faafo -r api -m 'amqp://faafo:guest@${openstack_compute_instance_v2.terraform-instance-app-services.access_ip_v4}:5672/' \
-d 'mysql+pymysql://faafo:password@${openstack_compute_instance_v2.terraform-instance-app-services.access_ip_v4}:3306/faafo'
EOF
}
###########################################################################
#
# create worker instances
#
###########################################################################
resource "openstack_compute_instance_v2" "terraform-instance-app-worker-1" {
name = "my-terraform-app-worker-1"
image_name = local.image_name
flavor_name = local.flavor_name
key_pair = openstack_compute_keypair_v2.terraform-keypair.name
security_groups = [openstack_networking_secgroup_v2.terraform-secgroup-worker.id]
network {
name = local.network_name
}
user_data = <<-EOF
#!/usr/bin/env bash
curl -L -s https://gogs.informatik.hs-fulda.de/srieger/cloud-computing-msc-ai-examples/raw/master/faafo/contrib/install.sh | bash -s -- \
-i faafo -r worker -e 'http://${openstack_compute_instance_v2.terraform-instance-app-api-1.access_ip_v4}' -m 'amqp://faafo:guest@${openstack_compute_instance_v2.terraform-instance-app-services.access_ip_v4}:5672/'
EOF
}
resource "openstack_compute_instance_v2" "terraform-instance-app-worker-2" {
name = "my-terraform-app-worker-2"
image_name = local.image_name
flavor_name = local.flavor_name
key_pair = openstack_compute_keypair_v2.terraform-keypair.name
security_groups = [openstack_networking_secgroup_v2.terraform-secgroup-worker.id]
network {
name = local.network_name
}
user_data = <<-EOF
#!/usr/bin/env bash
curl -L -s https://gogs.informatik.hs-fulda.de/srieger/cloud-computing-msc-ai-examples/raw/master/faafo/contrib/install.sh | bash -s -- \
-i faafo -r worker -e 'http://${openstack_compute_instance_v2.terraform-instance-app-api-1.access_ip_v4}' -m 'amqp://faafo:guest@${openstack_compute_instance_v2.terraform-instance-app-services.access_ip_v4}:5672/'
EOF
}
###########################################################################
#
# create load balancer
#
###########################################################################
data "openstack_networking_network_v2" "network_1" {
name = local.network_name
}
resource "openstack_lb_loadbalancer_v2" "lb_1" {
vip_subnet_id = data.openstack_networking_network_v2.network_1.subnets[0]
}
resource "openstack_lb_listener_v2" "listener_1" {
protocol = "HTTP"
protocol_port = 80
loadbalancer_id = openstack_lb_loadbalancer_v2.lb_1.id
connection_limit = 1024
}
resource "openstack_lb_pool_v2" "pool_1" {
protocol = "HTTP"
lb_method = "ROUND_ROBIN"
listener_id = openstack_lb_listener_v2.listener_1.id
}
resource "openstack_lb_members_v2" "members_1" {
pool_id = openstack_lb_pool_v2.pool_1.id
member {
address = openstack_compute_instance_v2.terraform-instance-app-api-1.access_ip_v4
protocol_port = 80
}
member {
address = openstack_compute_instance_v2.terraform-instance-app-api-2.access_ip_v4
protocol_port = 80
}
}
resource "openstack_lb_monitor_v2" "monitor_1" {
pool_id = openstack_lb_pool_v2.pool_1.id
type = "HTTP"
delay = 5
timeout = 5
max_retries = 3
http_method = "GET"
url_path = "/"
expected_codes = 200
}
###########################################################################
#
# assign floating ip to load balancer
#
###########################################################################
resource "openstack_networking_floatingip_v2" "fip_1" {
pool = "public1"
port_id = openstack_lb_loadbalancer_v2.lb_1.vip_port_id
}
output "loadbalancer_vip_addr" {
value = openstack_networking_floatingip_v2.fip_1
}
#!/bin/bash
wget https://releases.hashicorp.com/terraform/0.14.10/terraform_0.14.10_linux_amd64.zip -O terraform_0.14.10_linux_amd64.zip
unzip -o terraform_0.14.10_linux_amd64.zip
#!/bin/bash
./terraform init
./terraform plan
./terraform apply
./terraform destroy
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment