- Added ansible/ directory with playbooks for: * deploy.yml: Update applications on devices from git * commands.yml: Execute arbitrary commands on devices * system_update.yml: OS updates and health checks * inventory.ini: Device and group configuration * README.md: Comprehensive Ansible guide * requirements.txt: Installation instructions - Added ansible_integration.py: Python module wrapping Ansible operations - Added utils_ansible.py: Updated utilities using Ansible instead of HTTP commands Key benefits: - Idempotent operations with error recovery - Comprehensive logging and backup - Multi-device orchestration - Better reliability and control - Replaces unreliable direct HTTP command execution
Ansible Integration for Server_Monitorizare
This directory contains Ansible playbooks and configuration for managing Prezenta Work devices remotely.
Overview
The Ansible integration replaces direct HTTP command execution with a more robust, scalable solution:
Before (HTTP-based)
Server → HTTP Request → Device (/execute_command endpoint)
Problems:
- No idempotency
- Hard to track what happened
- No built-in error recovery
- Limited command execution control
After (Ansible-based)
Server → Ansible Playbook → Device (SSH)
Benefits:
- Idempotent operations
- Comprehensive logging
- Built-in error handling & retry logic
- Structured playbooks
- Multi-device orchestration
- Backup and rollback capability
Files
Configuration
- inventory.ini - Defines all devices, groups, and variables
Playbooks
- deploy.yml - Deploy application updates (pull from git, restart service)
- commands.yml - Execute arbitrary commands on devices
- system_update.yml - System maintenance (OS updates, health checks)
Python Integration
- ansible_integration.py - Python module for Ansible automation
- utils_ansible.py - Updated utilities using Ansible (replaces old utils.py)
Setup
1. Install Ansible on Server
# On Server_Monitorizare (Ubuntu/Debian)
sudo apt-get update
sudo apt-get install -y ansible
# Verify installation
ansible --version
2. Configure Inventory
Edit inventory.ini and add your devices:
[prezenta_devices]
device_1 ansible_host=192.168.1.20
device_2 ansible_host=192.168.1.21
device_3 ansible_host=192.168.1.22
3. Setup SSH Keys (Optional but Recommended)
For password-less authentication:
# Generate SSH keys if not present
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""
# Copy public key to each device
ssh-copy-id -i ~/.ssh/id_rsa.pub pi@192.168.1.20
ssh-copy-id -i ~/.ssh/id_rsa.pub pi@192.168.1.21
ssh-copy-id -i ~/.ssh/id_rsa.pub pi@192.168.1.22
Update inventory.ini to use SSH key auth:
[all:vars]
ansible_user=pi
ansible_ssh_private_key_file=~/.ssh/id_rsa
ansible_ssh_common_args='-o StrictHostKeyChecking=no'
4. Test Connectivity
# Test all devices
ansible all -i inventory.ini -m ping
# Test specific group
ansible prezenta_devices -i inventory.ini -m ping
Usage
From Command Line
Deploy Updates
# Deploy dev branch to all devices
ansible-playbook -i inventory.ini deploy.yml \
-e git_branch=dev \
-e backup_before_deploy=true \
-e restart_service=true
# Deploy to specific device
ansible-playbook -i inventory.ini deploy.yml \
--limit device_1 \
-e git_branch=dev
Execute Commands
# Execute command on all devices
ansible-playbook -i inventory.ini commands.yml \
-e command="ps aux | grep prezenta"
# Execute on specific device
ansible-playbook -i inventory.ini commands.yml \
--limit device_1 \
-e command="systemctl status prezenta"
System Update
# Update Python packages and perform health check
ansible-playbook -i inventory.ini system_update.yml \
-e update_python_packages=true \
-e perform_health_check=true
# Also update OS packages
ansible-playbook -i inventory.ini system_update.yml \
-e update_os_packages=true \
-e update_python_packages=true \
-e perform_health_check=true
From Python Code
from utils_ansible import (
deploy_updates_to_device,
deploy_updates_to_all_devices,
execute_command_on_device,
system_update_device,
get_device_status,
get_execution_logs
)
# Deploy to specific device
result = deploy_updates_to_device('device_1', git_branch='dev')
print(result)
# Deploy to all devices
result = deploy_updates_to_all_devices(git_branch='dev')
print(result)
# Execute command
result = execute_command_on_device('device_1', 'systemctl status prezenta')
print(result)
# System update
result = system_update_device('device_1', update_python=True, health_check=True)
print(result)
# Get device status
result = get_device_status('device_1')
print(result)
# Get recent logs
logs = get_execution_logs(limit=10)
print(logs)
In Flask Routes
Update your Flask routes to use the new Ansible-based utilities:
from flask import request, jsonify
from utils_ansible import (
deploy_updates_to_device,
execute_command_on_device,
get_device_status
)
@app.route('/api/deploy', methods=['POST'])
def deploy_api():
data = request.json
device = data.get('device')
branch = data.get('branch', 'dev')
result = deploy_updates_to_device(device, git_branch=branch)
return jsonify(result)
@app.route('/api/command', methods=['POST'])
def command_api():
data = request.json
device = data.get('device')
command = data.get('command')
result = execute_command_on_device(device, command)
return jsonify(result)
@app.route('/api/device/<device>/status', methods=['GET'])
def device_status_api(device):
result = get_device_status(device)
return jsonify(result)
Playbook Details
deploy.yml
What it does:
- Backs up current code (optional)
- Fetches latest from git repository
- Checks out specified branch
- Pulls latest changes
- Verifies syntax
- Restarts application service
- Verifies service is running
- Logs deployment
Example:
ansible-playbook deploy.yml -e git_branch=dev -e backup_before_deploy=true
Output Locations:
- Backups:
/srv/prezenta_work/backups/ - Logs:
./logs/deploy_YYYYMMDD_HHMMSS.log
commands.yml
What it does:
- Executes command with specified user
- Captures output and errors
- Logs command in device's command history
- Returns result
Example:
ansible-playbook commands.yml -e command="sudo systemctl restart prezenta"
Output Locations:
- Logs:
./logs/command_DEVICE_YYYYMMDD_HHMMSS.log - Device log:
/srv/prezenta_work/data/command_history.log
system_update.yml
What it does:
- Gathers system facts
- Updates OS packages (optional)
- Updates Python packages
- Checks service status
- Performs health checks (disk, memory, CPU temp)
- Logs results
- Reboots if needed (optional)
Example:
ansible-playbook system_update.yml \
-e update_os_packages=false \
-e update_python_packages=true \
-e perform_health_check=true
Output Locations:
- Logs:
./logs/system_update_YYYYMMDD_HHMMSS.log - Device log:
/srv/prezenta_work/data/system_update.log
Execution Logs
Logs are stored in ansible/logs/ directory:
# View recent logs
ls -lht ansible/logs/ | head -10
# Follow live deployment
tail -f ansible/logs/deploy_*.log
# Search logs
grep "error\|fail" ansible/logs/*.log
Troubleshooting
SSH Connection Issues
# Test SSH manually
ssh -i ~/.ssh/id_rsa pi@192.168.1.20
# Test with verbose output
ansible device_1 -i inventory.ini -m ping -vvv
Ansible Module Errors
# Run with increased verbosity
ansible-playbook deploy.yml -vvv
Device Not Found in Inventory
# List all hosts
ansible all -i inventory.ini --list-hosts
# List specific group
ansible prezenta_devices -i inventory.ini --list-hosts
Security Considerations
-
SSH Keys: Use SSH key authentication instead of passwords
-
Inventory: Don't commit inventory.ini with passwords to git
-
Ansible Vault: Use for sensitive data:
ansible-vault create secrets.yml ansible-playbook deploy.yml -e @secrets.yml --ask-vault-pass -
Firewall: Ensure SSH (port 22) is open on devices
Performance Tips
-
Parallel Execution: Run playbooks on multiple devices
ansible-playbook deploy.yml --forks 5 -
Task Caching: Avoid unnecessary updates
# Playbooks already use idempotent operations -
Logging: Monitor log files for issues
# Compress old logs gzip ansible/logs/deploy_*.log
Migration from HTTP Commands
Old (HTTP-based):
def execute_command_on_device(device_ip, command):
url = f"http://{device_ip}:80/execute_command"
response = requests.post(url, json={"command": command})
return response.json()
New (Ansible-based):
from utils_ansible import execute_command_on_device
result = execute_command_on_device('device_hostname', command)
return result
Next Steps
- Install Ansible on Server_Monitorizare
- Configure inventory.ini with your devices
- Set up SSH key authentication
- Test connectivity with
ansible all -m ping - Create first deployment
- Update Flask routes to use new utils_ansible
- Monitor logs in
ansible/logs/
Documentation
For more information on Ansible: