Skip to content

Deploy an Azure cluster from a custom image

When you finish, a three-node Qumulo cluster runs on your own VM image instead of the default Ubuntu 22.04 LTS image.

Before you start

  • A managed image or Azure Compute Gallery image ID, or the publisher, offer, SKU, and version of an Azure Marketplace image
  • For any v4 VM size in Azure VM sizes, a Gen2 image
  • A virtual network and subnet that meet the Azure network prerequisites
  • The Azure CLI signed in with az login, as an identity that holds the Azure permissions the provider needs
  • Terraform 1.11 or later

1. Choose the image

  • To run the nodes on an image you built or hardened yourself, use its resource ID as custom_image_id. The configuration in step 2 takes this path.
  • To run the nodes on a stock vendor image, such as RHEL, replace custom_image_id with a marketplace_image block. The two attributes cannot be set together.
  • To give the short-lived provisioner VM its own image, add provisioner_custom_image_id or provisioner_marketplace_image. Changing either one later never touches the nodes.

This block selects RHEL 9 from the Azure Marketplace.

marketplace_image = [{
  publisher = "RedHat"
  offer     = "RHEL"
  sku       = "9-lvm-gen2"
  version   = "latest"
}]
Image publisher offer sku
Ubuntu 22.04 LTS (the default) Canonical 0001-com-ubuntu-server-jammy 22_04-lts, or 22_04-lts-gen2 on v4 sizes
RHEL 8 RedHat RHEL 8-lvm-gen2
RHEL 9 RedHat RHEL 9-lvm-gen2

With version = "latest", each node runs whatever version Azure publishes on the day that node is created. Pin a concrete version when every node must run identical bits.

You now have one image for the nodes, and optionally a second one for the provisioner.

Warning

Changing custom_image_id or marketplace_image on a running cluster replaces every node while the cluster stays in service, and every node IP address changes.

2. Copy the configuration

Save this as main.tf in an empty directory.

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

provider "qumulo" {
  azure {
    subscription_id = "00000000-0000-0000-0000-000000000000" # <-- Replace with your subscription ID
  }
}

resource "qumulo_filesystem_azure" "cluster" {
  cluster_name             = "qumulo"
  deployment_name          = "qumulo"
  location                 = "eastus2" # <-- Replace with your region
  resource_group_name      = "rg-qumulo"
  subnet_id                = "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-network/providers/Microsoft.Network/virtualNetworks/vnet-main/subnets/subnet-qumulo" # <-- Replace with your subnet resource ID
  node_count               = 3
  vm_type                  = "Standard_L8s_v3"
  custom_image_id          = "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-images/providers/Microsoft.Compute/images/qumulo-node" # <-- Replace with your image resource ID
  cluster_product_type     = "HOT"
  storage_replication_type = "LRS"
  storage_class            = "STANDARD"
  admin_password           = "YourSecurePassword123!" # <-- Replace with your admin password
  allow_cidrs              = ["10.0.0.0/8"]           # <-- Replace with your client networks
  deletion_protection      = true
}

output "endpoint_ips" {
  value = qumulo_filesystem_azure.cluster.endpoint_ips
}

output "web_ui" {
  value = "https://${qumulo_filesystem_azure.cluster.endpoint_ips[0]}"
}

Replace the six values marked <-- Replace, and leave the rest as written. If you chose a separate provisioner image, add this line to the qumulo_filesystem_azure block.

provisioner_custom_image_id = "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-images/providers/Microsoft.Compute/images/qumulo-provisioner" # <-- Replace with your provisioner image ID

3. Apply

terraform init -upgrade
terraform plan
terraform apply

The plan ends with Plan: 1 to add, 0 to change, 0 to destroy. The apply runs for up to 90 minutes and ends with Apply complete! Resources: 1 added, 0 changed, 0 destroyed., followed by the endpoint_ips and web_ui outputs.

4. Check the cluster

Open the web_ui address in a browser on a network inside allow_cidrs, and accept the cluster's self-signed certificate. Sign in as admin with the password you set, and the web UI shows the cluster named qumulo.

Next

Combine your image with availability zones and private endpoints in Deploy a production Azure cluster. The qumulo_filesystem_azure reference lists every attribute, including custom_image_id and provisioner_marketplace_image.