Introduction
The Red Hat Ansible Automation Platform (AAP) provides enterprise-grade automation with a web UI, REST API, role-based access control, and centralized job scheduling. While production deployments typically use a multi-node architecture, a single-host installation with an internal PostgreSQL database is ideal for development, testing, proof-of-concept, and small team environments.
This guide walks through the complete installation process on a single RHEL host.
Prerequisites
System Requirements
| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 2 cores | 4+ cores |
| RAM | 4 GB | 8+ GB |
| Disk | 20 GB | 40+ GB |
| OS | RHEL 8.4+ or RHEL 9 | RHEL 9.x |
Software Requirements
- Red Hat subscription with Ansible Automation Platform entitlement
- RHEL 8.4+ or RHEL 9.x (x86_64)
- Python 3.8+ (included with RHEL 8/9)
- Root or sudo access
- DNS resolution configured for the host
Prepare the System
# Register with Red Hat
sudo subscription-manager register --username <your-username>
sudo subscription-manager attach --pool=<pool-id>
# Enable required repositories
sudo subscription-manager repos \
--enable ansible-automation-platform-2.3-for-rhel-9-x86_64-rpms
# Update the system
sudo dnf update -y
# Install required packages
sudo dnf install -y ansible-automation-platform-installer
Download the Installer
Download the installer bundle from the Red Hat Customer Portal:
- Navigate to access.redhat.com
- Download the Ansible Automation Platform Setup Bundle for your RHEL version
- Transfer to your host and extract:
tar xvf ansible-automation-platform-setup-bundle-*.tar.gz
cd ansible-automation-platform-setup-bundle-*/
Configure the Inventory File
The inventory file defines the installation topology. For a single-host deployment with internal database:
[automationcontroller]
host1.example.com node_type=hybrid
[all:vars]
admin_password='<set-a-strong-password>'
pg_host=''
pg_port='5432'
pg_database='awx'
pg_username='awx'
pg_password='<set-a-strong-password>'
pg_sslmode='prefer'
registry_url='registry.redhat.io'
registry_username='<registry-username>'
registry_password='<registry-password>'
Inventory Parameters Explained
| Parameter | Description |
|---|---|
[automationcontroller] | Hosts that run the automation controller |
node_type=hybrid | Acts as both controller (web UI/API) and execution node (runs jobs) |
admin_password | Password for the admin web UI user |
pg_host='' | Empty string = internal database on the same host |
pg_port | PostgreSQL port (default 5432) |
pg_database | Database name (default awx) |
pg_username | Database user (default awx) |
pg_password | PostgreSQL password (use a strong, unique password) |
pg_sslmode | PostgreSQL SSL mode (prefer, require, verify-full) |
registry_url | Container registry for execution environments |
registry_username | Red Hat Customer Portal username |
registry_password | Red Hat Customer Portal password |
Node Types
| Type | Description | Use Case |
|---|---|---|
hybrid | Controller + execution node | Single-host installs |
control | Controller only (web UI, API, scheduling) | Multi-node with separate execution |
execution | Execution only (runs playbooks) | Dedicated job runners |
hop | Network relay between controller and execution nodes | DMZ/segmented networks |
Run the Installation
sudo ./setup.sh
The installer runs an Ansible playbook that:
- Installs and configures PostgreSQL
- Installs the automation controller application
- Configures nginx as a reverse proxy
- Sets up Redis for caching
- Creates the admin user
- Pulls default execution environments from
registry.redhat.io
Installation typically takes 15-30 minutes depending on network speed and system resources.
Monitor Installation Progress
The installer provides verbose output. Watch for:
PLAY RECAP *********************************************************************
host1.example.com : ok=150 changed=75 unreachable=0 failed=0
If the installation fails, check the log:
cat /var/log/tower/setup-*.log
Post-Installation Steps
Access the Web UI
Open your browser and navigate to:
https://host1.example.com
Log in with:
- Username:
admin - Password: The
admin_passwordfrom your inventory file
Apply Your Subscription
- Navigate to Settings → Subscription
- Enter your Red Hat subscription credentials or upload a manifest file
- Accept the EULA
Verify the Installation
# Check service status
sudo automation-controller-service status
# Test the API
curl -k https://aap.example.com/api/v2/ping/
Expected API response:
{
"ha": false,
"version": "4.3.x",
"active_node": "host1.example.com",
"install_uuid": "...",
"instances": [
{
"node": "host1.example.com",
"node_type": "hybrid",
"heartbeat": "2024-01-15T10:30:00.000000Z",
"capacity": 50
}
]
}
Configure Firewall
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload
Configuring Your First Project
Add Credentials
- Navigate to Resources → Credentials
- Add Machine credential (SSH key or password for managed hosts)
- Add Source Control credential (for Git repositories)
Create an Inventory
- Navigate to Resources → Inventories
- Create a new inventory
- Add hosts or sync from a dynamic source (AWS, Azure, VMware)
Create a Project
- Navigate to Resources → Projects
- Link to your Git repository containing playbooks
- Set sync options (on launch, manual, or scheduled)
Launch a Job Template
- Navigate to Resources → Templates
- Create a new Job Template linking your project, inventory, and credentials
- Click Launch
Backup and Restore
Backup
sudo ./setup.sh -b
Creates a backup at /var/lib/awx/backup/.
Restore
sudo ./setup.sh -r
Upgrading
To upgrade to a newer version:
- Download the new installer bundle
- Use the same inventory file
- Run the installer:
sudo ./setup.sh
The installer detects the existing installation and performs an in-place upgrade.
Troubleshooting
Installation Fails at PostgreSQL Step
# Check PostgreSQL status
sudo systemctl status postgresql
# Check PostgreSQL logs
sudo journalctl -u postgresql
Web UI Not Accessible
# Check nginx
sudo systemctl status nginx
# Check automation controller services
sudo automation-controller-service status
# Check if ports are listening
sudo ss -tlnp | grep -E '(80|443)'
Performance Issues
For a single-host installation, monitor resource usage:
# Check memory (PostgreSQL + controller can use 4+ GB)
free -h
# Check disk space
df -h /var/lib/awx /var/lib/pgsql
# Check CPU load
top -bn1 | head -5
When to Use Single-Host vs Multi-Node
| Scenario | Architecture |
|---|---|
| Development/testing | Single host (this guide) |
| Small team (<10 users, <50 hosts) | Single host |
| Medium team (10-50 users) | Controller + external DB |
| Large enterprise | Multi-controller + execution nodes + external DB |
| High availability required | Multi-controller with HAProxy |
Related Articles
- What is Ansible AWX?
- Ansible AWX Guide
- How to Install Ansible
- Ansible Roles Guide
- Ansible For PostgreSQL By Examples
- Ansible Best Practices Guide
- Ansible Training Guide
Conclusion
A single-host Ansible Automation Platform installation provides the full enterprise automation experience — web UI, REST API, RBAC, job scheduling, and execution environments — without the complexity of multi-node architecture. It's the fastest path from download to running your first automated job, and it serves well for development, testing, small teams, and proof-of-concept deployments. When you outgrow it, the same inventory file pattern scales to multi-node architectures with separate controller, execution, and database hosts.