ansible/scripts/inventory.sh
ilia c3e6caf9e8
All checks were successful
CI / skip-ci-check (push) Successful in 1m18s
CI / lint-and-test (push) Successful in 1m23s
CI / ansible-validation (push) Successful in 3m2s
CI / secret-scanning (push) Successful in 1m19s
CI / dependency-scan (push) Successful in 1m24s
CI / sast-scan (push) Successful in 2m32s
CI / license-check (push) Successful in 1m23s
CI / vault-check (push) Successful in 2m22s
CI / playbook-test (push) Successful in 2m25s
CI / container-scan (push) Successful in 1m51s
CI / sonar-analysis (push) Successful in 2m32s
CI / workflow-summary (push) Successful in 1m17s
refactor-servers-workstations-shell-monitoring (#4)
### Summary

This PR refactors the playbook layout to reduce duplication and make host intent clearer (servers vs workstations), splits monitoring by host type, and restores full Zsh setup for developers while keeping servers aliases-only.

### Key changes

- **New playbooks**
  - `playbooks/servers.yml`: baseline for server-class hosts (no desktop apps)
  - `playbooks/workstations.yml`: baseline for dev/desktop/local + **desktop apps only on `desktop` group**

- **Monitoring split**
  - `roles/monitoring_server`: server monitoring + intrusion prevention (includes `fail2ban`, sysstat)
  - `roles/monitoring_desktop`: desktop-oriented monitoring tooling
  - Updated playbooks to use the correct monitoring role per host type

- **Shell role: server-safe + developer-friendly**
  - `roles/shell` now supports two modes:
    - `shell_mode: minimal` (default): aliases-only, does not overwrite `.zshrc`
    - `shell_mode: full`: installs Oh My Zsh + Powerlevel10k + plugins and deploys a managed `.zshrc`
  - `playbooks/development.yml` and `playbooks/workstations.yml` use `shell_mode: full`
  - `playbooks/servers.yml` remains **aliases-only**

- **Applications**
  - Applications role runs only on `desktop` group (via `workstations.yml`)
  - Removed Brave installs/repo management
  - Added **CopyQ** to desktop apps (`applications_desktop_packages`)

- **Docs + architecture**
  - Added canonical doc tree under `project-docs/` (overview/architecture/standards/workflow/decisions)
  - Consolidated architecture docs: `docs/reference/architecture.md` is now a pointer to `project-docs/architecture.md`
  - Fixed broken doc links by adding the missing referenced pages under `docs/`

### Behavior changes (important)

- Desktop GUI apps install **only** on the `desktop` inventory group (not on servers, not on dev VMs unless they are in `desktop`).
- Dev/workstation Zsh is now provisioned in **full mode** (managed `.zshrc` + p10k).

### How to test (local CI parity)

```bash
make test
npm test
```

Optional dry runs (interactive sudo may be required):

```bash
make check
make check-local
```

### Rollout guidance

- Apply to a single host first:
  - Workstations: `make workstations HOST=<devhost>`
  - Servers: `make servers HOST=<serverhost>`
- Then expand to group runs.

Reviewed-on: #4
2026-01-01 22:11:24 -05:00

137 lines
4.3 KiB
Bash
Executable File

#!/bin/bash
# Dynamic inventory script - lists all installed tools and services
# Can be run on any managed host
# Colors
BOLD='\033[1m'
GREEN='\033[32m'
YELLOW='\033[33m'
BLUE='\033[34m'
RED='\033[31m'
RESET='\033[0m'
echo -e "${BOLD}=== Installed Software Inventory ===${RESET}\n"
# Function to check if command exists
cmd_exists() {
command -v "$1" >/dev/null 2>&1
}
# Function to get version
get_version() {
if cmd_exists "$1"; then
case "$1" in
node) node --version 2>/dev/null ;;
python3) python3 --version 2>/dev/null | awk '{print $2}' ;;
git) git --version 2>/dev/null | awk '{print $3}' ;;
docker) docker --version 2>/dev/null | awk '{print $3}' | tr -d ',' ;;
conda) conda --version 2>/dev/null | awk '{print $2}' ;;
jupyter) jupyter --version 2>/dev/null | head -1 | awk '{print $3}' ;;
R) R --version 2>/dev/null | head -1 | awk '{print $3}' ;;
yq) yq --version 2>/dev/null | awk '{print $NF}' ;;
btop) btop --version 2>/dev/null | head -1 | awk '{print $3}' ;;
*) echo "unknown" ;;
esac
fi
}
# Development Tools
echo -e "${YELLOW}Development Tools:${RESET}"
for tool in git node python3; do
version=$(get_version $tool)
if [ -n "$version" ]; then
printf " ${GREEN}${RESET} %-15s %s\n" "$tool" "$version"
else
printf " ${RED}${RESET} %-15s %s\n" "$tool" "not installed"
fi
done
# Data Science
echo -e "\n${YELLOW}Data Science Stack:${RESET}"
for tool in conda jupyter R; do
version=$(get_version $tool)
if [ -n "$version" ]; then
printf " ${GREEN}${RESET} %-15s %s\n" "$tool" "$version"
else
printf " ${RED}${RESET} %-15s %s\n" "$tool" "not installed"
fi
done
# Check Jupyter service
if systemctl is-active --quiet jupyter-notebook 2>/dev/null; then
echo -e " ${GREEN}${RESET} Jupyter service running"
else
echo -e " ${RED}${RESET} Jupyter service not running"
fi
# Container Platform
echo -e "\n${YELLOW}Container Platform:${RESET}"
version=$(get_version docker)
if [ -n "$version" ]; then
printf " ${GREEN}${RESET} %-15s %s\n" "docker" "$version"
if cmd_exists docker-compose; then
compose_version=$(docker-compose --version 2>/dev/null | awk '{print $NF}')
printf " ${GREEN}${RESET} %-15s %s\n" "docker-compose" "$compose_version"
fi
else
printf " ${RED}${RESET} %-15s not installed\n" "docker"
fi
# Monitoring Tools
echo -e "\n${YELLOW}Monitoring Tools:${RESET}"
for tool in htop btop iotop nethogs; do
if cmd_exists $tool; then
version=$(get_version $tool)
if [ "$version" = "unknown" ] || [ -z "$version" ]; then
printf " ${GREEN}${RESET} %-15s installed\n" "$tool"
else
printf " ${GREEN}${RESET} %-15s %s\n" "$tool" "$version"
fi
else
printf " ${RED}${RESET} %-15s not installed\n" "$tool"
fi
done
# CLI Utilities
echo -e "\n${YELLOW}CLI Utilities:${RESET}"
for tool in jq yq ripgrep fd; do
if cmd_exists $tool; then
version=$(get_version $tool)
if [ "$version" = "unknown" ] || [ -z "$version" ]; then
printf " ${GREEN}${RESET} %-15s installed\n" "$tool"
else
printf " ${GREEN}${RESET} %-15s %s\n" "$tool" "$version"
fi
else
printf " ${RED}${RESET} %-15s not installed\n" "$tool"
fi
done
# Shell
echo -e "\n${YELLOW}Shell Environment:${RESET}"
current_shell=$(basename "$SHELL")
printf " ${GREEN}${RESET} %-15s %s\n" "current shell" "$current_shell"
if [ -d "$HOME/.oh-my-zsh" ]; then
printf " ${GREEN}${RESET} %-15s installed\n" "oh-my-zsh"
fi
if [ -d "$HOME/.oh-my-zsh/custom/themes/powerlevel10k" ]; then
printf " ${GREEN}${RESET} %-15s installed\n" "powerlevel10k"
fi
# Services
echo -e "\n${YELLOW}System Services:${RESET}"
for service in docker tailscaled fail2ban sshd; do
if systemctl is-active --quiet $service 2>/dev/null; then
printf " ${GREEN}${RESET} %-15s running\n" "$service"
elif systemctl list-unit-files | grep -q "^$service"; then
printf " ${BLUE}${RESET} %-15s installed (not running)\n" "$service"
else
printf " ${RED}${RESET} %-15s not installed\n" "$service"
fi
done
echo ""