Secure Remote Desktop Access Windows via WSL and SSH Tunnel macOS
A room without books is like a body without a soul. - Marcus Tullius Cicero
When Azure CLI Met RHEL EUS: A Tale of Two Repositories đ
Picture this: Itâs Friday afternoon, youâre deploying your latest Azure infrastructure changes, and suddenly your trusty az
command throws a tantrum. The Azure CLI refuses to upgrade, Python versions are arguing with each other, and somewhere in the depths of your terminal, EUS repositories are quietly chuckling at your predicament.
Welcome to the wild world of enterprise Linux, where stability meets innovation in the most interesting ways possible.
The Plot Twist Nobody Saw Coming
Hereâs what happened to me last week. I was happily running Azure CLI commands on my RHEL 9.2 system when Microsoft dropped Azure CLI 2.75.0 with a seemingly innocent requirement: Python 3.12. Simple enough, right? Just update Python and move on.
Narrator: It was not simple enough.
$ yum install python3.12
No package python3.12 available.
Error: Unable to find a match: python3.12
Wait, what? This is RHEL 9! Python 3.12 should definitely be available. Time to investigate:
$ yum repolist
repo id repo name
codeready-builder-for-rhel-9-x86_64-eus-rhui-rpms Red Hat CodeReady Linux Builder for RHEL 9 x86_64 - Extended Update Support from RHUI (RPMs)
rhel-9-for-x86_64-appstream-eus-rhui-rpms Red Hat Enterprise Linux 9 for x86_64 - AppStream - Extended Update Support from RHUI (RPMs)
rhel-9-for-x86_64-baseos-eus-rhui-rpms Red Hat Enterprise Linux 9 for x86_64 - BaseOS - Extended Update Support from RHUI (RPMs)
Ah-ha! Thereâs the culprit hiding in plain sight. See those three little letters scattered throughout? EUS - Extended Update Support. My system was locked in time, like a digital Rip Van Winkle.
The EUS Revelation: When Stability Becomes a Prison
Extended Update Support isnât some obscure Linux feature that only beard-stroking sysadmins care about. Itâs actually one of the most ingenious solutions to a very real enterprise problem that affects millions of production systems worldwide.
The Enterprise Dilemma
Imagine youâre running a trading platform that processes millions of dollars per second. Your application is certified on RHEL 9.2, tested extensively, and has been running flawlessly for months. Then one day, a routine yum update
pulls in RHEL 9.4 with subtle changes that cause your trading algorithms to behave differently. The result? Potential financial losses that make your head of risk management break out in cold sweats.
This is where EUS comes to the rescue, like a time-traveling superhero with a very specific superpower.
EUS: The Digital Time Capsule
Extended Update Support essentially creates a âsnapshotâ of your RHEL minor version and says: âThis is your world now. Youâll get security patches and critical fixes, but no surprises.â Itâs like living in a neighborhood where the houses get security upgrades and fresh paint, but the street layout never changes.
Hereâs the beautiful part: EUS repositories are maintained separately for each supported minor version. So while the main RHEL 9 repositories march forward to 9.5, 9.6, and beyond, your EUS repositories stay frozen at 9.2, carefully curated to maintain perfect stability.
# Regular repos (the fast lane)
rhel-9-for-x86_64-baseos-rpms # Always latest (9.5, 9.6, etc.)
# EUS repos (the stability lane)
rhel-9.2-for-x86_64-baseos-eus-rpms # Forever 9.2
The Python 3.12 Predicament: When Innovation Meets Immutability
Now hereâs where it gets interesting. Python 3.12 was released in October 2023, but it only became available in RHEL starting with version 9.4. My system, locked in the EUS time capsule of 9.2, had no idea this shiny new Python version even existed.
This creates what I like to call the âInnovation Paradoxâ:
- Azure CLI (cloud-native, fast-moving): âI need Python 3.12 for all these cool new features!â
- RHEL EUS (enterprise-stable, slow-moving): âPython 3.11 has been working fine for months. Why change?â
Itâs like trying to run a Teslaâs software stack on a perfectly maintained 1990s Honda Civic. Both are excellent in their own right, but they have very different philosophies about change.
The Moment of Truth: Two Paths Diverged
Microsoftâs support team presented me with two elegant solutions, each with its own personality:
Option 1: The Surgical Strike (Enable Non-EUS Repos)
This is the âhave your cake and eat it tooâ approach. By temporarily switching to non-EUS repositories, you can selectively install Python 3.12 while keeping your OS at 9.2.
The Good: Minimal disruption, surgical precision The Drama: Youâre essentially creating a hybrid system with packages from different timelines
# The transformation spell
subscription-manager repos --disable="*eus*"
subscription-manager repos --enable="rhel-9-for-x86_64-baseos-rpms"
subscription-manager repos --enable="rhel-9-for-x86_64-appstream-rpms"
# Install Python 3.12
yum install python3.12
# Optionally switch back to EUS
subscription-manager repos --enable="*eus*"
subscription-manager repos --disable="rhel-9-for-x86_64-baseos-rpms"
subscription-manager repos --disable="rhel-9-for-x86_64-appstream-rpms"
Option 2: The Great Leap Forward (Upgrade to RHEL 9.4)
This is the âembrace the futureâ approach. Upgrade your entire system to RHEL 9.4, where Python 3.12 lives naturally.
The Good: Clean, consistent, future-proof The Commitment: Youâre leaving the EUS safety net for 9.2 behind
# The evolution command
subscription-manager repos --disable="*eus*"
yum update
# System becomes RHEL 9.4
The Hidden Wisdom: Why This Matters Beyond Azure CLI
This isnât just about Azure CLI or Python versions. This scenario perfectly illustrates one of the most fundamental tensions in modern IT infrastructure:
Stability vs. Innovation
Every enterprise faces this daily:
- Your security team wants the latest patches (innovation)
- Your compliance team wants zero changes (stability)
- Your developers want the newest tools (innovation)
- Your operations team wants predictable systems (stability)
EUS repositories represent Red Hatâs sophisticated answer to this eternal struggle. Theyâre not just technical constructs; theyâre peace treaties between competing organizational needs.
The Plot Resolution: What I Actually Did
After pondering the philosophical implications (and checking with our change management board), I chose Option 1 with a twist. Hereâs my battle-tested approach:
# 1. Document current state
yum repolist > repos_before.txt
rpm -qa > packages_before.txt
# 2. Temporarily switch to non-EUS
subscription-manager repos --disable="*eus*"
subscription-manager repos --enable="rhel-9-for-x86_64-appstream-rpms"
# 3. Install only what I need
yum install python3.12 python3.12-pip
# 4. Install Azure CLI with new Python
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
# 5. Switch back to EUS for future stability
subscription-manager repos --enable="*eus*"
subscription-manager repos --disable="rhel-9-for-x86_64-appstream-rpms"
# 6. Verify everything works
az --version
Result: Azure CLI 2.75.0 running happily with Python 3.12, while my system remains fundamentally rooted in the stability of RHEL 9.2 EUS.
The Bigger Picture: Lessons for Modern Infrastructure
This experience taught me something profound about modern infrastructure management:
1. Repositories Are Philosophies
Every repository represents a different approach to change management. EUS says âstability first,â while standard repos say âprogress first.â Neither is wrong; they serve different masters.
2. Hybrid Approaches Work
You donât always have to choose between all-stability or all-innovation. Sometimes the smartest move is a surgical strike that gets you exactly what you need.
3. Documentation Is Your Time Machine
Before making any repository changes, document your current state. Future you will thank present you when something unexpected happens.
4. Understanding the âWhyâ Changes Everything
Once I understood why EUS exists and what problem it solves, the entire situation made sense. It wasnât a barrier; it was a feature working exactly as designed.
The Technical Archaeology: What Your yum repolist
Really Tells You
Letâs decode what my repository list was actually saying:
rhel-9-for-x86_64-baseos-eus-rhui-rpms
Breaking this down:
rhel-9
: RHEL version 9 familyx86_64
: Architecture (Intel/AMD 64-bit)baseos
: Core operating system packageseus
: Extended Update Support (the key insight!)rhui
: Red Hat Update Infrastructure (Azure-specific delivery)rpms
: Package format
Each piece tells a story about how your system is configured and what its update philosophy is.
The Future-Proofing Strategy
Hereâs what Iâm implementing going forward:
1. Repository Awareness
Always check yum repolist
when mysterious package availability issues arise. Those three letters (EUS) can save you hours of debugging.
2. Hybrid Repository Strategy
For critical updates that arenât available in EUS, temporarily switch repositories, install what you need, then switch back. Document everything.
3. Change Management Integration
Make repository strategy part of your change management process. EUS vs. non-EUS isnât just a technical decision; itâs a business decision.
4. Monitoring and Alerting
Set up monitoring to alert when packages you depend on require newer base OS versions. This gives you lead time to plan upgrades.
The Epilogue: Why This Story Matters
This isnât just another âhow I fixed a Linux problemâ story. Itâs a microcosm of how modern enterprise infrastructure works. Every day, thousands of organizations face similar decisions: Do we prioritize stability or innovation? Do we upgrade everything or just what we need?
The beautiful thing about technologies like EUS is that they donât force you to choose. They give you options, each with clear trade-offs, and let you make informed decisions based on your specific needs.
My Azure CLI is now happily running with Python 3.12, my system remains stable on RHEL 9.2 EUS, and Iâve gained a deeper appreciation for the thoughtful engineering that goes into enterprise Linux distributions.
The Practical Takeaways
If you find yourself in a similar situation:
- Donât panic - This is a common scenario with well-understood solutions
- Check your repositories first -
yum repolist
is your friend - Understand your constraints - What does your organization require for stability vs. innovation?
- Document everything - Your future self will thank you
- Test thoroughly - Hybrid approaches work, but they need validation
The next time someone tells you that enterprise Linux is boring, show them this story. Behind every seemingly simple package installation lies a fascinating world of engineering trade-offs, organizational psychology, and the eternal tension between stability and progress.
And remember: when Azure CLI meets RHEL EUS, itâs not a conflictâitâs an opportunity to understand how modern infrastructure really works.
Have you faced similar repository conflicts in your infrastructure? What creative solutions did you discover? Share your stories in the comments below.