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

ResourceMinimumRecommended
CPU2 cores4+ cores
RAM4 GB8+ GB
Disk20 GB40+ GB
OSRHEL 8.4+ or RHEL 9RHEL 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:

  1. Navigate to access.redhat.com
  2. Download the Ansible Automation Platform Setup Bundle for your RHEL version
  3. 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

ParameterDescription
[automationcontroller]Hosts that run the automation controller
node_type=hybridActs as both controller (web UI/API) and execution node (runs jobs)
admin_passwordPassword for the admin web UI user
pg_host=''Empty string = internal database on the same host
pg_portPostgreSQL port (default 5432)
pg_databaseDatabase name (default awx)
pg_usernameDatabase user (default awx)
pg_passwordPostgreSQL password (use a strong, unique password)
pg_sslmodePostgreSQL SSL mode (prefer, require, verify-full)
registry_urlContainer registry for execution environments
registry_usernameRed Hat Customer Portal username
registry_passwordRed Hat Customer Portal password

Node Types

TypeDescriptionUse Case
hybridController + execution nodeSingle-host installs
controlController only (web UI, API, scheduling)Multi-node with separate execution
executionExecution only (runs playbooks)Dedicated job runners
hopNetwork relay between controller and execution nodesDMZ/segmented networks

Run the Installation

sudo ./setup.sh

The installer runs an Ansible playbook that:

  1. Installs and configures PostgreSQL
  2. Installs the automation controller application
  3. Configures nginx as a reverse proxy
  4. Sets up Redis for caching
  5. Creates the admin user
  6. 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_password from your inventory file

Apply Your Subscription

  1. Navigate to Settings → Subscription
  2. Enter your Red Hat subscription credentials or upload a manifest file
  3. 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

  1. Navigate to Resources → Credentials
  2. Add Machine credential (SSH key or password for managed hosts)
  3. Add Source Control credential (for Git repositories)

Create an Inventory

  1. Navigate to Resources → Inventories
  2. Create a new inventory
  3. Add hosts or sync from a dynamic source (AWS, Azure, VMware)

Create a Project

  1. Navigate to Resources → Projects
  2. Link to your Git repository containing playbooks
  3. Set sync options (on launch, manual, or scheduled)

Launch a Job Template

  1. Navigate to Resources → Templates
  2. Create a new Job Template linking your project, inventory, and credentials
  3. 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:

  1. Download the new installer bundle
  2. Use the same inventory file
  3. 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

ScenarioArchitecture
Development/testingSingle host (this guide)
Small team (<10 users, <50 hosts)Single host
Medium team (10-50 users)Controller + external DB
Large enterpriseMulti-controller + execution nodes + external DB
High availability requiredMulti-controller with HAProxy

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.