Блог AST-SoftPro
Python-утилиты для DevOps: автоматизация серверов и CI/CD
Python-утилиты для DevOps: автоматизация серверов и CI/CD
В современной среде разработки и эксплуатации программного обеспечения автоматизация играет ключевую роль. Особенно актуальна она в DevOps-практиках, где важны стабильность, воспроизводимость процессов и снижение человеческой ошибки. Python — один из самых популярных языков для создания таких утилит благодаря своей читаемости, богатому стандартному набору библиотек и поддержке работы с сетевыми протоколами, файлами и системами.
В этой статье рассматриваются практические примеры Python-скриптов, применяемых в автоматизации серверного администрирования: управление конфигурацией серверов, создание бэкапов, мониторинг загрузки ресурсов. Все примеры не зависят от конкретной инфраструктуры — они могут быть адаптированы под различные среды (Linux/Unix-серверы через SSH).
Управление серверами по SSH с помощью Paramiko
Один из распространённых сценариев в DevOps — выполнение команд на удалённых серверах или сбор информации о них. Для этого можно использовать библиотеку paramiko, которая позволяет работать с SSH без установки дополнительных клиентских программ.
Пример: получение списка запущенных процессов на сервере:
import paramiko
def get_processes(host, port=22, user='admin', password='secret'):
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
client.connect(hostname=host, port=port, username=user, password=password)
stdin, stdout, stderr = client.exec_command('ps aux')
output = stdout.read().decode()
if 'No such file or directory' in str(stderr.read()):
raise Exception('SSH failed: check credentials')
return output
except Exception as e:
print(f"Error connecting to {host}: {e}")
return None
finally:
client.close()
Такой скрипт можно использовать в составе более сложных систем, например, для периодической проверки здоровья серверов или анализа нагрузки.
Автоматическое создание бэкапов конфигурационных файлов
Резервное копирование — важный элемент DevOps. Часто требуется не просто делать резервные копии данных, но и управлять жизненным циклом этих копий: хранить их определённое время, удалять старые версии, проверять целостность.
Пример скрипта для создания бэкапа /etc/nginx/nginx.conf с последующим архивированием:
import os
import shutil
from datetime import datetime
def backup_config_file(source_path, backup_dir='/backups', max_backups=5):
if not os.path.exists(backup_dir):
os.makedirs(backup_dir)
filename = f"nginx_conf_{datetime.now().strftime('%Y%m%d_%H%M')}.tar.gz"
archive_path = os.path.join(backup_dir, filename)
try:
# Создаём архив
shutil.make_archive(base_name=os.path.basename(filename),
format='gztar',
root_dir=source_path,
base_dir="/etc/nginx/")
print(f"Backup created: {archive_path}")
except Exception as e:
print(f"Failed to create backup: {e}")
# Удаляем старые бэкапы, если их больше max_backups
files = [f for f in os.listdir(backup_dir) if f.startswith('nginx_conf_')]
while len(files) > max_backups:
oldest_file = min(files)
shutil.rmtree(os.path.join(backup_dir, oldest_file))
print(f"Removed old backup: {oldest_file}")
files.remove(oldest_file)
Этот подход легко масштабируется — можно добавить поддержку логирования, уведомлений по email или отправку архива в облачное хранилище (например, S3 через boto3).
Мониторинг нагрузки сервера: CPU и память
Для обеспечения стабильности приложений важно отслеживать использование ресурсов. Python позволяет собирать метрики с локальной системы без внешних зависимостей.
Пример получения информации о загрузке CPU и использовании памяти:
import psutil
from datetime import datetime
def get_server_metrics() -> dict:
return {
"timestamp": datetime.utcnow().isoformat(),
"cpu_percent": psutil.cpu_percent(interval=1),
"memory_percent": psutil.virtual_memory().percent,
"disk_usage_percent": psutil.disk_usage('/').percent
}
Функция возвращает словарь с ключевыми метриками. Эти данные могут быть отправлены в систему мониторинга (например, через HTTP POST на сервер Grafana или Prometheus) для построения графиков и алертингов.
Интеграция скриптaв CI/CD: запуск тестов перед развёртыванием
Автоматизация процесса Continuous Integration and Deployment (CI/CD) может включать проверку состояния сервера до деплоя. Например, можно проверить доступность сервиса или свободную память на production-сервере.
Пример проверки свободного места на диске:
import psutil
def check_disk_space(min_free_gb: float = 2.0):
total, used, free = map(int, os.popen('df / | tail -1').read().split())[:3]
# Переводим в ГБ
free_gb = round(free / (1024**3), 2)
if free_gb < min_free_gb:
return False, f"Not enough disk space: {free_gb} GB available"
return True, "Sufficient disk space"
Такой скрипт может быть частью pre-deploy-чека в GitLab CI или Jenkins. Он не выполняет деплой сам, но блокирует его при несоответствии условий.
Рекомендации по безопасности и надёжности
При использовании Python для DevOps-автоматизации важно учитывать следующие аспекты:
| Аспект | Рекомендация |
|---|---|
| Хранение паролей | Использовать переменные окружения или секреты из системы (например, Hashicorp Vault) |
| Обработка ошибок | Добавлять try/except и логирование с указанием уровня ошибки (INFO/WARNING/ERROR) |
| Логирование | Записывать действия скрипта в файл или систему аудита для отладки и анализа инцидентов |
| Проверка прав доступа | Убедиться, что пользователь на сервере имеет минимальные необходимые права |
Например, вместо прямого использования пароля:
password = os.getenv('SSH_PASSWORD')
И включение логирования в logging модуль Python.
Заключение
Python предоставляет мощные возможности для автоматизации задач DevOps: от простых скриптов до сложных систем мониторинга и управления конфигурациями. Ключ к успеху — модульный подход, использование проверенных библиотек (paramiko, psutil) и внимание к вопросам безопасности и отказоустойчивости. Приведённые примеры можно адаптировать под конкретные нужды организации без необходимости внедрения специализированных инструментов или платформ.