Files
Ansible/docs/install.md
T
2026-09-15 18:53:28 +02:00

287 lines
5.7 KiB
Markdown

# AIM Installation Guide
This guide installs AIM with `/etc/ansible/scripts` as the project root.
## Layout
``` text
/etc/ansible/scripts/
├── pyproject.toml
└── src/
└── aim/
/etc/ansible/.venv/
/usr/local/bin/aim -> /etc/ansible/.venv/bin/aim
```
The virtual environment is intentionally not stored in Git.
## 1. Prerequisites
On Debian/Ubuntu:
``` bash
sudo apt update
sudo apt install -y python3 python3-venv python3-pip
```
## 2. Rebuild the virtual environment
``` bash
sudo rm -rf /etc/ansible/.venv
sudo python3 -m venv /etc/ansible/.venv
sudo /etc/ansible/.venv/bin/python -m pip install --upgrade pip setuptools wheel
```
## 3. Install AIM
``` bash
sudo /etc/ansible/.venv/bin/python -m pip install -e /etc/ansible/scripts
```
Verify:
``` bash
ls -l /etc/ansible/.venv/bin/aim
/etc/ansible/.venv/bin/python -m pip check
```
## 4. Restore the system-wide command
``` bash
sudo ln -sfn /etc/ansible/.venv/bin/aim /usr/local/bin/aim
```
Verify:
``` bash
ls -l /usr/local/bin/aim
aim --version
```
## 5. Authorization group / using another GID
AIM authorization is group-based rather than root-based. The default
required group is:
``` text
srv_debsansible01_admins@bitformer.lan
```
AIM resolves the configured **group name** through the operating
system's NSS layer (for example local groups, SSSD or winbind). The
operator must have that group active as a primary or supplementary
group.
Do not hard-code a numeric GID into AIM merely because a particular
server uses a different GID. Numeric GIDs can differ between systems;
configure the appropriate group name and let NSS resolve its GID.
Inspect the default group and its resolved GID:
``` bash
getent group 'srv_debsansible01_admins@bitformer.lan'
```
Check the current user's active groups/GIDs:
``` bash
id
id -G
id -Gn
```
If another authorization group should be used, change AIM's **Required
Group** through:
``` text
Global Config
└── Required Group
```
For example, if the local/AD-backed group is:
``` text
ansible_operators
```
verify it first:
``` bash
getent group ansible_operators
```
Then configure `ansible_operators` as AIM's Required Group. AIM will use
the GID returned by NSS for that group.
After adding a user to a group, the login session may need to be renewed
before the supplementary group becomes active. Verify with `id` before
troubleshooting AIM authorization.
### Same group name, different GID
This is supported. For example, one server may resolve:
``` text
ansible_operators:x:1200:...
```
and another may resolve:
``` text
ansible_operators:x:48001:...
```
AIM should be configured with `ansible_operators`, not `1200` or
`48001`.
### Different group name
Configure the alternative group name in AIM Global Config and confirm:
``` bash
getent group '<group-name>'
id
```
If `getent` cannot resolve the group, fix NSS/SSSD/winbind/local group
resolution first.
## 6. Git-ignored runtime data
Important ignored data includes:
``` gitignore
.vscode/*
.venv/*
.ansible/*
secure/*
secure/keys/*
vault.yml
.ssh
*.msi
*.deb
*.rpm
**/.hosts.tsv
**/hosts.yml.aim-session.bak
**/hosts.aim-session.bak.yml
*.bak
```
For AIM inventory recovery, the critical persistent data is `vault.yml`
and inventory `.ssh/` content. Do not restore `.venv`; rebuild it.
## 7. Recover missing Vaults and SSH keys
Example restored backup:
``` text
/etc/ansible/inventories_RESTORED_20260915_152127
```
Active inventories:
``` text
/etc/ansible/inventories
```
### Dry run
``` bash
BACKUP="/etc/ansible/inventories_RESTORED_20260915_152127"
TARGET="/etc/ansible/inventories"
echo "=== vault.yml ==="
sudo find "$BACKUP" -type f -name 'vault.yml' -print0 |
while IFS= read -r -d '' src; do
rel="${src#"$BACKUP"/}"
dst="$TARGET/$rel"
if [ -e "$dst" ]; then
echo "KEEP $dst"
else
echo "RESTORE $src -> $dst"
fi
done
echo
echo "=== .ssh files ==="
sudo find "$BACKUP" -path '*/.ssh/*' -type f -print0 |
while IFS= read -r -d '' src; do
rel="${src#"$BACKUP"/}"
dst="$TARGET/$rel"
if [ -e "$dst" ]; then
echo "KEEP $dst"
else
echo "RESTORE $src -> $dst"
fi
done
```
### Restore
``` bash
BACKUP="/etc/ansible/inventories_RESTORED_20260915_152127"
TARGET="/etc/ansible/inventories"
sudo find "$BACKUP" -type f -name 'vault.yml' -print0 |
while IFS= read -r -d '' src; do
rel="${src#"$BACKUP"/}"
dst="$TARGET/$rel"
if [ -e "$dst" ]; then
echo "KEEP $dst"
continue
fi
sudo mkdir -p "$(dirname "$dst")"
sudo cp -a "$src" "$dst"
echo "RESTORED $dst"
done
sudo find "$BACKUP" -path '*/.ssh/*' -type f -print0 |
while IFS= read -r -d '' src; do
rel="${src#"$BACKUP"/}"
dst="$TARGET/$rel"
if [ -e "$dst" ]; then
echo "KEEP $dst"
continue
fi
sudo mkdir -p "$(dirname "$dst")"
sudo cp -a "$src" "$dst"
echo "RESTORED $dst"
done
```
`cp -a` preserves ownership, permissions and timestamps. Existing active
files are never overwritten.
Verify:
``` bash
sudo find /etc/ansible/inventories -type f -name 'vault.yml' -print | sort
sudo find /etc/ansible/inventories -path '*/.ssh/*' -type f -print | sort
sudo find /etc/ansible/inventories -path '*/.ssh/*' -type f -exec ls -l {} \;
```
Keep the restored backup until Vault and SSH access have been tested.
## 8. Final verification
``` bash
aim --version
/etc/ansible/.venv/bin/python -m pip check
aim
```
## Updating AIM
AIM is installed editable from `/etc/ansible/scripts`.
If its entry point needs recreation:
``` bash
sudo /etc/ansible/.venv/bin/python -m pip install -e /etc/ansible/scripts
sudo ln -sfn /etc/ansible/.venv/bin/aim /usr/local/bin/aim
```
Customer data under `/etc/ansible/inventories` is separate from the AIM
source installation.