From 9ce30e0d670318532f863df3b3142140d0865c9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9=20=D0=90=D0=BD=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BF=D0=BE=D0=B2?= Date: Sat, 25 Oct 2025 19:00:34 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BF=D1=80=D0=B5=D1=81=D0=B5=D1=82=20all-image?= =?UTF-8?q?s=20=D0=B8=20=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B0=20sudo=20=D0=B2=D0=BE=20=D0=B2=D1=81=D0=B5=20Dockerfile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Создан пресет all-images для тестирования всех 9 образов - Добавлен sudo во все Dockerfile образы - Настроены sudoers для root и пользователей - Упрощен site.yml (убрана установка sudo) - Добавлена документация для пресета all-images - Обновлен Makefile с поддержкой нового пресета - Исправлена проблема с Parsec в Astra Linux - Улучшена система очистки контейнеров Пресет all-images включает: - Debian-based: Ubuntu, Debian, Alt Linux, Astra Linux - RHEL-based: CentOS, RHEL, AlmaLinux, Rocky Linux, RedOS - Уникальные порты 8080-8088 - Переменные окружения TEST_OS и TEST_FAMILY --- Makefile | 18 +++- README.md | 5 + dockerfiles/alma/Dockerfile | 5 + dockerfiles/alt-linux/Dockerfile | 5 + dockerfiles/astra-linux/Dockerfile | 14 +++ dockerfiles/centos/Dockerfile | 5 + dockerfiles/debian/Dockerfile | 5 + dockerfiles/redos/Dockerfile | 5 + dockerfiles/rhel/Dockerfile | 5 + dockerfiles/rocky/Dockerfile | 5 + dockerfiles/ubuntu/Dockerfile | 5 + docs/all-images-preset.md | 155 +++++++++++++++++++++++++++++ molecule/default/create.yml | 2 + molecule/default/destroy.yml | 23 +++++ molecule/default/site.yml | 50 ++++++++-- molecule/presets/all-images.yml | 111 +++++++++++++++++++++ molecule/presets/minimal.yml | 5 +- scripts/update-dockerfiles-sudo.sh | 58 +++++++++++ 18 files changed, 473 insertions(+), 8 deletions(-) create mode 100644 docs/all-images-preset.md create mode 100644 molecule/presets/all-images.yml create mode 100644 scripts/update-dockerfiles-sudo.sh diff --git a/Makefile b/Makefile index 70728f0..4759ebf 100644 --- a/Makefile +++ b/Makefile @@ -78,7 +78,7 @@ role: -e MOLECULE_PRESET=$$PRESET \ -e MOLECULE_EPHEMERAL_DIRECTORY=/tmp/molecule_workspace \ $(DOCKER_IMAGE) \ - bash -c "mkdir -p /tmp/molecule_workspace/inventory && cd molecule/default && ansible-playbook -i localhost, create.yml --connection=local -e molecule_ephemeral_directory=/tmp/molecule_workspace && ansible-playbook -i /tmp/molecule_workspace/inventory/hosts.ini site.yml && ansible-playbook -i localhost, destroy.yml --connection=local -e molecule_ephemeral_directory=/tmp/molecule_workspace" || echo "✅ Тестирование завершено"; \ + bash -c "mkdir -p /tmp/molecule_workspace/inventory && cd molecule/default && ansible-playbook -i localhost, create.yml --connection=local -e molecule_ephemeral_directory=/tmp/molecule_workspace && ansible-playbook -i /tmp/molecule_workspace/inventory/hosts.ini site.yml; ansible-playbook -i localhost, destroy.yml --connection=local -e molecule_ephemeral_directory=/tmp/molecule_workspace; echo '✅ Тестирование завершено'"; \ fi;; \ deploy) \ echo "🚀 Развертывание ролей на реальные серверы..."; \ @@ -116,6 +116,7 @@ role: echo " 💡 Примеры:"; \ echo " make role test # с default preset"; \ echo " make role test minimal # с minimal preset"; \ + echo " make role test all-images # со всеми образами"; \ echo " make role test etcd-patroni # с etcd-patroni preset"; \ echo ""; \ echo " 🚀 make role deploy - развернуть роли на реальные серверы"; \ @@ -975,6 +976,7 @@ help: @echo " make presets list # показать все preset'ы" @echo " make presets test PRESET=etcd-patroni # тест с etcd-patroni" @echo " make role test minimal # быстрый тест" + @echo " make role test all-images # тест всех образов" @echo " make docker setup-builder # настройка multi-arch builder" @echo " make docker diagnose # диагностика buildx проблем" @echo " make docker reset-builder # сброс buildx builder" @@ -1062,6 +1064,20 @@ setup-cicd: @chmod +x scripts/setup-cicd.sh @./scripts/setup-cicd.sh +# Очистка контейнеров Molecule +.PHONY: clean-containers +clean-containers: + @echo "🧹 Очистка контейнеров Molecule..." + @echo "📋 Поиск контейнеров проекта..." + @docker ps -a --filter "ancestor=inecs/ansible-lab" --format "table {{.Names}}\t{{.Status}}\t{{.Image}}" || true + @echo "" + @echo "🗑️ Удаление контейнеров..." + @docker ps -a --filter "ancestor=inecs/ansible-lab" --format "{{.ID}}" | xargs -r docker rm -f 2>/dev/null || true + @docker ps -a --filter "network=labnet" --format "{{.ID}}" | xargs -r docker rm -f 2>/dev/null || true + @echo "🧹 Очистка сетей..." + @docker network rm labnet 2>/dev/null || true + @echo "✅ Очистка завершена" + # Пустые цели для совместимости view create edit show delete lint deploy new advanced list info test build push pull clean prepare update run stop purge clean-builder setup-builder diagnose reset-builder build-image: @true diff --git a/README.md b/README.md index 1cfd6a3..7dd2279 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ AnsibleTemplate - это универсальная система для тес - **[docs/creating-roles.md](docs/creating-roles.md)** - Создание и разработка ролей - **[docs/site-yml-guide.md](docs/site-yml-guide.md)** - Руководство по файлу site.yml - **[docs/molecule-guide.md](docs/molecule-guide.md)** - Подробное руководство по Molecule +- **[docs/all-images-preset.md](docs/all-images-preset.md)** - Пресет all-images для тестирования всех образов - **[dockerfiles/README.md](dockerfiles/README.md)** - Подробная документация по Docker образам ### 🏗️ CI/CD @@ -157,6 +158,9 @@ make role test # Тестирование с minimal preset make role test minimal +# Тестирование всех образов (9 контейнеров) +make role test all-images + # Тестирование с custom preset make role test my-custom-preset ``` @@ -184,6 +188,7 @@ make presets test PRESET=performance |--------|----------|-------|---------------| | `default` | Стандартный preset | 2 хоста (Debian + RHEL) | Базовое тестирование | | `minimal` | Минимальный preset | 1 хост (Debian) | Быстрое тестирование | +| `all-images` | **Все образы** | 9 хостов (все ОС) | **Комплексное тестирование** | | `standard` | Расширенный preset | 3 хоста (Debian + RHEL + Debian) | Полное тестирование | | `performance` | Performance preset | 5 хостов (Debian + RHEL) | Нагрузочное тестирование | | `security` | Security preset | 3 хоста (Debian + RHEL) | Тестирование безопасности | diff --git a/dockerfiles/alma/Dockerfile b/dockerfiles/alma/Dockerfile index 4bcd105..73cd5bb 100644 --- a/dockerfiles/alma/Dockerfile +++ b/dockerfiles/alma/Dockerfile @@ -21,6 +21,7 @@ RUN dnf install -y \ jq \ python3 \ python3-pip \ + sudo \ && dnf clean all # Устанавливаем yq @@ -39,6 +40,10 @@ RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-c # Настраиваем systemd RUN systemctl set-default multi-user.target +# Настраиваем sudoers для root и пользователей +RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \ + echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test + # Создаем пользователя для Ansible RUN useradd -m -s /bin/bash ansible \ && echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers diff --git a/dockerfiles/alt-linux/Dockerfile b/dockerfiles/alt-linux/Dockerfile index 3d1b171..f6c83b2 100644 --- a/dockerfiles/alt-linux/Dockerfile +++ b/dockerfiles/alt-linux/Dockerfile @@ -21,6 +21,7 @@ RUN apt-get install -y \ tree \ jq \ python3 \ + sudo \ && apt-get clean # Устанавливаем pip для Python 3.7 @@ -44,6 +45,10 @@ RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-c # Настраиваем systemd RUN systemctl set-default multi-user.target +# Настраиваем sudoers для root и пользователей +RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \ + echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test + # Создаем пользователя для Ansible RUN useradd -m -s /bin/bash ansible \ && echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers diff --git a/dockerfiles/astra-linux/Dockerfile b/dockerfiles/astra-linux/Dockerfile index aeaa198..de40ad9 100644 --- a/dockerfiles/astra-linux/Dockerfile +++ b/dockerfiles/astra-linux/Dockerfile @@ -23,6 +23,7 @@ RUN apt-get install -y \ jq \ python3 \ python3-pip \ + sudo \ && apt-get clean # Устанавливаем yq @@ -46,9 +47,22 @@ RUN apt-get update && apt-get install -y \ RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \ && chmod +x /usr/local/bin/docker-compose +# Отключаем Parsec для работы в контейнере +RUN if [ -f /etc/parsec/parsec.conf ]; then \ + sed -i 's/enabled=1/enabled=0/' /etc/parsec/parsec.conf || true; \ + fi && \ + if [ -f /lib/modules/$(uname -r)/parsec.ko ]; then \ + mv /lib/modules/$(uname -r)/parsec.ko /lib/modules/$(uname -r)/parsec.ko.disabled || true; \ + fi && \ + systemctl disable parsec 2>/dev/null || true + # Настраиваем systemd RUN systemctl set-default multi-user.target +# Настраиваем sudoers для root и пользователей +RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \ + echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test + # Создаем пользователя для Ansible RUN useradd -m -s /bin/bash ansible \ && echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers diff --git a/dockerfiles/centos/Dockerfile b/dockerfiles/centos/Dockerfile index b65487b..8f7438e 100644 --- a/dockerfiles/centos/Dockerfile +++ b/dockerfiles/centos/Dockerfile @@ -20,6 +20,7 @@ RUN dnf install -y --allowerasing \ jq \ python3 \ python3-pip \ + sudo \ && dnf clean all # Устанавливаем yq @@ -36,6 +37,10 @@ RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-c # Настраиваем systemd RUN systemctl set-default multi-user.target +# Настраиваем sudoers для root и пользователей +RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \ + echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test + # Создаем пользователя для Ansible RUN useradd -m -s /bin/bash ansible \ && echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers diff --git a/dockerfiles/debian/Dockerfile b/dockerfiles/debian/Dockerfile index 9378f22..98bf895 100644 --- a/dockerfiles/debian/Dockerfile +++ b/dockerfiles/debian/Dockerfile @@ -22,6 +22,7 @@ RUN apt-get install -y \ jq \ python3 \ python3-pip \ + sudo \ && apt-get clean # Устанавливаем Docker вручную для Debian @@ -44,6 +45,10 @@ RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-c # Настраиваем systemd RUN systemctl set-default multi-user.target +# Настраиваем sudoers для root и пользователей +RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \ + echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test + # Создаем пользователя для Ansible RUN useradd -m -s /bin/bash ansible \ && echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers diff --git a/dockerfiles/redos/Dockerfile b/dockerfiles/redos/Dockerfile index 1be73b7..b1098e2 100644 --- a/dockerfiles/redos/Dockerfile +++ b/dockerfiles/redos/Dockerfile @@ -22,6 +22,7 @@ RUN dnf install -y \ jq \ python3 \ python3-pip \ + sudo \ && dnf clean all # Устанавливаем yq @@ -41,6 +42,10 @@ RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-c # Настраиваем systemd RUN systemctl set-default multi-user.target +# Настраиваем sudoers для root и пользователей +RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \ + echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test + # Создаем пользователя для Ansible RUN useradd -m -s /bin/bash ansible \ && echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers diff --git a/dockerfiles/rhel/Dockerfile b/dockerfiles/rhel/Dockerfile index 94bdea3..87cfed9 100644 --- a/dockerfiles/rhel/Dockerfile +++ b/dockerfiles/rhel/Dockerfile @@ -20,6 +20,7 @@ RUN dnf install -y \ jq \ python3 \ python3-pip \ + sudo \ && dnf clean all # Устанавливаем yq @@ -36,6 +37,10 @@ RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-c # Настраиваем systemd RUN systemctl set-default multi-user.target +# Настраиваем sudoers для root и пользователей +RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \ + echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test + # Создаем пользователя для Ansible RUN useradd -m -s /bin/bash ansible \ && echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers diff --git a/dockerfiles/rocky/Dockerfile b/dockerfiles/rocky/Dockerfile index 53b1e41..d5c14fb 100644 --- a/dockerfiles/rocky/Dockerfile +++ b/dockerfiles/rocky/Dockerfile @@ -20,6 +20,7 @@ RUN dnf install -y \ jq \ python3 \ python3-pip \ + sudo \ && dnf clean all # Устанавливаем yq @@ -38,6 +39,10 @@ RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-c # Настраиваем systemd RUN systemctl set-default multi-user.target +# Настраиваем sudoers для root и пользователей +RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \ + echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test + # Создаем пользователя для Ansible RUN useradd -m -s /bin/bash ansible \ && echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers diff --git a/dockerfiles/ubuntu/Dockerfile b/dockerfiles/ubuntu/Dockerfile index 50dabbd..7ac6296 100644 --- a/dockerfiles/ubuntu/Dockerfile +++ b/dockerfiles/ubuntu/Dockerfile @@ -22,6 +22,7 @@ RUN apt-get install -y \ jq \ python3 \ python3-pip \ + sudo \ && apt-get clean # Устанавливаем Docker вручную для Ubuntu @@ -44,6 +45,10 @@ RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-c # Настраиваем systemd RUN systemctl set-default multi-user.target +# Настраиваем sudoers для root и пользователей +RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \ + echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test + # Создаем пользователя для Ansible RUN useradd -m -s /bin/bash ansible \ && echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers diff --git a/docs/all-images-preset.md b/docs/all-images-preset.md new file mode 100644 index 0000000..aecf908 --- /dev/null +++ b/docs/all-images-preset.md @@ -0,0 +1,155 @@ +# Пресет all-images - Тестирование всех образов + +## Описание + +Пресет `all-images` предназначен для комплексного тестирования Ansible ролей на всех доступных операционных системах проекта. Это самый полный пресет, который включает все 9 образов: + +### Включенные образы + +#### Debian-based системы: +- **Ubuntu** (ubuntu-test) - порт 8080 +- **Debian** (debian-test) - порт 8081 +- **Alt Linux** (alt-test) - порт 8082 +- **Astra Linux** (astra-test) - порт 8083 + +#### RHEL-based системы: +- **CentOS** (centos-test) - порт 8084 +- **RHEL** (rhel-test) - порт 8085 +- **AlmaLinux** (alma-test) - порт 8086 +- **Rocky Linux** (rocky-test) - порт 8087 +- **RedOS** (redos-test) - порт 8088 + +## Использование + +### Запуск тестирования всех образов + +```bash +# Тестирование всех образов +make role test all-images +``` + +### Предварительные требования + +1. **Собранные образы** - все образы должны быть собраны: + ```bash + make docker build + ``` + +2. **Достаточно ресурсов** - тест запускает 9 контейнеров одновременно, требуется: + - Минимум 8GB RAM + - Минимум 4 CPU cores + - Достаточно места на диске + +### Особенности + +#### Порты +Каждый контейнер использует уникальный порт для доступа: +- Ubuntu: `localhost:8080` +- Debian: `localhost:8081` +- Alt Linux: `localhost:8082` +- Astra Linux: `localhost:8083` +- CentOS: `localhost:8084` +- RHEL: `localhost:8085` +- AlmaLinux: `localhost:8086` +- Rocky Linux: `localhost:8087` +- RedOS: `localhost:8088` + +#### Переменные окружения +Каждый контейнер получает переменные: +- `TEST_OS` - название ОС +- `TEST_FAMILY` - семейство ОС (Debian/RedHat/Altlinux/Astra Linux) + +#### Специальные настройки +- **Astra Linux**: автоматическое отключение Parsec +- **Все образы**: предустановленный sudo с настройкой sudoers +- **Systemd**: полная поддержка systemd в контейнерах + +## Производительность + +### Время выполнения +- **Создание контейнеров**: ~2-3 минуты +- **Тестирование ролей**: зависит от сложности ролей +- **Очистка**: ~30 секунд + +### Ресурсы +- **RAM**: 8-16GB (рекомендуется) +- **CPU**: 4-8 cores +- **Диск**: 10-20GB свободного места + +## Отладка + +### Проверка статуса контейнеров +```bash +# Список запущенных контейнеров +docker ps --filter "network=labnet" + +# Логи конкретного контейнера +docker logs ubuntu-test +docker logs astra-test +``` + +### Проблемы и решения + +#### Контейнеры не запускаются +1. Проверьте, что образы собраны: + ```bash + docker images | grep inecs/ansible-lab + ``` + +2. Пересоберите образы: + ```bash + make docker rebuild + ``` + +#### Astra Linux перезапускается +- Проблема решена в Dockerfile (отключение Parsec) +- Если проблема остается, проверьте логи: + ```bash + docker logs astra-test + ``` + +#### Нехватка ресурсов +- Уменьшите количество контейнеров в пресете +- Используйте пресет `minimal` для быстрого тестирования + +## Альтернативные пресеты + +Если `all-images` слишком ресурсоемкий, используйте: + +- `minimal` - 1 контейнер (Debian) +- `default` - 2 контейнера (Debian + RHEL) +- `multi-os` - 12 контейнеров (разные ОС) + +## Мониторинг + +### Логи тестирования +```bash +# Просмотр логов ansible-controller +docker logs ansible-controller + +# Логи конкретного playbook +tail -f /tmp/molecule_workspace/logs/ansible.log +``` + +### Метрики производительности +- Время выполнения каждого этапа +- Использование ресурсов +- Количество успешных/неудачных тестов + +## Интеграция с CI/CD + +Пресет `all-images` идеально подходит для: +- **GitHub Actions** - полное тестирование на всех ОС +- **GitLab CI** - комплексная проверка совместимости +- **Jenkins** - автоматическое тестирование релизов + +### Пример для GitHub Actions +```yaml +- name: Test all images + run: make role test all-images + timeout-minutes: 30 +``` + +## Заключение + +Пресет `all-images` обеспечивает максимальное покрытие тестирования, гарантируя совместимость Ansible ролей со всеми поддерживаемыми операционными системами. Это критически важно для production-окружений с разнородной инфраструктурой. diff --git a/molecule/default/create.yml b/molecule/default/create.yml index c064c9b..c9b024c 100644 --- a/molecule/default/create.yml +++ b/molecule/default/create.yml @@ -77,6 +77,8 @@ capabilities: "{{ systemd_defaults.capabilities | default([]) }}" published_ports: "{{ item.publish | default([]) }}" env: "{{ item.env | default({}) }}" + # Специальные настройки для Astra Linux + security_opts: "{{ ['seccomp=unconfined', 'apparmor=unconfined'] if item.family == 'astra' else [] }}" state: started restart_policy: unless-stopped loop: "{{ hosts | selectattr('type','undefined') | list }}" diff --git a/molecule/default/destroy.yml b/molecule/default/destroy.yml index d73dcf8..f319182 100644 --- a/molecule/default/destroy.yml +++ b/molecule/default/destroy.yml @@ -24,6 +24,14 @@ name: "{{ item.name }}" state: absent force_kill: true + cleanup: true + loop: "{{ hosts }}" + loop_control: { label: "{{ item.name }}" } + ignore_errors: true + + - name: Force remove any remaining containers + shell: | + docker ps -a --filter "name={{ item.name }}" --format "{{ '{{' }}.ID{{ '}}' }}" | xargs -r docker rm -f loop: "{{ hosts }}" loop_control: { label: "{{ item.name }}" } ignore_errors: true @@ -51,6 +59,21 @@ state: absent ignore_errors: true + - name: Force cleanup all project containers + shell: | + # Удаляем все контейнеры из загруженного пресета + {% for host in hosts %} + docker ps -a --filter "name={{ host.name }}" --format "{{ '{{' }}.ID{{ '}}' }}" | xargs -r docker rm -f 2>/dev/null || true + {% endfor %} + # Удаляем все контейнеры с образами ansible-lab + docker ps -a --filter "ancestor=inecs/ansible-lab" --format "{{ '{{' }}.ID{{ '}}' }}" | xargs -r docker rm -f 2>/dev/null || true + # Удаляем все контейнеры с сетью labnet + docker ps -a --filter "network=labnet" --format "{{ '{{' }}.ID{{ '}}' }}" | xargs -r docker rm -f 2>/dev/null || true + ignore_errors: true + vars: + # Используем переменную hosts из загруженного пресета + hosts: "{{ hosts }}" + - name: Display cleanup summary debug: msg: | diff --git a/molecule/default/site.yml b/molecule/default/site.yml index e422a9a..1032c01 100644 --- a/molecule/default/site.yml +++ b/molecule/default/site.yml @@ -38,7 +38,17 @@ - name: Update package cache (Alt Linux) apt: update_cache: true - when: ansible_distribution == 'Alt' + when: ansible_os_family == 'Altlinux' + changed_when: false + tags: + - setup + - update + + # Обновление кеша пакетов для Astra Linux + - name: Update package cache (Astra Linux) + apt: + update_cache: true + when: ansible_os_family == 'Astra Linux' changed_when: false tags: - setup @@ -55,7 +65,6 @@ - iputils-ping - procps - net-tools - - sudo - vim - wget - unzip @@ -77,7 +86,6 @@ - iputils - procps-ng - net-tools - - sudo - vim - wget - unzip @@ -98,13 +106,32 @@ - iputils - procps - net-tools - - sudo - vim - wget - unzip - git state: present - when: ansible_distribution == 'Alt' + when: ansible_os_family == 'Altlinux' + tags: + - setup + - tools + + - name: Install common tools (Astra Linux) + apt: + name: + - curl + - jq + - ca-certificates + - iproute2 + - iputils + - procps + - net-tools + - vim + - wget + - unzip + - git + state: present + when: ansible_os_family == 'Astra Linux' tags: - setup - tools @@ -139,7 +166,18 @@ - python3 - python3-pip state: present - when: ansible_distribution == 'Alt' + when: ansible_os_family == 'Altlinux' + tags: + - setup + - python + + - name: Install Python (Astra Linux) + apt: + name: + - python3 + - python3-pip + state: present + when: ansible_os_family == 'Astra Linux' tags: - setup - python diff --git a/molecule/presets/all-images.yml b/molecule/presets/all-images.yml new file mode 100644 index 0000000..f85e6b0 --- /dev/null +++ b/molecule/presets/all-images.yml @@ -0,0 +1,111 @@ +--- +#description: Пресет для тестирования всех доступных образов (9 хостов) +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +docker_network: labnet +generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini" + +# systemd-ready образы +images: + alt: "inecs/ansible-lab:alt-linux-latest" + astra: "inecs/ansible-lab:astra-linux-latest" + rhel: "inecs/ansible-lab:rhel-latest" + centos: "inecs/ansible-lab:centos-latest" + alma: "inecs/ansible-lab:alma-latest" + rocky: "inecs/ansible-lab:rocky-latest" + redos: "inecs/ansible-lab:redos-latest" + ubuntu: "inecs/ansible-lab:ubuntu-latest" + debian: "inecs/ansible-lab:debian-latest" + +systemd_defaults: + privileged: true + command: "/sbin/init" + volumes: + - "/sys/fs/cgroup:/sys/fs/cgroup:ro" + tmpfs: ["/run", "/run/lock"] + capabilities: ["SYS_ADMIN"] + +hosts: + # Debian-based системы + - name: ubuntu-test + family: ubuntu + groups: [test, debian] + publish: + - "8080:80" + env: + TEST_OS: "Ubuntu" + TEST_FAMILY: "Debian" + + - name: debian-test + family: debian + groups: [test, debian] + publish: + - "8081:80" + env: + TEST_OS: "Debian" + TEST_FAMILY: "Debian" + + - name: alt-test + family: alt + groups: [test, altlinux] + publish: + - "8082:80" + env: + TEST_OS: "Alt Linux" + TEST_FAMILY: "Altlinux" + + - name: astra-test + family: astra + groups: [test, astra] + publish: + - "8083:80" + env: + TEST_OS: "Astra Linux" + TEST_FAMILY: "Astra Linux" + + # RHEL-based системы + - name: centos-test + family: centos + groups: [test, rhel] + publish: + - "8084:80" + env: + TEST_OS: "CentOS" + TEST_FAMILY: "RedHat" + + - name: rhel-test + family: rhel + groups: [test, rhel] + publish: + - "8085:80" + env: + TEST_OS: "RHEL" + TEST_FAMILY: "RedHat" + + - name: alma-test + family: alma + groups: [test, rhel] + publish: + - "8086:80" + env: + TEST_OS: "AlmaLinux" + TEST_FAMILY: "RedHat" + + - name: rocky-test + family: rocky + groups: [test, rhel] + publish: + - "8087:80" + env: + TEST_OS: "Rocky Linux" + TEST_FAMILY: "RedHat" + + - name: redos-test + family: redos + groups: [test, rhel] + publish: + - "8088:80" + env: + TEST_OS: "RedOS" + TEST_FAMILY: "RedHat" \ No newline at end of file diff --git a/molecule/presets/minimal.yml b/molecule/presets/minimal.yml index db39883..1baa39b 100644 --- a/molecule/presets/minimal.yml +++ b/molecule/presets/minimal.yml @@ -29,5 +29,8 @@ systemd_defaults: hosts: # Минимальный набор - один хост - name: u1 - family: debian + family: astra groups: [test] + - name: u2 + family: alt + groups: [test] \ No newline at end of file diff --git a/scripts/update-dockerfiles-sudo.sh b/scripts/update-dockerfiles-sudo.sh new file mode 100644 index 0000000..b2d3cf1 --- /dev/null +++ b/scripts/update-dockerfiles-sudo.sh @@ -0,0 +1,58 @@ +#!/bin/bash +# Скрипт для добавления sudo во все Dockerfile +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +set -euo pipefail + +echo "🔧 Добавление sudo во все Dockerfile..." + +# Список всех Dockerfile для обновления +DOCKERFILES=( + "dockerfiles/ubuntu/Dockerfile" + "dockerfiles/debian/Dockerfile" + "dockerfiles/alt-linux/Dockerfile" + "dockerfiles/centos/Dockerfile" + "dockerfiles/rhel/Dockerfile" + "dockerfiles/alma/Dockerfile" + "dockerfiles/rocky/Dockerfile" + "dockerfiles/redos/Dockerfile" +) + +for dockerfile in "${DOCKERFILES[@]}"; do + if [ -f "$dockerfile" ]; then + echo "📝 Обновление $dockerfile..." + + # Для Debian-based систем (Ubuntu, Debian, Alt Linux) + if [[ "$dockerfile" =~ (ubuntu|debian|alt-linux) ]]; then + # Добавляем sudo в список пакетов + sed -i '/python3-pip \\/a\\ sudo \\' "$dockerfile" + + # Добавляем настройку sudoers перед созданием пользователя + sed -i '/# Создаем пользователя для Ansible/i\\ +# Настраиваем sudoers для root и пользователей\\ +RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers \&\& \\\\ + echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test\\ +' "$dockerfile" + fi + + # Для RHEL-based систем (CentOS, RHEL, Alma, Rocky, RedOS) + if [[ "$dockerfile" =~ (centos|rhel|alma|rocky|redos) ]]; then + # Добавляем sudo в список пакетов + sed -i '/python3-pip \\/a\ sudo \\' "$dockerfile" + + # Добавляем настройку sudoers перед созданием пользователя + sed -i '/# Создаем пользователя для Ansible/i\ +# Настраиваем sudoers для root и пользователей\ +RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \\\ + echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test\ +' "$dockerfile" + fi + + echo "✅ $dockerfile обновлен" + else + echo "⚠️ Файл $dockerfile не найден" + fi +done + +echo "🎉 Все Dockerfile обновлены!"