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.
| Feature | RACADM (Legacy) | Python + Redfish API |
|---|---|---|
| Protocol | SSH / IPMI | HTTPS (RESTful) |
| Data Format | Text (grep required) | JSON (native) |
| Cross-Platform | Different binaries | Pure Python, pip install requests |
| Concurrency | Serial only | Async or threaded, 10x faster |
| Error Handling | grep logs | try/except + HTTP status codes |
| Learning Curve | Low (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:
- Dell’s API docs are mediocre. The GitHub repo dell/iDRAC-Redfish-Scripting has examples, but you’ll be trial-and-erroring payload fields.
- Firmware updates are the biggest pain point. The
UpdateServiceendpoint works, but pointing it at Dell’s online repo is painfully slow. Host your own local repo. - 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
| Scenario | Recommended | Not Recommended |
|---|---|---|
| Batch BIOS Config | Redfish PATCH PendingAttributes | Manual per-server |
| Firmware Update | Local repo + SimpleUpdate | Online repo (too slow) |
| Concurrency | 5-10 threads with delays | 100+ concurrent (iDRAC dies) |
| Error Handling | Retry logic + logging | Bare exceptions |
| Security | Isolated mgmt VLAN + SSL | Public internet + verify=False |
| Credentials | Vault/Ansible Vault | Hardcoded 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.