# AIM Fresh Installation **Applies to:** AIM 3.3.0rc8\ **Canonical Ansible Core:** 2.19.11\ **Default controller root:** `/etc/ansible`\ **Supported AIM Python:** Python 3.11+ This guide is for a new AIM controller with no existing AIM source tree. It installs the complete source bundle, AIM's Python runtime dependencies, the separate canonical Ansible runtime, and the required Ansible collections. The AIM deployer deliberately does **not** install operating-system packages, Python dependencies, Ansible, collections, accounts, groups, services, or add-on executors. Provision those explicitly, then use the bundled deployer in `install` mode. AIM remains usable as a standalone product through the built-in `aim` terminal. Add-on execution is optional and disabled by default. ## 1. Obtain and verify the release Transfer both files through a trusted channel: ``` text AIM-Ansible-3.3.0rc8.zip AIM-Ansible-3.3.0rc8.zip.sha256 ``` The SHA-256 sidecar verifies file integrity; it is not a publisher signature. Stage the release outside `/etc/ansible`: ``` bash cd /var/tmp sha256sum -c AIM-Ansible-3.3.0rc8.zip.sha256 unzip AIM-Ansible-3.3.0rc8.zip cd aim-core-3.3.0rc8 ``` Do not extract the release directly over `/etc/ansible`. ## 2. Provision the controller prerequisites The controller needs: - Linux - Python 3.11 or newer for AIM - a separate Ansible runtime containing exactly `ansible-core==2.19.11` - the collections declared by `requirements.yml` - an operator-approved execution/service account and group policy - network and remote authentication prerequisites appropriate to the managed systems For the default configuration shipped in this release, review `scripts/aim.yml` before installation. In particular, these values are environment-specific and must not be accepted blindly: ``` yaml root_dir: /etc/ansible service_user: svc_bf-ansible required_group: srv_debsansible01_admins@bitformer.lan ``` Set them to the intended controller values after installation, or prepare a reviewed configuration before first operational use. ## 3. Create the AIM Python environment Keep AIM's Python environment separate from the canonical Ansible runtime and from add-on environments. Example: ``` bash sudo python3.11 -m venv /opt/aim/venv sudo /opt/aim/venv/bin/python -m pip install --upgrade pip sudo /opt/aim/venv/bin/python -m pip install \ 'ruamel.yaml>=0.18,<0.19' \ 'rich>=13,<15' ``` Verify it: ``` bash /opt/aim/venv/bin/python --version /opt/aim/venv/bin/python -c 'import ruamel.yaml, rich; print("AIM dependencies OK")' ``` The deployer uses this interpreter for the `aim` and `aimctl` launchers. It does not install or upgrade these dependencies itself. ## 4. Create the canonical Ansible runtime AIM 3.3.0rc8 is qualified against **ansible-core 2.19.11**. One clean layout is a separate virtual environment: ``` bash sudo python3.11 -m venv /opt/ansible/venv sudo /opt/ansible/venv/bin/python -m pip install --upgrade pip sudo /opt/ansible/venv/bin/python -m pip install 'ansible-core==2.19.11' ``` Verify the exact version: ``` bash /opt/ansible/venv/bin/ansible-playbook --version ``` The first version line must report Ansible Core 2.19.11. Do not silently substitute a newer Ansible Core release. ## 5. Install the required Ansible collections The source bundle declares: ``` yaml collections: - ansible.netcommon - name: ansible.windows version: ">=3.8.0,<4.0.0" - ansible.posix - community.windows - community.general - sophos.sophos_firewall - pfsensible.core ``` Install them with the canonical Ansible runtime: ``` bash sudo /opt/ansible/venv/bin/ansible-galaxy collection install \ -r requirements.yml ``` AIM 3.3.0rc8 requires `ansible.windows>=3.8.0,<4.0.0` for native reboot-state discovery. Other collection versions remain operator-approved and must be compatible with Ansible Core 2.19.11. AIM does not download or upgrade collections during source deployment. Verify collection discovery: ``` bash /opt/ansible/venv/bin/ansible-galaxy collection list ``` If collections are installed into a nonstandard path, configure `runtime.ansible_collections_path` in `scripts/aim.yml` after installation. ## 6. Preview the fresh installation For a fresh controller use `install`, not `update`. The default installation root is `/etc/ansible`, and the default launcher directory for a fresh installation is `/usr/local/bin`. Run a dry-run first: ``` bash sudo python3 deploy/deploy.py install \ --aim-python /opt/aim/venv/bin/python \ --dry-run ``` Review the complete plan. It should show source installation under `/etc/ansible` and creation of the `aim` and `aimctl` launchers. If using a nondefault controller root, provide both an explicit target and a dedicated command directory: ``` bash sudo python3 deploy/deploy.py install \ --target /srv/aim-controller \ --bin-dir /usr/local/libexec/aim-controller \ --aim-python /opt/aim/venv/bin/python \ --dry-run ``` Do not use a production launcher directory for a second development/test installation. ## 7. Apply the installation For a genuinely fresh tree there should be no active AIM jobs, but the deployer still requires explicit acknowledgement that source writers/runners are quiesced: ``` bash sudo python3 deploy/deploy.py install \ --aim-python /opt/aim/venv/bin/python \ --apply \ --quiesced ``` Then refresh shell command discovery: ``` bash hash -r command -v aim command -v aimctl aim --version aimctl --version ``` Expected product version: ``` text 3.3.0rc8 ``` The deployer verifies the installed launchers and source before reporting success. ## 8. Configure AIM Edit the installed controller configuration: ``` bash sudoedit /etc/ansible/scripts/aim.yml ``` At minimum review: ``` yaml root_dir: /etc/ansible service_user: required_group: runtime: ansible_playbook: /opt/ansible/venv/bin/ansible-playbook ansible_collections_path: "" private_key_owner: "" addons: execution_enabled: false ``` Keep `addons.execution_enabled: false` until add-on/service execution has been deliberately provisioned and accepted. `runtime.private_key_owner` affects newly generated keys only. It does not switch the execution UID, migrate existing keys, or grant filesystem access. Checkmk-specific controller settings under `maintenance.checkmk_agent` should be configured only when that functionality is required. ## 9. Establish inventories and customer data A fresh source installation does not create production inventories, Vault data, SSH keys, customer credentials, or customer-local configuration. The standard controller layout is: ``` text /etc/ansible/ ├── scripts/ │ ├── aim.yml │ └── ... ├── playbooks/ ├── roles/ ├── inventories/ └── requirements.yml ``` Customer inventories, Vault files, keys, and `.aim.yml` files are runtime/operator data and are intentionally absent from the release archive. Create or migrate them through the approved AIM/operator workflow. Never copy credentials into the source release or documentation. ## 10. Verify Core discovery Run: ``` bash aimctl capabilities ``` Confirm that the product/API information is correct and that expected capabilities are advertised. Then inspect the installed documentation: ``` text /etc/ansible/scripts/docs/README.md /etc/ansible/scripts/docs/SANITY.md /etc/ansible/scripts/docs/VALIDATION.md ``` `VALIDATION.md` records release-development evidence. It is not proof that this newly installed controller has passed managed-host acceptance. ## 11. Verify controller staging Before service/add-on execution, check controller-local Ansible staging: ``` bash aimctl staging-check ``` For a normal interactive/native installation, AIM checks the relevant controller staging paths. For a hardened service executor, run this check **inside the actual service sandbox under the real execution identity**. A successful `sudo -u` shell test does not reproduce systemd mount restrictions. With native defaults, both of these may matter: ``` text /.ansible/tmp /.ansible/tmp ``` If the service uses `ProtectHome=read-only`, retain that hardening and add only the narrow writable exception required for the private staging directory. Do not make the whole home writable, recursively change ownership, or disable service hardening. See: ``` text scripts/docs/EXECUTOR_STAGING.md ``` ## 12. Test the built-in terminal first AIM is an independent product. Validate the native terminal before introducing an add-on: ``` bash aim ``` Use a controlled test customer/host and follow `scripts/docs/SANITY.md`. Confirm inventory discovery, credentials/Vault handling, target selection, and an approved low-risk playbook before broader production use. ## 13. Optional add-on/service execution Add-on execution is **disabled by default**. Only after the controller and executor identity have been accepted should the operator deliberately enable it: ``` yaml addons: execution_enabled: true runtime: ansible_playbook: /opt/ansible/venv/bin/ansible-playbook ``` The public integration boundary is: ``` text aim.services.v1 aimctl ``` Do not have an add-on: - import `aim.ui` - parse AIM terminal output - patch Core - rewrite native Ansible commands - read/export private keys - invent its own inventory hierarchy or target outcomes - reconstruct structured operation results from debug/stdout The current add-on contracts are documented in: ``` text scripts/docs/ADDON_API.md scripts/docs/ADDON_SUPPORT.md scripts/docs/OPERATION_RESULTS.md ADDON_AGENTS.md ``` The v1 execution profile is same-UID. Cross-UID execution is not provided by this release. ## 14. Run the controller acceptance checklist Use the current checklist: ``` text scripts/docs/SANITY.md ``` For 3.3.0rc8, acceptance should include the structured operation-result path in addition to ordinary execution. A useful first reporting test is host-role detection. Confirm that the final result exposes the declared structured capability booleans without requiring the client to parse task output. Also exercise, as applicable: - inventory hierarchy - target outcome summaries - controller staging - summary and detail progress - disk-usage reporting - service recovery reporting - Checkmk reporting - Linux/Windows patch reporting - successful and mixed-result multi-host runs Do not promote a release candidate based only on source parsing or local simulated callback tests. ## 15. Recovery Fresh installation still creates protected deployment recovery data. The deployer prints its exact recovery directory under the default: ``` text /var/backups/aim-core/ ``` If installation validation fails, use the same release deployer and printed recovery directory: ``` bash sudo python3 deploy/deploy.py rollback \ --from-backup /var/backups/aim-core/RECOVERY-DIRECTORY \ --dry-run sudo python3 deploy/deploy.py rollback \ --from-backup /var/backups/aim-core/RECOVERY-DIRECTORY \ --apply \ --quiesced ``` A source rollback does not reverse remote Ansible work, dependency installation, account/group changes, or add-on state. ## Fresh-install completion checklist A fresh controller is not complete merely because `aim --version` works. Before production use confirm: - release ZIP checksum verified - AIM Python 3.11+ environment provisioned - AIM Python dependencies installed - canonical Ansible Core 2.19.11 provisioned separately - required Ansible collections installed and discoverable - full source installed with `deploy.py install` - `aim` and `aimctl` resolve to the intended installation - `scripts/aim.yml` reviewed for this controller - approved execution identity/group configured - inventory/Vault/key data established separately - `aimctl capabilities` succeeds - `aimctl staging-check` succeeds in every execution context - built-in terminal workflow accepted - managed-host sanity tests completed - add-on execution remains disabled unless separately provisioned and accepted - recovery location recorded and protected ## Related documentation - existing root `README.md` --- operator-owned and preserved; AIM does not overwrite it - `deploy/README.md` --- deployment and rollback mechanics - `scripts/docs/README.md` --- current documentation index - `scripts/docs/SANITY.md` --- controller acceptance checklist - `scripts/docs/VALIDATION.md` --- release-development evidence and limits - `scripts/docs/EXECUTOR_STAGING.md` --- hardened executor staging requirements - `scripts/docs/ADDON_API.md` --- public add-on API - `scripts/docs/ADDON_SUPPORT.md` --- current add-on support matrix - `scripts/docs/OPERATION_RESULTS.md` --- structured operation-result contract - `scripts/docs/PLAYBOOKS.md` --- catalog/playbook behavior - `scripts/docs/CHECKMK.md` --- Checkmk-specific behavior