#!/bin/bash # Скрипт для тестирования собственных образов AnsibleLab # Автор: Сергей Антропов # Сайт: https://devops.org.ru set -e # Цвета для вывода RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Функция для вывода сообщений log() { echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" } success() { echo -e "${GREEN}✅ $1${NC}" } warning() { echo -e "${YELLOW}⚠️ $1${NC}" } error() { echo -e "${RED}❌ $1${NC}" } # Проверка наличия Docker check_docker() { log "Проверка Docker..." if ! command -v docker &> /dev/null; then error "Docker не установлен!" exit 1 fi success "Docker доступен" } # Проверка наличия образов check_images() { log "Проверка наличия собственных образов..." local images=( "inecs/ansible-lab:ansible-controller-latest" "inecs/ansible-lab:alt-linux-latest" "inecs/ansible-lab:astra-linux-latest" "inecs/ansible-lab:redos-latest" "inecs/ansible-lab:rhel-latest" "inecs/ansible-lab:centos-latest" "inecs/ansible-lab:alma-latest" "inecs/ansible-lab:rocky-latest" "inecs/ansible-lab:ubuntu-latest" "inecs/ansible-lab:debian-latest" ) local missing_images=() for image in "${images[@]}"; do if ! docker image inspect "$image" &> /dev/null; then missing_images+=("$image") else success "Образ $image найден" fi done if [ ${#missing_images[@]} -gt 0 ]; then warning "Отсутствующие образы:" for image in "${missing_images[@]}"; do echo " - $image" done echo "" echo "Для сборки образов выполните:" echo " make docker build" echo "" echo "Или соберите отдельные образы:" for image in "${missing_images[@]}"; do # Маппинг образов на имена для сборки case "$image" in "inecs/ansible-lab:ansible-controller-latest") echo " make docker build-image IMAGE=ansible-controller" ;; "inecs/ansible-lab:alt-linux-latest") echo " make docker build-image IMAGE=alt-linux" ;; "inecs/ansible-lab:astra-linux-latest") echo " make docker build-image IMAGE=astra-linux" ;; "inecs/ansible-lab:redos-latest") echo " make docker build-image IMAGE=redos" ;; "inecs/ansible-lab:rhel-latest") echo " make docker build-image IMAGE=rhel" ;; "inecs/ansible-lab:centos-latest") echo " make docker build-image IMAGE=centos" ;; "inecs/ansible-lab:alma-latest") echo " make docker build-image IMAGE=alma" ;; "inecs/ansible-lab:rocky-latest") echo " make docker build-image IMAGE=rocky" ;; "inecs/ansible-lab:ubuntu-latest") echo " make docker build-image IMAGE=ubuntu" ;; "inecs/ansible-lab:debian-latest") echo " make docker build-image IMAGE=debian" ;; *) echo " # Неизвестный образ: $image" ;; esac done return 1 fi success "Все образы найдены" return 0 } # Тестирование с минимальным пресетом test_minimal() { log "Тестирование с минимальным пресетом (custom-minimal)..." if [ -f "molecule/presets/custom-minimal.yml" ]; then log "Запуск molecule test с пресетом custom-minimal..." if molecule test --scenario-name custom-minimal; then success "Тест с custom-minimal прошел успешно" else error "Тест с custom-minimal завершился с ошибкой" return 1 fi else error "Файл molecule/presets/custom-minimal.yml не найден" return 1 fi } # Тестирование с полным пресетом test_full() { log "Тестирование с полным пресетом (custom-images)..." if [ -f "molecule/presets/custom-images.yml" ]; then log "Запуск molecule test с пресетом custom-images..." if molecule test --scenario-name custom-images; then success "Тест с custom-images прошел успешно" else error "Тест с custom-images завершился с ошибкой" return 1 fi else error "Файл molecule/presets/custom-images.yml не найден" return 1 fi } # Тестирование производительности test_performance() { log "Тестирование производительности (custom-performance)..." if [ -f "molecule/presets/custom-performance.yml" ]; then log "Запуск molecule test с пресетом custom-performance..." if molecule test --scenario-name custom-performance; then success "Тест производительности прошел успешно" else error "Тест производительности завершился с ошибкой" return 1 fi else error "Файл molecule/presets/custom-performance.yml не найден" return 1 fi } # Очистка после тестов cleanup() { log "Очистка после тестов..." # Остановка и удаление контейнеров docker ps -a --filter "name=molecule" --format "{{.Names}}" | xargs -r docker rm -f 2>/dev/null || true # Удаление сетей docker network ls --filter "name=ansible-lab" --format "{{.Name}}" | xargs -r docker network rm 2>/dev/null || true success "Очистка завершена" } # Основная функция main() { log "🚀 Тестирование собственных образов AnsibleLab" echo "==========================================" # Проверки check_docker if ! check_images; then error "Не все образы найдены. Завершение." exit 1 fi # Выбор типа тестирования case "${1:-minimal}" in "check") success "Проверка образов завершена" ;; "minimal") test_minimal ;; "full") test_full ;; "performance") test_performance ;; "all") test_minimal && test_full && test_performance ;; *) echo "Использование: $0 [check|minimal|full|performance|all]" echo "" echo " check - проверка наличия образов" echo " minimal - минимальный тест (4 хоста)" echo " full - полный тест (все образы)" echo " performance - тест производительности (8 хостов)" echo " all - все тесты" exit 1 ;; esac # Очистка cleanup success "🎉 Тестирование завершено успешно!" } # Обработка сигналов trap cleanup EXIT INT TERM # Запуск main "$@"