Skip to content
Snippets Groups Projects
Select Git revision
  • 9a71654c2df6eaa5583ca336572d44c6a0634d8c
  • master default protected
  • rednatco-v2
  • base-pairs-ladder
  • rednatco
  • test
  • ntc-tube-uniform-color
  • ntc-tube-missing-atoms
  • restore-vertex-array-per-program
  • watlas2
  • dnatco_new
  • cleanup-old-nodejs
  • webmmb
  • fix_auth_seq_id
  • update_deps
  • ext_dev
  • ntc_balls
  • nci-2
  • plugin
  • bugfix-0.4.5
  • nci
  • v0.5.0-dev.1
  • v0.4.5
  • v0.4.4
  • v0.4.3
  • v0.4.2
  • v0.4.1
  • v0.4.0
  • v0.3.12
  • v0.3.11
  • v0.3.10
  • v0.3.9
  • v0.3.8
  • v0.3.7
  • v0.3.6
  • v0.3.5
  • v0.3.4
  • v0.3.3
  • v0.3.2
  • v0.3.1
  • v0.3.0
41 results

misc.ts

Blame
  • deploy.tf 4.48 KiB
    provider "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
    
    merge_type:
      - name: list
        settings: [append]
      - name: dict
        settings: [recurse_array]
    %{ 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
        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 = format("%s.%s", data.template_file.user_data_common[count.index].vars.host, var.domain)
    	flavor_name = var.flavor
    	image_name = var.image
    	key_pair = var.ssh
    	security_groups = [
    		openstack_networking_secgroup_v2.all.name,
    		openstack_networking_secgroup_v2.ssh.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.%s", data.template_file.user_data_common[floor(count.index / var.volumes) + 1].vars.host, local.ord[count.index % var.volumes], var.domain)
    	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
    }
    
    resource "random_password" "secrets" {
    	count = 3
    	length = "36"
    	keepers = {
    		masterid = openstack_compute_instance_v2.server[0].id
    	}
    }
    
    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 = {
    			http_signature_secret = random_password.secrets[0].result,
    			kerberos_admin_password = random_password.secrets[1].result,
    			kerberos_master_password = random_password.secrets[2].result,
    		},
    		volumes = var.volumes,
    	}
    	sensitive = true
    }
    
    output "hosts" {
    	value = {
    		for instance in openstack_compute_instance_v2.server:
    			data.template_file.user_data_common[index(openstack_compute_instance_v2.server[*].id, instance.id)].vars.host => 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
    	}
    }