Ops Notes

iDRAC 9 Automation with Python: Taming 200 Dell Servers Like a Pro

Infrastructure Visualization

Let’s cut the crap. If you’ve ever had to manually configure BIOS settings on 200 Dell PowerEdge servers one by one through the iDRAC web interface, you know the pain.

I hit this exact wall last year. Two hundred nodes, all needing identical iDRAC and BIOS configurations. My first instinct was RACADM. But after wrestling with SSH-based batch operations and cross-platform headaches, I switched to Python + Redfish API.

Best decision I made all year.

Redfish vs RACADM: Why I Switched

RACADM works. But it’s a pain for automation. Different versions for Windows and Linux, text-based output that you have to regex-parse, and serial execution that takes forever.

Redfish is a RESTful API over HTTPS. JSON in, JSON out. Python’s requests library handles everything.

FeatureRACADM (Legacy)Python + Redfish API
ProtocolSSH / IPMIHTTPS (RESTful)
Data FormatText (grep required)JSON (native)
Cross-PlatformDifferent binariesPure Python, pip install requests
ConcurrencySerial onlyAsync or threaded, 10x faster
Error Handlinggrep logstry/except + HTTP status codes
Learning CurveLow (but limited)Medium (but scalable)

I’m not parsing SSH text output in 2026. Period.

The Real Deal: Automating 200 Servers

Setup

pip install requests urllib3

That’s it. No RACADM installation, no SSH key management.

Core Script: Getting Server Info

import requests
import json
from requests.auth import HTTPBasicAuth

def get_idrac_data(idrac_ip, username, password, endpoint):
    url = f"https://{idrac_ip}/redfish/v1/{endpoint}"
    response = requests.get(
        url,
        auth=HTTPBasicAuth(username, password),
        verify=False,
        timeout=30
    )
    response.raise_for_status()
    return response.json()

# Example: Get system info
system_info = get_idrac_data("192.168.1.100", "root", "calvin", "Systems/System.Embedded.1")
print(json.dumps(system_info, indent=2))

Pro tip: verify=False is fine for lab testing. In production, install proper SSL certs on your iDRACs. Security audits will thank you.

Batch BIOS Configuration

This is where the magic happens. Setting BootMode to UEFI across 200 servers:

def set_bios_attribute(idrac_ip, username, password, attribute, value):
    url = f"https://{idrac_ip}/redfish/v1/Systems/System.Embedded.1/Bios/Settings"
    payload = {
        "Attributes": {
            attribute: value
        }
    }
    response = requests.patch(
        url,
        auth=HTTPBasicAuth(username, password),
        json=payload,
        verify=False,
        timeout=30
    )
    if response.status_code in [200, 202]:
        print(f"✅ {idrac_ip}: {attribute} set to {value}")
    else:
        print(f"❌ {idrac_ip}: Failed - {response.status_code}")

servers = ["192.168.1.100", "192.168.1.101", "192.168.1.102"]
for ip in servers:
    set_bios_attribute(ip, "root", "calvin", "BootMode", "Uefi")

This took 10 minutes for 200 servers. Manual? Three days, minimum.

The Pain Points Nobody Warns You About

Trap 1: Firmware Version Hell

iDRAC 9 firmware versions have different Redfish schemas. Some older versions don’t support PendingAttributes — you need to use Settings instead.

Fix: Check firmware version first:

fw_info = get_idrac_data(ip, user, pwd, "Managers/iDRAC.Embedded.1")
print(f"Firmware: {fw_info['FirmwareVersion']}")

If it’s below 4.x, expect some API incompatibilities. Learned this the hard way during a production rollout.

Trap 2: iDRACs Can’t Handle Mass Concurrency

I naively fired 50 requests simultaneously. The iDRACs stopped responding — their HTTP servers couldn’t handle the load.

Add throttling:

import time
from concurrent.futures import ThreadPoolExecutor

def batch_process(servers, func, max_workers=5):
    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        results = list(executor.map(func, servers))
    return results

Five concurrent workers. Don’t be greedy.

Trap 3: BIOS Changes Need a Reboot

Obvious, but easy to forget. PendingAttributes writes to staging. You need to reboot for changes to apply:

def reboot_server(idrac_ip, username, password):
    url = f"https://{idrac_ip}/redfish/v1/Systems/System.Embedded.1/Actions/ComputerSystem.Reset"
    payload = {"ResetType": "GracefulRestart"}
    response = requests.post(
        url,
        auth=HTTPBasicAuth(username, password),
        json=payload,
        verify=False,
        timeout=30
    )
    return response.status_code

What Reddit Doesn’t Tell You

Scrolling through recent discussions, everyone’s hyping Python automation. It’s great, but here’s the reality:

  1. Dell’s API docs are mediocre. The GitHub repo dell/iDRAC-Redfish-Scripting has examples, but you’ll be trial-and-erroring payload fields.
  2. Firmware updates are the biggest pain point. The UpdateService endpoint works, but pointing it at Dell’s online repo is painfully slow. Host your own local repo.
  3. Security is not optional. Someone on Reddit asked about exposing iDRAC to the public internet. Don’t. iDRAC is designed for a separate management network. Exposing it is asking for trouble.

Best Practices Cheat Sheet

ScenarioRecommendedNot Recommended
Batch BIOS ConfigRedfish PATCH PendingAttributesManual per-server
Firmware UpdateLocal repo + SimpleUpdateOnline repo (too slow)
Concurrency5-10 threads with delays100+ concurrent (iDRAC dies)
Error HandlingRetry logic + loggingBare exceptions
SecurityIsolated mgmt VLAN + SSLPublic internet + verify=False
CredentialsVault/Ansible VaultHardcoded in scripts

FAQ

Does Dell iDRAC have an API?

Yes. iDRAC implements the Redfish RESTful API standard, returning JSON. It’s the recommended automation approach. RACADM and IPMI are legacy options.

How to connect to iDRAC directly?

iDRAC has a dedicated network interface. Configure an IP address, then access via HTTPS (web UI), SSH (CLI), or REST API (Redfish). Default credentials are on the server chassis label.

Should iDRAC be on a separate network?

Absolutely. iDRAC is an out-of-band management interface. It belongs on an isolated management VLAN. Dell explicitly warns against connecting it to the public internet.

What is iDRAC Redfish?

Redfish is a RESTful API standard for hardware management. iDRAC implements it, allowing you to read sensors, modify BIOS settings, control power, update firmware, and more via HTTP requests. Think of it as managing servers like you’d manage a web app.

Final Thoughts

Python + iDRAC 9 Redfish API is the highest-ROI automation I’ve built in years. 200 lines of code saved three days of manual labor.

But don’t believe the hype. The firmware compatibility issues, concurrency limits, and documentation gaps are real. Start small — test on 3-5 servers before rolling out to 200.

Automation won’t solve every problem. But it’ll free you up from the soul-crushing grind of manual server configuration.

And honestly? That’s worth more than most people admit.