diff --git a/Makefile b/Makefile index 6494068..a9ed856 100644 --- a/Makefile +++ b/Makefile @@ -580,19 +580,19 @@ full-test: ## Полный цикл тестирования с отчетом .PHONY: snapshot snapshot: ## Сохранить снапшот лаборатории @echo "$(YELLOW)📸 Создаем снапшот...$(RESET)" - @bash scripts/snapshot.sh + @docker exec ansible-controller bash -lc 'bash /ansible/scripts/snapshot.sh' @echo "$(GREEN)✅ Снапшот сохранен$(RESET)" .PHONY: restore restore: ## Восстановить из снапшота @echo "$(BLUE)🔄 Восстанавливаем из снапшота...$(RESET)" - @bash scripts/restore.sh + @docker exec ansible-controller bash -lc 'bash /ansible/scripts/restore.sh' @echo "$(GREEN)✅ Снапшот восстановлен$(RESET)" .PHONY: cleanup cleanup: ## Очистить лабораторию @echo "$(RED)🧹 Очищаем лабораторию...$(RESET)" - @bash scripts/cleanup.sh + @docker exec ansible-controller bash -lc 'bash /ansible/scripts/cleanup.sh' @echo "$(GREEN)✅ Лаборатория очищена$(RESET)" # ============================================================================= diff --git a/README.md b/README.md index 771c262..efaff15 100644 --- a/README.md +++ b/README.md @@ -413,7 +413,7 @@ ansible-template/ │ └── requirements.yml # Ansible коллекции ├── roles/ # Ansible роли │ └── your_role/ # Ваши роли -├── scripts/ # Скрипты +├── scripts/ # Скрипты (запускаются через Docker) │ ├── report_html.py # Генератор HTML отчетов │ ├── snapshot.sh # Создание снапшотов │ ├── restore.sh # Восстановление снапшотов diff --git a/docker-compose.yaml b/docker-compose.yaml index 1e2a2a6..fc58b7a 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -13,6 +13,9 @@ services: - /var/run/docker.sock:/var/run/docker.sock - ./molecule:/ansible/molecule - ./files:/ansible/files + - ./scripts:/ansible/scripts + - ./reports:/ansible/reports + - ./snapshots:/ansible/snapshots - ./vault-password.txt:/ansible/vault-password.txt # каталог с ролями (локальный или внешний) - ${ROLES_DIR:-./roles}:/ansible/roles:ro diff --git a/docs/api.md b/docs/api.md index 2e3e996..e28475d 100644 --- a/docs/api.md +++ b/docs/api.md @@ -432,10 +432,10 @@ python3 scripts/report_html.py ```bash #!/usr/bin/env bash -# Создание снапшотов лаборатории +# Создание снапшотов лаборатории (запускается через Docker) # Параметры -OUT_DIR="snapshots" +OUT_DIR="/ansible/snapshots" # Создать директорию mkdir -p "$OUT_DIR" @@ -457,10 +457,10 @@ done ```bash #!/usr/bin/env bash -# Восстановление из снапшотов +# Восстановление из снапшотов (запускается через Docker) # Параметры -IN_DIR="snapshots" +IN_DIR="/ansible/snapshots" # Проверить директорию [ -d "$IN_DIR" ] || { echo "No snapshots dir"; exit 1; } @@ -480,7 +480,7 @@ done ```bash #!/usr/bin/env bash -# Очистка лаборатории +# Очистка лаборатории (запускается через Docker) echo "[cleanup] removing lab containers/volumes/networks" diff --git a/molecule/default/converge.yml b/molecule/default/converge.yml deleted file mode 100644 index 749dcda..0000000 --- a/molecule/default/converge.yml +++ /dev/null @@ -1,6 +0,0 @@ ---- -- name: Converge - hosts: all - vars_files: - - ../../vars/secrets.yml - roles: \ No newline at end of file diff --git a/molecule/default/destroy.yml b/molecule/default/destroy.yml deleted file mode 100644 index 82979c7..0000000 --- a/molecule/default/destroy.yml +++ /dev/null @@ -1,8 +0,0 @@ -- name: Destroy containers on interrupt - hosts: localhost - tasks: - - name: Ensure containers are destroyed - docker_container: - name: "{{ item.name }}" - state: absent - loop: "{{ molecule_yml.platforms }}" \ No newline at end of file diff --git a/molecule/default/molecule.yml b/molecule/default/molecule.yml deleted file mode 100644 index f374694..0000000 --- a/molecule/default/molecule.yml +++ /dev/null @@ -1,61 +0,0 @@ ---- -dependency: - name: galaxy - enabled: false - options: - requirements-file: requirements.yml - -driver: - name: docker - -platforms: - - name: centos - image: "inecs/ansible:centos" - privileged: true - pre_build_image: true - volumes: - - /sys/fs/cgroup:/sys/fs/cgroup:ro - - /var/run/docker.sock:/var/run/docker.sock - tmpfs: - - /tmp - - /run - - name: ubuntu - image: "inecs/ansible:ubuntu" - privileged: true - pre_build_image: true - volumes: - - /sys/fs/cgroup:/sys/fs/cgroup:ro - - /var/run/docker.sock:/var/run/docker.sock - tmpfs: - - /tmp - - /run - -provisioner: - name: ansible - connection_options: - ansible_connection: docker - ansible_user: root - env: - ANSIBLE_PYTHON_INTERPRETER: /usr/bin/python3 - lint: - name: ansible-lint - -verifier: - name: ansible - -scenario: - name: default - test_sequence: - - dependency - - cleanup - - destroy - - syntax - - create - - prepare - - converge - - idempotence - - side_effect - - verify - - cleanup - - destroy - diff --git a/molecule/default/no-prepare.yml b/molecule/default/no-prepare.yml deleted file mode 100644 index 57b792f..0000000 --- a/molecule/default/no-prepare.yml +++ /dev/null @@ -1,43 +0,0 @@ -- name: Prepare - hosts: all - tasks: - - name: Detect OS family - ansible.builtin.setup: - gather_subset: - - "min" - - - name: Обновляем пакеты для работы с Ansible в RockyLinux (Centos/RedHat) - when: ansible_facts['os_family'] == "RedHat" - block: - - name: Устанавливаем репозиторий AppStream (если его нет) - ansible.builtin.raw: dnf config-manager --set-enabled appstream - changed_when: false - - - name: Установить rsync - ansible.builtin.raw: dnf install -y rsync - changed_when: false - - - name: Устанавливаем Python 3.8 - ansible.builtin.raw: dnf install -y python38 python38-pip - changed_when: false - - - name: Обновляем символическую ссылку python3 - ansible.builtin.raw: alternatives --set python /usr/bin/python3.8 - changed_when: false -# - name: Fix repository URLs -# ansible.builtin.command: -# cmd: sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* -# changed_when: false - -# - name: Update baseurl -# ansible.builtin.command: -# cmd: sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-* -# changed_when: false - -# - name: Install required packages -# ansible.builtin.yum: -# name: -# - epel-release -# - python3 -# - python3-pip -# state: present diff --git a/molecule/default/no-verify.yml b/molecule/default/no-verify.yml deleted file mode 100644 index 5e80115..0000000 --- a/molecule/default/no-verify.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -- name: Prepare - hosts: all - tasks: - - name: Reun verify - debug: - msg: "Hello, Verify!" diff --git a/molecule/default/verify.yml b/molecule/default/verify.yml deleted file mode 100644 index a8aa9f6..0000000 --- a/molecule/default/verify.yml +++ /dev/null @@ -1,132 +0,0 @@ ---- -# Проверка работы systemd, docker и docker-compose в образах -# Автор: Сергей Антропов -# Сайт: https://devops.org.ru - -- name: Verify systemd, docker and docker-compose services - hosts: all - gather_facts: true - tasks: - - name: Display OS information - debug: - msg: "Тестирование на {{ ansible_distribution }} {{ ansible_distribution_version }}" - - - name: Check if systemd is available and running - systemd: - name: systemd - state: started - register: systemd_status - failed_when: false - - - name: Display systemd status - debug: - msg: "Systemd статус: {{ 'Доступен и запущен' if systemd_status is succeeded else 'Недоступен или не запущен' }}" - - - name: Check systemd version - command: systemd --version - register: systemd_version - failed_when: false - changed_when: false - - - name: Display systemd version - debug: - msg: "Версия systemd: {{ systemd_version.stdout_lines[0] if systemd_version.stdout_lines else 'Не определена' }}" - - - name: Check if docker service exists - stat: - path: /usr/bin/docker - register: docker_binary - - - name: Check if docker service exists (alternative path) - stat: - path: /usr/local/bin/docker - register: docker_binary_alt - - - name: Display docker binary status - debug: - msg: "Docker binary: {{ 'Найден в /usr/bin/docker' if docker_binary.stat.exists else ('Найден в /usr/local/bin/docker' if docker_binary_alt.stat.exists else 'Не найден') }}" - - - name: Check docker version - command: docker --version - register: docker_version - failed_when: false - changed_when: false - - - name: Display docker version - debug: - msg: "Версия Docker: {{ docker_version.stdout if docker_version.stdout else 'Docker не установлен' }}" - - - name: Check if docker daemon is running - command: docker info - register: docker_info - failed_when: false - changed_when: false - - - name: Display docker daemon status - debug: - msg: "Docker daemon: {{ 'Запущен' if docker_info is succeeded else 'Не запущен или недоступен' }}" - - - name: Check if docker-compose binary exists - stat: - path: /usr/local/bin/docker-compose - register: docker_compose_binary - - - name: Check if docker-compose binary exists (alternative path) - stat: - path: /usr/bin/docker-compose - register: docker_compose_binary_alt - - - name: Check if docker compose plugin exists - command: docker compose version - register: docker_compose_plugin - failed_when: false - changed_when: false - - - name: Display docker-compose status - debug: - msg: "Docker Compose: {{ 'Найден как binary' if docker_compose_binary.stat.exists or docker_compose_binary_alt.stat.exists else ('Найден как plugin' if docker_compose_plugin is succeeded else 'Не найден') }}" - - - name: Display docker-compose version - debug: - msg: "Версия Docker Compose: {{ docker_compose_plugin.stdout if docker_compose_plugin is succeeded else 'Docker Compose не установлен' }}" - - - name: Test docker functionality - command: docker run --rm hello-world - register: docker_test - failed_when: false - changed_when: false - - - name: Display docker test result - debug: - msg: "Тест Docker: {{ 'Успешно' if docker_test is succeeded else 'Ошибка - ' + docker_test.stderr }}" - - - name: Check systemd services status - command: systemctl list-units --type=service --state=running - register: running_services - failed_when: false - changed_when: false - - - name: Display running services count - debug: - msg: "Количество запущенных сервисов: {{ running_services.stdout_lines | length }}" - - - name: Check for docker-related systemd services - command: systemctl list-units --type=service | grep -i docker - register: docker_services - failed_when: false - changed_when: false - - - name: Display docker services - debug: - msg: "Docker сервисы: {{ docker_services.stdout_lines if docker_services.stdout_lines else 'Не найдены' }}" - - - name: Final summary - debug: - msg: | - ======================================== - РЕЗУЛЬТАТЫ ПРОВЕРКИ ОБРАЗА {{ ansible_distribution }}: - ======================================== - Systemd: {{ '✓ Работает' if systemd_status is succeeded else '✗ Не работает' }} - Docker: {{ '✓ Установлен и работает' if docker_info is succeeded else '✗ Не установлен или не работает' }} - Docker Compose: {{ '✓ Доступен' if (docker_compose_binary.stat.exists or docker_compose_binary_alt.stat.exists or docker_compose_plugin is succeeded) else '✗ Недоступен' }} - ======================================== diff --git a/scripts/restore.sh b/scripts/restore.sh index dc26f2f..d775c77 100755 --- a/scripts/restore.sh +++ b/scripts/restore.sh @@ -5,7 +5,7 @@ set -euo pipefail -IN_DIR="snapshots" +IN_DIR="/ansible/snapshots" if [ ! -d "$IN_DIR" ]; then echo "No snapshots dir" exit 1 diff --git a/scripts/snapshot.sh b/scripts/snapshot.sh index 3b4211c..2aa8857 100755 --- a/scripts/snapshot.sh +++ b/scripts/snapshot.sh @@ -5,7 +5,7 @@ set -euo pipefail -OUT_DIR="snapshots" +OUT_DIR="/ansible/snapshots" mkdir -p "$OUT_DIR" # Найти все контейнеры лаборатории