Skip to content

Collection map — Mermaid

Current runtime map for containerized AAP 2.6+. See ARCHITECTURE.md for design, TROUBLESHOOTING.md for SSH/rollback, and FINDINGS.md for historical installer research (RPM/OpenShift).

GitHub Mermaid notes: quote node labels that contain [, ], {, }, /, or $.


1. Scope

flowchart TB
  subgraph IN["In scope"]
    AAP["Containerized AAP 2.6+"]
    NODE["Add EN and/or HN"]
    ADD["Additive only - new hosts"]
    AWX["awx-manage via podman exec"]
    ZERO["Prefer outbound peer dial"]
  end

  subgraph OUT["Out of scope"]
    OCP["OpenShift / operator"]
    RPM["RPM installer"]
    V25["AAP 2.5 and earlier"]
    FULL["Full installer re-run"]
    GW["Gateway OAuth registration"]
  end

  COL["redhat_official.aap_containerized_add_node"] --> IN
  COL -.->|never| OUT

2. Playbook flow (playbooks/add_node.yml)

flowchart TD
  V[validate_setup_dir<br/>require containerized aap_setup_dir] --> D[discover_new_nodes]
  D --> L[list_instances<br/>assert_controller_container + awx-manage]
  L --> DIFF[Diff inventory vs ready hostnames<br/>heartbeat required to skip]
  DIFF -->|targets| M[fetch_mesh_material]
  M --> E[enable_controller_listener<br/>AIO local-only to tcp-listener]
  E --> H[host_prep<br/>containerized common]
  H --> C[fetch_or_mint_certs]
  C --> R[register_instance<br/>awx-manage sequence]
  R --> I[install_receptor_node<br/>containerized_installer.receptor]
  I --> VER[verify_mesh<br/>list_instances again]

3. Roles

flowchart LR
  subgraph entry["Entry"]
    PB["playbooks/add_node.yml"]
  end

  subgraph roles["roles/"]
    R0[validate_setup_dir]
    R1[assert_controller_container]
    R2[list_instances]
    R3[discover_new_nodes]
    R4[fetch_mesh_material]
    R5[enable_controller_listener]
    R6[host_prep]
    R7[fetch_or_mint_certs]
    R8[register_instance]
    R9[install_receptor_node]
    R10[verify_mesh]
  end

  PB --> R0
  R3 --> R2
  R2 --> R1
  R8 --> R1
  R10 --> R2
Role Purpose
validate_setup_dir Require aap_setup_dir with ansible.containerized_installer; reject RPM trees
assert_controller_container SSH ping + podman inspect (task container running)
list_instances podman exec … awx-manage list_instances (ANSI-stripped)
discover_new_nodes Diff [execution_nodes] vs ready hostnames → aap_add_node_targets
fetch_mesh_material Fetch mesh CA cert/key + work public key from controller ~/aap/…
enable_controller_listener Optional AIO: local-only → tcp-listener
host_prep ansible.containerized_installer.common on new nodes
fetch_or_mint_certs Mint node TLS with mesh CA on control host
register_instance provision_instance → add_receptor_address → register_peers → register_queue
install_receptor_node ansible.containerized_installer.receptor + minted certs
verify_mesh Re-check list_instances for new hostnames

4. Controller HA

Always groups['automationcontroller'][0]. Any controller works (awx-manage → shared DB); [0] is a stable SSH/podman target. Mesh CA is expected on each controller under the install-user home.


5. Discovery skip rule

flowchart TD
  INV[Inventory execution_nodes] --> CHK{Hostname has heartbeat<br/>in list_instances?}
  CHK -->|yes| SKIP[Skip - already healthy]
  CHK -->|no| ADD[Add to aap_add_node_targets]
  ADD --> NOTE[Includes provisioned-but-incomplete<br/>capacity=0 no heartbeat]

6. Register sequence

sequenceDiagram
  participant Op as Installer
  participant Ctrl as automationcontroller[0]
  participant EN as New EN/HN

  Op->>Ctrl: ping + podman inspect task container
  Op->>Ctrl: fetch mesh CA + work pubkey
  Op->>EN: host_prep (common) + mint TLS
  Op->>Ctrl: awx-manage provision_instance
  Op->>Ctrl: add_receptor_address
  Op->>Ctrl: register_peers --exact
  Op->>Ctrl: register_queue default + executionplane
  Op->>EN: containerized_installer.receptor
  Op->>Ctrl: list_instances verify