Skip to content

Bare Metal Basic Example

Deploys a Qumulo cluster on bare metal nodes via SSH.

Prerequisites

  • 3+ bare metal servers running Ubuntu, Debian, RHEL, Rocky Linux, or CentOS
  • SSH access to each node (key or password auth)
  • Nodes must have internet access to download Qumulo packages from S3
  • Port 8000 open between nodes for REST API communication

Usage

  1. Edit main.tf with your values (look for <-- Replace comments in the Full Configuration below):
  2. Replace node IPs with your server addresses
  3. Optionally set cluster_version to pin a specific version (defaults to latest)
  4. Adjust ssh_private_key_path if your key is not at ~/.ssh/id_rsa
  5. Run:
terraform init -upgrade
terraform plan -var="admin_password=YourSecurePassword123"
terraform apply -var="admin_password=YourSecurePassword123"

What It Does

  1. SSHes into each node and installs Qumulo Core (parallel)
  2. Waits for the REST API to become available on all nodes
  3. Forms the nodes into a cluster via the first node
  4. Waits for the cluster to reach ACTIVE state
  5. Stores the cluster UUID and endpoint in Terraform state

Notes

  • All configuration fields are immutable after creation (cluster_name, cluster_version, etc.)
  • Deleting the resource only removes it from Terraform state; the cluster keeps running
  • If terraform apply is interrupted, re-running it is safe (idempotent)
  • Import an existing cluster: terraform import qumulo_filesystem_baremetal.cluster baremetal

Full Configuration

# Example: Basic Bare Metal Qumulo Cluster
# This example shows the minimal configuration for deploying a Qumulo cluster
# on bare metal nodes via SSH. No cloud credentials are needed.
# Edit the values below, then run: terraform init -upgrade && terraform apply

terraform {
  required_version = ">= 1.0"
  required_providers {
    qumulo = {
      source  = "qumulo-terraform-registry.s3.us-east-1.amazonaws.com/qumulo/qumulo"
      version = "~> 1.0"
    }
  }
}

variable "admin_password" {
  description = "Administrator password for the Qumulo cluster (min 8 characters)"
  type        = string
  sensitive   = true
}

variable "ssh_private_key_path" {
  description = "Path to SSH private key file for node access"
  type        = string
  default     = "~/.ssh/id_rsa"
}

provider "qumulo" {
  connection_profiles = [
    {
      name                 = "baremetal"
      endpoint             = "https://10.0.1.10:8000" # <-- Replace: first node IP, port 8000
      username             = "admin"
      password             = var.admin_password
      insecure_skip_verify = true # Self-signed certs on unclustered nodes

      nodes = [
        {
          ip              = "10.0.1.10" # <-- Replace: node 1 IP
          ssh_private_key = file(var.ssh_private_key_path)
        },
        {
          ip              = "10.0.1.11" # <-- Replace: node 2 IP
          ssh_private_key = file(var.ssh_private_key_path)
        },
        {
          ip              = "10.0.1.12" # <-- Replace: node 3 IP
          ssh_private_key = file(var.ssh_private_key_path)
        },
      ]
    },
  ]
}

resource "qumulo_filesystem_baremetal" "cluster" {
  connection_profile = "baremetal"

  cluster_name   = "prod" # 2-15 alphanumeric characters
  admin_password = var.admin_password

  # cluster_version = "7.7.2"  # Optional: omit to use latest available version

  # Optional: erasure-coding protection settings (0 = cluster auto-selects)
  # blocks_per_stripe  = 6
  # max_drive_failures = 2
  # max_node_failures  = 1
}

output "cluster_uuid" {
  description = "UUID of the Qumulo cluster"
  value       = qumulo_filesystem_baremetal.cluster.cluster_uuid
}

output "endpoint" {
  description = "HTTPS management endpoint"
  value       = qumulo_filesystem_baremetal.cluster.endpoint
}

output "node_ips" {
  description = "IP addresses of all cluster nodes"
  value       = qumulo_filesystem_baremetal.cluster.node_ips
}