Initial commit: Matrix Ansible Controller
Portable Docker container for managing matrix-docker-ansible-deploy playbooks. - Dockerfile with Python 3.12, Ansible 2.17+, and all dependencies - docker-compose.yml with volume mounts for SSH, playbook, and inventory - entrypoint.sh for automatic setup (clone playbook, link inventory, install roles) - README.md with deployment and usage instructions
This commit is contained in:
commit
325ddfe012
5 changed files with 439 additions and 0 deletions
13
.gitignore
vendored
Normal file
13
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
# Data directory (contains cloned playbook, inventory with secrets, and cache)
|
||||||
|
data/
|
||||||
|
|
||||||
|
# Editor files
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*~
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# OS files
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
56
Dockerfile
Normal file
56
Dockerfile
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
# Matrix Ansible Controller
|
||||||
|
# Portable container for managing matrix-docker-ansible-deploy playbook
|
||||||
|
|
||||||
|
FROM python:3.12-alpine
|
||||||
|
|
||||||
|
LABEL maintainer="maddox"
|
||||||
|
LABEL description="Portable Ansible controller for matrix-docker-ansible-deploy"
|
||||||
|
|
||||||
|
# Install system dependencies
|
||||||
|
RUN apk add --no-cache \
|
||||||
|
git \
|
||||||
|
openssh-client \
|
||||||
|
bash \
|
||||||
|
curl \
|
||||||
|
rsync \
|
||||||
|
gcc \
|
||||||
|
musl-dev \
|
||||||
|
libffi-dev \
|
||||||
|
openssl-dev \
|
||||||
|
python3-dev \
|
||||||
|
just \
|
||||||
|
nano \
|
||||||
|
vim \
|
||||||
|
tmux \
|
||||||
|
jq
|
||||||
|
|
||||||
|
# Install Ansible and required Python packages
|
||||||
|
RUN pip install --no-cache-dir \
|
||||||
|
ansible>=2.17.0 \
|
||||||
|
passlib \
|
||||||
|
dnspython \
|
||||||
|
netaddr \
|
||||||
|
jmespath \
|
||||||
|
docker \
|
||||||
|
requests
|
||||||
|
|
||||||
|
# Create working directories
|
||||||
|
RUN mkdir -p /playbook /inventory /ssh
|
||||||
|
|
||||||
|
# Set up SSH directory with proper permissions
|
||||||
|
RUN mkdir -p /root/.ssh && chmod 700 /root/.ssh
|
||||||
|
|
||||||
|
# Copy entrypoint script
|
||||||
|
COPY entrypoint.sh /entrypoint.sh
|
||||||
|
RUN chmod +x /entrypoint.sh
|
||||||
|
|
||||||
|
# Set working directory to playbook
|
||||||
|
WORKDIR /playbook
|
||||||
|
|
||||||
|
# Default environment
|
||||||
|
ENV ANSIBLE_HOST_KEY_CHECKING=False
|
||||||
|
ENV ANSIBLE_FORCE_COLOR=True
|
||||||
|
ENV TERM=xterm-256color
|
||||||
|
|
||||||
|
ENTRYPOINT ["/entrypoint.sh"]
|
||||||
|
CMD ["/bin/bash"]
|
||||||
237
README.md
Normal file
237
README.md
Normal file
|
|
@ -0,0 +1,237 @@
|
||||||
|
# Matrix Ansible Controller
|
||||||
|
|
||||||
|
A portable Docker container for managing [matrix-docker-ansible-deploy](https://github.com/spantaleev/matrix-docker-ansible-deploy) playbooks. This container provides a consistent Ansible environment with all required dependencies pre-installed.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Python 3.12 with Ansible 2.17+
|
||||||
|
- All required Python packages (passlib, dnspython, netaddr, jmespath, docker)
|
||||||
|
- `just` command runner for simplified playbook execution
|
||||||
|
- Automatic playbook cloning and role installation
|
||||||
|
- Persistent storage for playbook, inventory, and Ansible cache
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
- Docker and Docker Compose
|
||||||
|
- SSH key pair that can authenticate to your Matrix server as root
|
||||||
|
- Your Matrix server inventory configuration (hosts file and vars.yml)
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
### 1. Clone this repository
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone ssh://git@git.3ddbrewery.com:2222/maddox/matrix-ansible-controller.git
|
||||||
|
cd matrix-ansible-controller
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Create the data directory structure
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mkdir -p data/inventory/host_vars/matrix.YOUR-DOMAIN.com
|
||||||
|
mkdir -p data/playbook
|
||||||
|
mkdir -p data/ansible-cache
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Create your inventory files
|
||||||
|
|
||||||
|
**Create `data/inventory/hosts`:**
|
||||||
|
|
||||||
|
```ini
|
||||||
|
# Matrix server inventory
|
||||||
|
# Replace YOUR-DOMAIN.com and YOUR-SERVER-IP with your values
|
||||||
|
|
||||||
|
[matrix_servers]
|
||||||
|
matrix.YOUR-DOMAIN.com ansible_host=YOUR-SERVER-IP ansible_ssh_user=root
|
||||||
|
```
|
||||||
|
|
||||||
|
**Create `data/inventory/host_vars/matrix.YOUR-DOMAIN.com/vars.yml`:**
|
||||||
|
|
||||||
|
See the [matrix-docker-ansible-deploy documentation](https://github.com/spantaleev/matrix-docker-ansible-deploy/blob/master/docs/configuring-playbook.md) for full configuration options. A minimal example:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
# Base domain (user IDs will be @user:YOUR-DOMAIN.com)
|
||||||
|
matrix_domain: YOUR-DOMAIN.com
|
||||||
|
|
||||||
|
# Homeserver implementation
|
||||||
|
matrix_homeserver_implementation: synapse
|
||||||
|
|
||||||
|
# Secret key - generate with: pwgen -s 64 1
|
||||||
|
matrix_homeserver_generic_secret_key: YOUR-SECRET-KEY-HERE
|
||||||
|
|
||||||
|
# Reverse proxy (use Traefik managed by the playbook)
|
||||||
|
matrix_playbook_reverse_proxy_type: playbook-managed-traefik
|
||||||
|
|
||||||
|
# Postgres password - generate with: pwgen -s 64 1
|
||||||
|
devture_postgres_connection_password: YOUR-POSTGRES-PASSWORD-HERE
|
||||||
|
|
||||||
|
# Enable IPv6 in container networks
|
||||||
|
devture_systemd_docker_base_ipv6_enabled: true
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Set up SSH keys
|
||||||
|
|
||||||
|
Ensure the host running Docker has SSH keys that can connect to your Matrix server:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# The container mounts /root/.ssh from the host
|
||||||
|
# Verify keys exist on the Docker host:
|
||||||
|
sudo ls -la /root/.ssh/id_*
|
||||||
|
|
||||||
|
# If no keys exist, generate or copy your keys:
|
||||||
|
sudo cp ~/.ssh/id_ed25519 /root/.ssh/
|
||||||
|
sudo cp ~/.ssh/id_ed25519.pub /root/.ssh/
|
||||||
|
sudo chmod 600 /root/.ssh/id_ed25519
|
||||||
|
|
||||||
|
# Test SSH to your Matrix server:
|
||||||
|
sudo ssh root@YOUR-SERVER-IP
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Start the container
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. Enter the container and verify
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec -it matrix-ansible-controller bash
|
||||||
|
|
||||||
|
# Inside container - verify setup:
|
||||||
|
ansible -i inventory/hosts all -m ping
|
||||||
|
just --list
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### Common Commands
|
||||||
|
|
||||||
|
All commands are run inside the container:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec -it matrix-ansible-controller bash
|
||||||
|
```
|
||||||
|
|
||||||
|
| Command | Description |
|
||||||
|
|---------|-------------|
|
||||||
|
| `just update` | Git pull playbook + update Ansible roles |
|
||||||
|
| `just roles` | Install/update Ansible Galaxy roles only |
|
||||||
|
| `just install-all` | Full installation (setup + start all services) |
|
||||||
|
| `just setup-all` | Configure all services without starting |
|
||||||
|
| `just start-all` | Start all services |
|
||||||
|
| `just stop-all` | Stop all services |
|
||||||
|
| `just run-tags <tags>` | Run specific tags (e.g., `just run-tags setup-synapse`) |
|
||||||
|
|
||||||
|
### First-Time Installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Enter container
|
||||||
|
docker exec -it matrix-ansible-controller bash
|
||||||
|
|
||||||
|
# Update playbook and roles
|
||||||
|
just update
|
||||||
|
|
||||||
|
# Verify connectivity
|
||||||
|
ansible -i inventory/hosts all -m ping
|
||||||
|
|
||||||
|
# Run full installation
|
||||||
|
just install-all
|
||||||
|
```
|
||||||
|
|
||||||
|
### Updating Your Matrix Server
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec -it matrix-ansible-controller bash
|
||||||
|
just update
|
||||||
|
just install-all
|
||||||
|
```
|
||||||
|
|
||||||
|
### Registering Users
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Register a regular user
|
||||||
|
just register-user USERNAME PASSWORD no
|
||||||
|
|
||||||
|
# Register an admin user
|
||||||
|
just register-user USERNAME PASSWORD yes
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Git "dubious ownership" error
|
||||||
|
|
||||||
|
If you see this error when running `just update`:
|
||||||
|
|
||||||
|
```
|
||||||
|
fatal: detected dubious ownership in repository at /playbook
|
||||||
|
```
|
||||||
|
|
||||||
|
Fix it with:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git config --global --add safe.directory /playbook
|
||||||
|
```
|
||||||
|
|
||||||
|
### SSH connection issues
|
||||||
|
|
||||||
|
1. Verify SSH keys are mounted:
|
||||||
|
```bash
|
||||||
|
ls -la /root/.ssh/
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Test SSH manually:
|
||||||
|
```bash
|
||||||
|
ssh -v root@YOUR-SERVER-IP
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Check known_hosts:
|
||||||
|
```bash
|
||||||
|
ssh-keyscan YOUR-SERVER-IP >> /root/.ssh/known_hosts
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ansible connectivity test
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ansible -i inventory/hosts all -m ping -vvv
|
||||||
|
```
|
||||||
|
|
||||||
|
### View playbook help
|
||||||
|
|
||||||
|
```bash
|
||||||
|
just
|
||||||
|
```
|
||||||
|
|
||||||
|
## Directory Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
matrix-ansible-controller/
|
||||||
|
├── Dockerfile # Container image definition
|
||||||
|
├── docker-compose.yml # Docker Compose configuration
|
||||||
|
├── entrypoint.sh # Container startup script
|
||||||
|
├── README.md # This file
|
||||||
|
└── data/ # Persistent data (git-ignored)
|
||||||
|
├── playbook/ # Cloned matrix-docker-ansible-deploy repo
|
||||||
|
├── inventory/ # Your Matrix configuration
|
||||||
|
│ ├── hosts # Ansible inventory file
|
||||||
|
│ └── host_vars/
|
||||||
|
│ └── matrix.YOUR-DOMAIN.com/
|
||||||
|
│ └── vars.yml
|
||||||
|
└── ansible-cache/ # Ansible fact cache
|
||||||
|
```
|
||||||
|
|
||||||
|
## Volume Mounts
|
||||||
|
|
||||||
|
| Container Path | Host Path | Purpose |
|
||||||
|
|----------------|-----------|---------|
|
||||||
|
| `/ssh` | `/root/.ssh` | SSH keys (read-only) |
|
||||||
|
| `/playbook` | `./data/playbook` | Cloned playbook repo |
|
||||||
|
| `/inventory` | `./data/inventory` | Your inventory config |
|
||||||
|
| `/root/.ansible` | `./data/ansible-cache` | Ansible cache |
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
|
- [matrix-docker-ansible-deploy](https://github.com/spantaleev/matrix-docker-ansible-deploy)
|
||||||
|
- [Configuring the Playbook](https://github.com/spantaleev/matrix-docker-ansible-deploy/blob/master/docs/configuring-playbook.md)
|
||||||
|
- [Ansible Documentation](https://docs.ansible.com/)
|
||||||
49
docker-compose.yml
Normal file
49
docker-compose.yml
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
# Matrix Ansible Controller
|
||||||
|
# Portable container for managing matrix-docker-ansible-deploy playbook
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# docker compose up -d
|
||||||
|
# docker exec -it matrix-ansible-controller bash
|
||||||
|
# just install-all
|
||||||
|
|
||||||
|
services:
|
||||||
|
controller:
|
||||||
|
build: .
|
||||||
|
image: matrix-ansible-controller:latest
|
||||||
|
container_name: matrix-ansible-controller
|
||||||
|
hostname: matrix-controller
|
||||||
|
|
||||||
|
# Keep container running for interactive use
|
||||||
|
stdin_open: true
|
||||||
|
tty: true
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
# SSH keys (read-only) - for connecting to matrix server
|
||||||
|
- /root/.ssh:/ssh:ro
|
||||||
|
|
||||||
|
# Persistent playbook directory (survives container rebuilds)
|
||||||
|
- ./data/playbook:/playbook
|
||||||
|
|
||||||
|
# Your inventory configuration (vars.yml, hosts, etc.)
|
||||||
|
- ./data/inventory:/inventory
|
||||||
|
|
||||||
|
# Persist ansible cache/facts
|
||||||
|
- ./data/ansible-cache:/root/.ansible
|
||||||
|
|
||||||
|
environment:
|
||||||
|
- ANSIBLE_HOST_KEY_CHECKING=False
|
||||||
|
- ANSIBLE_FORCE_COLOR=True
|
||||||
|
- UPDATE_ROLES=false
|
||||||
|
|
||||||
|
network_mode: bridge
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
memory: 1G
|
||||||
|
cpus: '2.0'
|
||||||
|
|
||||||
|
labels:
|
||||||
|
- "com.centurylinklabs.watchtower.enable=false"
|
||||||
|
|
||||||
|
restart: unless-stopped
|
||||||
84
entrypoint.sh
Executable file
84
entrypoint.sh
Executable file
|
|
@ -0,0 +1,84 @@
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Colors for output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
echo -e "${BLUE}========================================${NC}"
|
||||||
|
echo -e "${BLUE} Matrix Ansible Controller${NC}"
|
||||||
|
echo -e "${BLUE}========================================${NC}"
|
||||||
|
|
||||||
|
# --- SSH Key Setup ---
|
||||||
|
if [ -d "/ssh" ] && [ "$(ls -A /ssh 2>/dev/null)" ]; then
|
||||||
|
echo -e "${GREEN}[SSH]${NC} Setting up SSH keys from /ssh mount..."
|
||||||
|
cp -r /ssh/* /root/.ssh/ 2>/dev/null || true
|
||||||
|
chmod 700 /root/.ssh
|
||||||
|
chmod 600 /root/.ssh/* 2>/dev/null || true
|
||||||
|
chmod 644 /root/.ssh/*.pub 2>/dev/null || true
|
||||||
|
chmod 644 /root/.ssh/known_hosts 2>/dev/null || true
|
||||||
|
chmod 644 /root/.ssh/config 2>/dev/null || true
|
||||||
|
echo -e "${GREEN}[SSH]${NC} Keys configured"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}[SSH]${NC} No SSH keys mounted at /ssh"
|
||||||
|
echo -e "${YELLOW}[SSH]${NC} Mount with: -v ~/.ssh:/ssh:ro"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --- Playbook Setup ---
|
||||||
|
if [ ! -f "/playbook/setup.yml" ]; then
|
||||||
|
echo -e "${GREEN}[PLAYBOOK]${NC} Cloning matrix-docker-ansible-deploy..."
|
||||||
|
git clone https://github.com/spantaleev/matrix-docker-ansible-deploy.git /tmp/playbook
|
||||||
|
mv /tmp/playbook/* /playbook/
|
||||||
|
mv /tmp/playbook/.* /playbook/ 2>/dev/null || true
|
||||||
|
rm -rf /tmp/playbook
|
||||||
|
echo -e "${GREEN}[PLAYBOOK]${NC} Playbook cloned successfully"
|
||||||
|
else
|
||||||
|
echo -e "${GREEN}[PLAYBOOK]${NC} Playbook already present"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --- Inventory Setup ---
|
||||||
|
if [ -d "/inventory" ] && [ "$(ls -A /inventory 2>/dev/null)" ]; then
|
||||||
|
echo -e "${GREEN}[INVENTORY]${NC} Linking inventory from /inventory mount..."
|
||||||
|
rm -rf /playbook/inventory 2>/dev/null || true
|
||||||
|
ln -sf /inventory /playbook/inventory
|
||||||
|
echo -e "${GREEN}[INVENTORY]${NC} Inventory linked: /playbook/inventory -> /inventory"
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}[INVENTORY]${NC} No inventory mounted at /inventory"
|
||||||
|
echo -e "${YELLOW}[INVENTORY]${NC} Mount with: -v /path/to/inventory:/inventory"
|
||||||
|
mkdir -p /playbook/inventory
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --- Install/Update Ansible Roles ---
|
||||||
|
if [ -f "/playbook/requirements.yml" ]; then
|
||||||
|
if [ ! -d "/playbook/roles/galaxy" ] || [ "${UPDATE_ROLES:-false}" = "true" ]; then
|
||||||
|
echo -e "${GREEN}[ROLES]${NC} Installing Ansible Galaxy roles..."
|
||||||
|
cd /playbook
|
||||||
|
rm -rf roles/galaxy
|
||||||
|
ansible-galaxy install -r requirements.yml -p roles/galaxy/ --force
|
||||||
|
echo -e "${GREEN}[ROLES]${NC} Roles installed successfully"
|
||||||
|
else
|
||||||
|
echo -e "${GREEN}[ROLES]${NC} Roles already installed (set UPDATE_ROLES=true to refresh)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --- Display Status ---
|
||||||
|
echo ""
|
||||||
|
echo -e "${BLUE}----------------------------------------${NC}"
|
||||||
|
echo -e "${GREEN}Status:${NC}"
|
||||||
|
echo -e " Ansible: $(ansible --version | head -1)"
|
||||||
|
echo -e " Playbook: /playbook"
|
||||||
|
echo -e " Inventory: /playbook/inventory"
|
||||||
|
echo ""
|
||||||
|
echo -e "${BLUE}Quick Commands:${NC}"
|
||||||
|
echo -e " just install-all # Full installation"
|
||||||
|
echo -e " just setup-all # Setup all components"
|
||||||
|
echo -e " just roles # Update roles"
|
||||||
|
echo -e " just update # git pull + update roles"
|
||||||
|
echo ""
|
||||||
|
echo -e "${BLUE}----------------------------------------${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
exec "$@"
|
||||||
Loading…
Reference in a new issue