Skip to content
Snippets Groups Projects
Select Git revision
  • 48f5014ecb4def9a55d7c48d6ed83ab4b3e32d5d
  • master default protected
  • ci-bullseye
  • wip/bigtop-3.0.0
  • bio3
  • feature/certificates2
6 results

deploy.tf

Blame
  • deploy.tf 3.98 KiB
    provider "openstack" {
    	cloud="openstack"
    }
    
    terraform {
    	required_providers {
    		openstack = {
    			source= "terraform-provider-openstack/openstack"
    		}
    	}
    }
    
    locals {
    	ord = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
    	keyfile = "ssh-key.${var.domain}.txt"
    }
    
    data "openstack_compute_keypair_v2" "userkey" {
    	name = var.ssh
    }
    
    data "template_file" "user_data_common" {
    	count = var.n + 1
    	template = file("common/ctx.yaml")
    	vars = {
    		host = count.index == 0 ? var.master_hostname : "${var.node_hostname}${count.index}"
    		domain = var.domain
    	}
    }
    
    data "template_file" "user_data_deployment" {
    	template = file("deployments/${var.type}/ctx.yaml")
    }
    
    data "template_cloudinit_config" "ctx" {
    	count = var.n + 1
    	part {
    		content = data.template_file.user_data_common[count.index].rendered
    	}
    	part {
    		content = data.template_file.user_data_deployment.rendered
    	}
    	part {
    		content = <<EOT
    #cloud-config
    
    %{ if count.index != 0 ~}
    
    fs_setup:
    %{ for i in range(0, var.volumes) ~}
      - label: DATA${i + 1}
        filesystem: ext4
        device: /dev/sd${local.ord[i + 1]}
        partition: none
    %{ endfor ~}
    
    mounts:
    %{ for i in range(0, var.volumes) ~}
      - [ LABEL=DATA${i + 1}, /data/${i + 1} ]
    %{ endfor ~}
    %{ endif ~}
    
    users:
      - default
      - name: deployadm
        gecos: Deploy Admin
        shell: /bin/bash
        ssh_authorized_keys:
          - ${openstack_compute_keypair_v2.localkey.public_key}
        sudo:
          - ALL=(ALL) NOPASSWD:ALL
    %{ if count.index == 0 ~}
    
    write_files:
      - path: /home/deployadm/.ssh/id_rsa
        owner: deployadm:deployadm
        permissions: '0600'
        content: |
          ${indent(6, openstack_compute_keypair_v2.localkey.private_key)~}
    %{ endif ~}
    
    runcmd:
      - chown -R deployadm:deployadm /home/deployadm
    EOT
    	}
    }
    
    resource "openstack_compute_keypair_v2" "localkey" {
    	name = var.domain
    }
    
    resource "local_file" "localkey" {
        filename = local.keyfile
    	file_permission = "0600"
        sensitive_content = openstack_compute_keypair_v2.localkey.private_key
    }
    
    resource "openstack_compute_instance_v2" "server" {
    	count = var.n + 1
    	name = data.template_file.user_data_common[count.index].vars.host
    	flavor_name = var.flavor
    	image_name = var.image
    	key_pair = var.ssh
    	security_groups = [openstack_networking_secgroup_v2.secgroup.name]
    	user_data = data.template_cloudinit_config.ctx[count.index].rendered
    	network {
    		name = var.local_network
    	}
    }
    
    resource "openstack_networking_floatingip_v2" "floatip_1" {
    	pool = var.public_network
    }
    
    resource "openstack_compute_floatingip_associate_v2" "server-fip-1" {
    	floating_ip = openstack_networking_floatingip_v2.floatip_1.address
    	instance_id = openstack_compute_instance_v2.server[0].id
    	provisioner "local-exec" {
    		command = <<EOF
    echo Private IP: ${openstack_compute_instance_v2.server[0].network[0].fixed_ip_v4}
    echo Remote  IP: ${self.floating_ip}
    EOF
    	}
    }
    
    resource "openstack_blockstorage_volume_v3" "volume" {
    	count = var.volumes * var.n
    	name  = format("%s%s", data.template_file.user_data_common[floor(count.index / var.volumes) + 1].vars.host, local.ord[count.index % var.volumes])
    	size  = var.volume_size
    }
    
    resource "openstack_compute_volume_attach_v2" "volume-attach" {
    	count = var.volumes * var.n
    	instance_id = openstack_compute_instance_v2.server[floor(count.index / var.volumes) + 1].id
    	volume_id   = openstack_blockstorage_volume_v3.volume[count.index].id
    }
    
    variable "secrets" {
    	type = map(string)
    }
    
    output "config" {
    	value = {
    		n = var.n,
    		domain = var.domain,
    		image_user = var.image_user,
    		master_hostname = var.master_hostname,
    		node_hostname = var.node_hostname,
    		type = var.type,
    		secrets = var.secrets,
    		volumes = var.volumes,
    	}
    	sensitive = true
    }
    
    output "hosts" {
    	value = {
    		for instance in openstack_compute_instance_v2.server:
    			instance.name => length(instance.network) >= 1 ? instance.network[0].fixed_ip_v4 : null
    	}
    }
    
    output "public_hosts" {
    	value = {
    		(data.template_file.user_data_common[0].vars.host) = openstack_compute_floatingip_associate_v2.server-fip-1.floating_ip
    	}
    }