You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 lines
2.7 KiB
Terraform

terraform {
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
version = "2.62.0"
}
ct = {
source = "poseidon/ct"
version = "0.13.0"
}
template = {
source = "hashicorp/template"
version = "2.2.0"
}
null = {
source = "hashicorp/null"
version = "3.2.4"
}
}
}
variable "do_token" {
description = "DigitalOcean token"
type = string
}
variable "machines" {
type = list(string)
description = "Machine names, corresponding to machine-NAME.yaml.tmpl files"
}
variable "cluster_name" {
type = string
description = "Cluster name used as prefix for the machine names"
}
variable "ssh_keys" {
type = list(string)
description = "SSH public keys for user 'core' (and to register on Digital Ocean for the first)"
}
variable "server_type" {
type = string
default = "s-1vcpu-1gb"
description = "The server type to rent"
}
variable "datacenter" {
type = string
description = "The region to deploy in"
}
variable "flatcar_stable_version" {
type = string
description = "The Flatcar Stable release you want to use for the initial installation, e.g., 2605.12.0"
}
provider "digitalocean" {
token = var.do_token
}
resource "digitalocean_ssh_key" "first" {
name = var.cluster_name
public_key = var.ssh_keys.0
}
resource "digitalocean_custom_image" "flatcar" {
name = "flatcar-stable-${var.flatcar_stable_version}"
url = "https://stable.release.flatcar-linux.net/amd64-usr/${var.flatcar_stable_version}/flatcar_production_digitalocean_image.bin.bz2"
regions = [var.datacenter]
}
resource "digitalocean_droplet" "machine" {
for_each = toset(var.machines)
name = "${var.cluster_name}-${each.key}"
image = digitalocean_custom_image.flatcar.id
region = var.datacenter
size = var.server_type
ssh_keys = [digitalocean_ssh_key.first.fingerprint]
user_data = data.ct_config.machine-ignitions[each.key].rendered
lifecycle {
create_before_destroy = true
}
}
data "ct_config" "machine-ignitions" {
for_each = toset(var.machines)
# content = data.template_file.machine-configs[each.key].rendered
content = templatefile("${path.module}/cl/machine-${each.key}.yaml.tmpl", {
ssh_keys = jsonencode(var.ssh_keys),
name = each.key
})
strict = true
}
#data "template_file" "machine-configs" {
# for_each = toset(var.machines)
# template = file("${path.module}/cl/machine-${each.key}.yaml.tmpl")
# vars = {
# ssh_keys = jsonencode(var.ssh_keys)
# name = each.key
# }
#}
output "ip-addresses" {
value = {
for key in var.machines :
"${var.cluster_name}-${key}" => digitalocean_droplet.machine[key].ipv4_address
}
}