88 Commits

Author SHA1 Message Date
Sergey Antropoff
700452f681 make: добавлен setup и усилен podman role test
Добавлен таргет make setup для создания vault/.vault с интерактивным вводом пароля.
В make role test добавлены проверки локального ansible-controller, запрет pull и корректный exit code.

Made-with: Cursor
2026-03-25 12:12:49 +03:00
Sergey Antropoff
05881e8d74 podman: переход на Podman, Minikube, локальные образы и док для новичков
- Molecule: драйвер delegated, коллекция containers.podman, create/destroy/verify на Podman
- Makefile: все вызовы docker заменены на podman, сокет /run/podman/podman.sock
- Сборка образов: podman build (без buildx), buildall/buildall-image — только локально без push
- Ansible-controller: Podman в образе, docker-compose на podman compose, сокет Podman
- K8s: Kind заменён на Minikube (драйвер podman), скрипты и Makefile обновлены
- Пресеты: проверка локальных образов, без podman pull (registry запрещён)
- Документация: docs/podman.md, docs/quickstart-for-dummies.md (роли, плейбук, линт, тесты, пресеты, инвентори)
- README: ссылка на quickstart-for-dummies

Made-with: Cursor
2026-03-11 19:59:47 +03:00
Сергей Антропов
23e1a6037b Добавлена роль repo для автоматического добавления репозиториев
- Создана новая роль repo для добавления репозиториев на все ОС
- Добавлена поддержка Docker, PostgreSQL, Elasticsearch, Patroni репозиториев
- Реализована специальная поддержка российских дистрибутивов:
  - Astra Linux: добавлены репозитории Lab50 и debian-archive-keyring
  - Alt Linux: добавлены репозитории Sisyphus (alt-sisyphus, classic, contrib) и Autoimports
- Обновлена документация README.md с информацией о новой роли
- Обновлен .ansible-lint для подавления необходимых правил
- Автор: Сергей Антропов, https://devops.org.ru
2025-10-30 03:13:35 +03:00
Сергей Антропов
a2316ae780 тестый шифрования пройдены 2025-10-30 01:29:41 +03:00
Сергей Антропов
25d04188b8 тест шифрования при пуше 2025-10-30 01:26:48 +03:00
Сергей Антропов
981ede5c94 Обновление проекта 2025-10-30 01:10:35 +03:00
Сергей Антропов
2ce450215b feat: убран подробный вывод установки пакетов в run.yml
- Добавлен no_log: true для всех задач установки common tools
- Добавлен no_log: true для всех задач установки Python
- Теперь задачи показывают 'censored' вместо подробного вывода
- Улучшена читаемость логов тестирования

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-29 18:59:57 +03:00
Сергей Антропов
cb5045fb79 feat: улучшения роли devops и тестирования
- Убрана подстановка значений по умолчанию для devops_password и devops_ssh_public_key
- Добавлена строгая валидация секретов из vault/secrets.yml с детальными сообщениями об ошибках
- Убран подробный вывод установки пакетов в тасках
- Исправлена проблема с созданием симлинков в vault/ при тестировании
- Обновлена логика загрузки vault переменных в molecule тестах
- Добавлена очистка симлинков в destroy.yml для дополнительной безопасности

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-29 18:53:52 +03:00
Сергей Антропов
f6d1182193 Обновление проекта 2025-10-28 19:19:49 +03:00
Сергей Антропов
0b4efd9ca1 feat: Добавлена роль Python 3.12 и восстановлена роль Docker
- Создана универсальная роль Python для установки Python 3.12 на всех ОС
- Восстановлена роль Docker из git истории
- Исправлены все ошибки линтера
- Обновлен deploy.yml с правильным порядком ролей: devops → python → docker
- Удалена устаревшая роль ping
- Добавлена поддержка альтернативных репозиториев для старых ОС

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-27 22:08:37 +03:00
Сергей Антропов
1b6db7445d docs: Обновление документации и исправление RHEL образа
- Обновлен README.md с новыми возможностями COD preset и роли devops
- Добавлена документация по COD preset (docs/cod-preset.md)
- Добавлена документация по роли devops (docs/devops-role.md)
- Обновлена документация по ARM64 поддержке (docs/arm64-support.md)
- Обновлены примеры использования (docs/examples.md)
- Исправлен Dockerfile для RHEL с Python 3.11 из EPEL
- Обновлен COD preset с 6 контейнерами (Ubuntu + Debian + Alt + Astra + CentOS + RHEL)
- Улучшена роль devops с поддержкой российских ОС
- Добавлен CHANGELOG.md с историей изменений
- Все изменения протестированы на ARM64 архитектуре
2025-10-27 20:27:45 +03:00
Сергей Антропов
5ea320ce9a Обновление проекта 2025-10-27 20:06:32 +03:00
Сергей Антропов
d7397fe7fe Обновление проекта 2025-10-27 19:43:49 +03:00
Сергей Антропов
5543ae4d27 feat: Переименование geop в cod и добавление ARM64 поддержки
- Переименован пресет geop.yml в cod.yml
- Обновлены все группы с geop на cod
- Добавлена поддержка ARM64 для Astra Linux и RedOS
- Создан Dockerfile.arm64 для RedOS с исправлением конфликтов пакетов
- Улучшены разделители в логах Molecule
- Зашифрован файл vault/secrets.yml
- Обновлена роль devops с поддержкой vault
- Добавлены шаблоны для SSH и sudoers конфигураций
2025-10-27 19:43:26 +03:00
Сергей Антропов
c66bb35f97 feat: Добавлена поддержка ARM64 для Astra Linux и обновлена документация
- Создан совместимый образ Astra Linux для ARM64 на базе Debian
- Добавлена команда make docker build-astra-arm64 для сборки ARM64 версии
- Обновлена документация по Docker образам с информацией о ARM64 поддержке
- Создан новый файл docs/arm64-support.md с подробным описанием ARM64 поддержки
- Обновлен README.md с информацией о multi-arch поддержке
- Добавлена информация о ALT Linux P9/P10 с поддержкой ARM64

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-27 14:16:29 +03:00
Сергей Антропов
c83b2526dc feat: настроен nano как редактор по умолчанию для vault команд
- Добавлена глобальная переменная EDITOR=nano в Makefile
- Обновлены команды vault (create, edit, rekey) для использования nano
- Обновлена справка с указанием использования nano
- Теперь make vault edit открывает nano вместо vim

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-27 12:32:03 +03:00
Сергей Антропов
c3ba139d45 Перемещены пресеты k8s в подпапку molecule/presets/k8s/ 2025-10-27 11:44:15 +03:00
Сергей Антропов
6d06dbf745 Merge branch 'k8s' 2025-10-27 11:28:00 +03:00
Сергей Антропов
3953650f25 Удалена автоматическая очистка port-forward из make k8s destroy 2025-10-27 11:26:53 +03:00
Сергей Антропов
98af514e2c Merge k8s в main: добавлена поддержка Kubernetes Kind кластеров 2025-10-27 11:21:45 +03:00
Сергей Антропов
28ab44e6a6 Добавлен .dockerignore с .github, удалена папка .github из репозитория 2025-10-27 11:18:46 +03:00
Сергей Антропов
8734519be2 Обновлен Makefile: добавлены alt9/alt10, исправлен redos, добавлена поддержка AMD64 для astra-linux и redos
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
2025-10-27 11:16:50 +03:00
Сергей Антропов
d02dd1f9e2 Восстановлены пресеты для Kubernetes
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
2025-10-27 10:48:43 +03:00
Сергей Антропов
d37f59ba77 Переименование проекта AnsibleLab в DevOpsLab
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
2025-10-27 10:46:04 +03:00
Сергей Антропов
fbf6c3e813 Исправлено: make docker pull теперь корректно обрабатывает astra-linux и redos для ARM64
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
2025-10-27 10:38:06 +03:00
Сергей Антропов
5169310c35 Исправлено определение тега для redos в docker-get-base-tag
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
2025-10-27 09:59:07 +03:00
Сергей Антропов
50bfff11c7 Добавлен alt10 во все пресеты с ALT Linux 2025-10-27 09:58:16 +03:00
Сергей Антропов
f5b13436a7 Добавлены alt9 и alt10 вместо alt-linux во все файлы 2025-10-27 09:57:01 +03:00
Сергей Антропов
13a294a20c Переименование alt-linux в alt9 и добавление alt10 2025-10-27 09:53:14 +03:00
Сергей Антропов
37ff18c91b Обновлена документация dockerfiles/README.md: добавлен образ k8s, обновлена структура и нумерация
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
Ansible Testing / lint (pull_request) Has been cancelled
Ansible Testing / test (default) (pull_request) Has been cancelled
Ansible Testing / test (minimal) (pull_request) Has been cancelled
Ansible Testing / test (performance) (pull_request) Has been cancelled
Ansible Testing / deploy-check (pull_request) Has been cancelled
2025-10-26 12:54:59 +03:00
Сергей Антропов
4e86b7f0c3 Обновлена документация dockerfiles.md: добавлен образ k8s, обновлена структура и матрица совместимости
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
2025-10-26 12:51:30 +03:00
Сергей Антропов
85b68dc4d0 Обновлена структура проекта в README.md
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
2025-10-26 12:48:28 +03:00
Сергей Антропов
a56de6183a docs: обновлено описание проекта DevOpsLab с учетом K8s
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Расширено описание проекта - теперь это DevOps платформа
- Добавлены ключевые компоненты: Ansible, Docker, Kubernetes
- Структурированы возможности по категориям:
  * Ansible (автоматизация)
  * Docker (контейнеризация)
  * Kubernetes (оркестрация)
- Добавлен раздел быстрого старта для K8s
- Расширен раздел Kubernetes с:
  * Основными командами
  * Доступными аддонами
  * Путями доступа к сервисам
2025-10-26 12:44:20 +03:00
Сергей Антропов
d8e1052e7b refactor: переименование проекта AnsibleLab -> DevOpsLab
- Заменено название проекта во всех файлах проекта
- Обновлены:
  * README.md
  * Makefile
  * Все файлы документации (.md)
  * CI/CD конфигурации (Jenkins, GitLab, GitHub Actions, Azure DevOps)
  * Скрипты (setup-cicd.sh, test-custom-images.sh)
  * Файлы конфигурации Molecule
- Изменена переменная PROJECT_NAME в Makefile на devops-lab
- Docker образы inecs/ansible-lab:* оставлены без изменений
  (чтобы не затрагивать существующие образы в Docker Hub)
2025-10-26 12:28:05 +03:00
Сергей Антропов
c2ab17b7b6 chore: удален неиспользуемый скрипт portforward_container.py
- Скрипт был экспериментальным решением для запуска port-forward в контейнере
- Итоговое решение: использование portforward.py напрямую на хосте
- Скрипт не использовался ни в Makefile, ни в документации
2025-10-26 12:25:26 +03:00
Сергей Антропов
c2a84a3aee refactor: удалено автоматическое создание port-forward
- Удалено автоматическое создание port-forward при создании кластера
- Port-forward теперь создается только вручную через make k8s portforward create
- Команда list уже доступна в help
- Обновлены сообщения с подсказками
2025-10-26 11:57:06 +03:00
Сергей Антропов
0ffe1f1a90 refactor: удален скрипт manage_hosts.py и все упоминания
- Удален скрипт scripts/manage_hosts.py
- Удалены все вызовы из Makefile
- Удалены упоминания из документации
- Обновлена документация по Ingress - теперь требуется ручное добавление в /etc/hosts
- Убрано автоматическое управление /etc/hosts (не состоятельное решение)
2025-10-26 11:56:14 +03:00
Сергей Антропов
df7473fbd9 fix: исправлена проблема с пробросом портов Ingress
- Исправлена логика добавления extraPortMappings в конфигурацию Kind
- Порты 80 и 443 теперь правильно пробрасываются на host (8081, 8443)
- Создана документация k8s-ingress-fix.md с инструкциями
2025-10-26 10:58:37 +03:00
Сергей Антропов
eca556cca7 docs: полная переработка документации по Kubernetes
- Создана подробная документация по скриптам (k8s-scripts.md)
- Полностью переписана документация kubernetes-kind.md
- Добавлено содержание с навигацией
- Добавлены разделы: Helm, манифесты, Ingress, port-forward
- Добавлена архитектура взаимодействия
- Добавлены Best Practices и Troubleshooting
- Обновлена справка в Makefile
- Удалены устаревшие команды (manifest update, addon)
- Добавлена ссылка на документацию по скриптам
2025-10-26 10:23:16 +03:00
Сергей Антропов
fcf3f33e80 feat: добавлен детальный отчет о состоянии кластера
- Создан скрипт scripts/k8s_status.py для детального отчета
- Показывает: узлы, namespaces, pods, deployments, daemonsets,
  statefulsets, services, ingress, PVC, события, Helm релизы
- Исправлена проблема с подключением kubectl (используется
  прямой адрес control-plane)
- Команда make k8s status теперь показывает полный отчет
2025-10-26 10:16:24 +03:00
Сергей Антропов
6ef4090fb2 feat: добавлено автоматическое обновление Ingress хостов во всех операциях
- Обновлен вызов скрипта: sudo scripts/manage_hosts.py вместо sudo python3
- Добавлено обновление хостов после:
  - make k8s manifest delete
  - make k8s manifest update
  - make k8s helm delete
- Теперь хосты автоматически обновляются при любых изменениях Ingress
- Применен тестовый манифест grafana-ingress
2025-10-26 10:14:00 +03:00
Сергей Антропов
9677aea281 feat: автоматическое обновление Ingress хостов при изменениях
- Добавлен вызов manage_hosts.py после:
  - make k8s manifest apply
  - make k8s addon
  - make k8s helm apply
  - make k8s helm update
- Создан тестовый манифест grafana-ingress
- Автоматическое обновление /etc/hosts при любых изменениях Ingress
2025-10-26 10:06:41 +03:00
Сергей Антропов
fd80db220a feat: автоматическое управление Ingress хостами в /etc/hosts
- Добавлен скрипт scripts/manage_hosts.py для управления /etc/hosts
- Автоматическое добавление Ingress хостов при создании кластера
- Автоматическое удаление Ingress хостов при удалении кластера
- Записи помечаются меткой #k8s для разделения со статическими
- Команды: add, remove, cleanup, list
2025-10-26 10:03:59 +03:00
Сергей Антропов
4ca882b5f7 docs: добавлены примеры доступа к приложениям и кроссплатформенность
- Добавлен раздел 'Доступ к приложениям'
- Описан доступ через Ingress с примерами hosts файла
- Описан доступ через ClusterIP с ручным port-forward
- Добавлен раздел 'Кроссплатформенность' для macOS и Linux
- Добавлены примеры работы с пользовательскими приложениями
2025-10-26 09:59:41 +03:00
Сергей Антропов
3b8c6e52ea docs: обновлена документация Kubernetes Kind
- Добавлен раздел 'Требования к системе' (Python 3, kubectl)
- Описан автоматический port-forward
- Добавлены все команды Helm (apply, delete, update, rollback, list, status)
- Добавлены команды управления Helm репозиториями
- Добавлены команды работы с манифестами
- Обновлены примеры использования
- Добавлен раздел Troubleshooting для port-forward
- Обновлена архитектура с учетом port-forward
- Добавлены порты Ingress и Metrics Server
2025-10-26 09:58:50 +03:00
Сергей Антропов
02eab55d73 feat: автоматический port-forward при создании/удалении кластера
- Port-forward создается автоматически при make k8s create
- Port-forward очищается автоматически при make k8s destroy
2025-10-26 09:55:49 +03:00
Сергей Антропов
e3d393ef91 refactor: убраны команды контейнера port-forward, используется локальный подход
- Удалены команды container-start, container-stop, container-restart, container-status, container-logs
- Оставлены только локальные команды: create, list, clear, recreate, delete
- Port-forward работает локально через Python и kubectl на хосте
- Упрощена справка
2025-10-26 09:51:35 +03:00
Сергей Антропов
6d55f924e5 feat: добавлены команды управления контейнером port-forward в make k8s portforward
- Добавлены команды: container-start, container-stop, container-restart, container-status, container-logs
- Локальные команды: create, list, clear, recreate, delete
- Команды контейнера работают через k8s-controller
- Обновлена справка с описанием всех команд
2025-10-26 09:49:50 +03:00
Сергей Антропов
69a589974e wip: попытка запускать port-forward через k8s-controller (требуется доработка) 2025-10-26 09:48:51 +03:00
Сергей Антропов
3238b3903a feat: добавлен контейнер k8s-portforward для порт-форвардинга
- Создан Dockerfile для контейнера порт-форвардинга
- Скрипт portforward-container.py работает внутри контейнера
- Скрипт portforward_container.py управляет контейнером с хоста
- Контейнер автоматически пробрасывает порты через -p
- Контейнер подключается к сети Kind для доступа к кластеру
- Добавлен k8s-portforward в docker-get-base-tag
2025-10-26 09:48:05 +03:00
Сергей Антропов
ab1231fce5 feat: добавлен базовый контейнер для port-forward (не используется, требуется доработка) 2025-10-26 09:45:57 +03:00
Сергей Антропов
44fff158ce feat: добавлены порты Ingress (80, 443) в port-forward
- Добавлен port-forward для Ingress HTTP на порт 8081 (localhost:8081 -> ingress-nginx-controller:80)
- Добавлен port-forward для Ingress HTTPS на порт 8443 (localhost:8443 -> ingress-nginx-controller:443)
- Теперь все аддоны доступны через port-forward: Ingress, Prometheus, Grafana, Kiali, Metrics Server
2025-10-26 09:40:47 +03:00
Сергей Антропов
604c7816be feat: port-forward теперь работает на локальном компьютере
- Скрипт получает kubeconfig из контейнера k8s-controller
- Заменяет server 0.0.0.0 на localhost для локального доступа
- Port-forward запускается на хосте через локальный kubectl
- Все аддоны доступны на localhost: Grafana 3000, Prometheus 9090, Kiali 20001
2025-10-26 09:39:20 +03:00
Сергей Антропов
06bfc00b5a fix: удалены extraPortMappings для аддонов, port-forward перенесен в отдельный скрипт 2025-10-26 09:34:59 +03:00
Сергей Антропов
ebed1f76ab feat: добавлена команда recreate для port-forward
- Добавлена функция recreate_portforwards() в scripts/portforward.py
- Команда recreate удаляет все существующие port-forward и создает их заново
- Добавлена команда в Makefile: make k8s portforward recreate
- Полезно для переподключения после перезапуска контейнера или кластера
2025-10-26 09:28:07 +03:00
Сергей Антропов
69b547dda6 feat: добавлен port-forward для кластера Kubernetes
- Создан скрипт scripts/portforward.py для управления port-forward
- Добавлены команды в Makefile:
  - make k8s portforward create - создать port-forward для всех сервисов
  - make k8s portforward list - показать активные port-forward
  - make k8s portforward clear - очистить все port-forward
  - make k8s portforward delete PORT - удалить конкретный port-forward
- Сервисы остаются с типом ClusterIP
- Port-forward автоматически создается для Prometheus, Grafana, Kiali и Metrics Server
- Порты: Prometheus 9090, Grafana 3000, Kiali 20001, Metrics Server 4443
2025-10-26 09:25:59 +03:00
Сергей Антропов
d48c273e50 feat: добавлен порт для Metrics Server
- Добавлен проброс порта 4443 для Metrics Server
- Metrics Server теперь доступен на http://localhost:4443
- Обновлена документация с информацией о порте
2025-10-26 09:13:22 +03:00
Сергей Антропов
87002cb9b3 refactor: использование ClusterIP вместо NodePort
- Убрана логика патчинга NodePort для Prometheus, Grafana и Kiali
- Сервисы теперь остаются с типом ClusterIP
- Порты пробрасываются через extraPortMappings в Kind конфиге
- Использованы стандартные порты: Prometheus 9090, Grafana 3000, Kiali 20001
- Более простой и надежный подход без ограничений NodePort диапазона
2025-10-26 09:11:32 +03:00
Сергей Антропов
e2b9d94075 fix: исправлены порты для NodePort и добавлены Helm репозитории
- Изменены порты Prometheus, Grafana и Kiali на NodePort диапазон (30000-32767)
- Добавлены Helm репозитории для Kiali и Prometheus
- Исправлена логика extraPortMappings для правильного маппинга портов
- Prometheus: 30900, Grafana: 30000, Kiali: 32001
2025-10-26 09:07:00 +03:00
Сергей Антропов
791504abf6 fix: исправлена установка Istio, Kiali и Prometheus Stack
- Istio теперь использует исправленный kubeconfig с IP control-plane узла
- Helm команды теперь используют исправленный kubeconfig
- Создание namespace сделано идемпотентным (не прерывает скрипт при существовании)
- Все аддоны теперь должны устанавливаться корректно
2025-10-26 08:52:43 +03:00
Сергей Антропов
33e329c091 refactor: перенос портов ingress в addon_ports
- Удалены ingress_host_http_port и ingress_host_https_port
- Все порты (ingress, prometheus, grafana, kiali) теперь в addon_ports
- Обновлен скрипт create_k8s_cluster.py для работы с новой структурой
- Все порты теперь пробрасываются через extraPortMappings в конфигурации Kind
- Порты теперь видны в контейнерах control-plane и worker
2025-10-26 08:38:57 +03:00
Сергей Антропов
5c8862e9bf fix: исправлено подключение kubectl к API серверу Kind
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Добавлен --validate=false для отключения валидации при установке аддонов
- kubectl теперь подключается напрямую к control-plane узлу
- Контейнер k8s-controller автоматически подключается к сети kind
- Все kubectl команды используют --server=https://{name}-control-plane:6443 --insecure-skip-tls-verify
2025-10-26 08:34:59 +03:00
Сергей Антропов
591cdaf831 refactor: переименовать контейнер Kubernetes в k8s-controller
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Все команды make k8s теперь используют единый контейнер k8s-controller
- Упрощена логика именования контейнеров
- Контейнер k8s-controller используется для всех операций с Kubernetes
2025-10-26 08:28:19 +03:00
Сергей Антропов
377e15119a refactor: запуск Python скриптов через контейнер k8s
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Команда destroy теперь запускает delete_hosts.py через контейнер k8s
- Все Python скрипты выполняются внутри Docker контейнера для единообразия
- Если контейнер не запущен, скрипты выполняются на хосте (fallback)
2025-10-26 08:26:20 +03:00
Сергей Антропов
4ed9c2e0eb feat: добавлена поддержка создания и удаления контейнеров из пресета
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Добавлено создание контейнеров из секции hosts в create_k8s_cluster.py
- Добавлено удаление контейнеров в команде make k8s destroy
- Создан скрипт scripts/delete_hosts.py для удаления контейнеров
- Контейнеры автоматически создаются в Docker сети из пресета
- Контейнеры удаляются вместе с Kind кластером при make k8s destroy
2025-10-26 08:23:43 +03:00
Сергей Антропов
60c2623fbc refactor: удалить лишние задачи Kind из create.yml и destroy.yml
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Удалены все задачи по созданию Kind кластеров из create.yml
- Удалены все задачи по удалению Kind кластеров из destroy.yml
- Добавлены комментарии о том, что все операции с Kind выполняются через make k8s
- Теперь Kind кластеры полностью управляются через Python скрипт create_k8s_cluster.py
2025-10-26 08:15:44 +03:00
Сергей Антропов
1b6c83d941 docs: добавить полное руководство по работе с Kubernetes
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Создано подробное руководство docs/kubernetes-full-guide.md
- Описаны все аспекты работы с Kubernetes кластерами
- Добавлены примеры использования манифестов, Helm, Ingress
- Подробно описана работа с мониторингом (Prometheus, Grafana)
- Документирована работа с Service Mesh (Istio, Kiali)
- Добавлены примеры полных развертываний
- Включены разделы по безопасности и отладке
- Документация на русском языке с большим количеством примеров
2025-10-26 03:37:12 +03:00
Сергей Антропов
714ca43d38 feat: добавить команды для работы с манифестами, Helm и Helm репозиториями
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Добавлены команды make k8s manifest для работы с манифестами YAML
- Добавлены команды make k8s helm для управления Helm чартами
- Добавлены команды make k8s helmrepo для управления Helm репозиториями
- Создана подробная документация docs/kubernetes-commands.md
- Обновлена справка в Makefile

Поддерживаемые операции:
- manifest: apply, delete, update
- helm: apply, delete, update, rollback, list, status
- helmrepo: add, list, delete, update, packages
2025-10-26 03:33:47 +03:00
Сергей Антропов
881502ad69 feat: добавить поддержку Kubernetes Kind кластеров
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Создан новый Docker образ k8s для работы с Kind, kubectl, Helm, Istio CLI
- Добавлены команды make k8s: create, destroy, stop, start, status, config, nodes, addon, shell
- Добавлена поддержка пресетов Kubernetes в molecule/presets/k8s/
- Создан скрипт create_k8s_cluster.py для автоматического создания кластеров и установки аддонов
- Добавлена документация docs/kubernetes-kind.md
- Команды kubectl выполняются внутри контейнера k8s, не требуют локальной установки
2025-10-26 03:30:58 +03:00
Сергей Антропов
c1655d2674 chore: обновлена версия проекта с 2.0.0 на 3.0.0
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Обновлена версия в README.md
- Обновлена версия во всех файлах docs/
- Обновлена версия в dockerfiles/README.md
- Обновлена версия в roles/*/QUICKSTART.md
- Подготовка к версии 3.0.0 с Kubernetes поддержкой

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-26 01:36:54 +03:00
Сергей Антропов
43ded4dde0 docs: обновлена структура dockerfiles/ в dockerfiles/README.md
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Добавлены все версии ОС (Ubuntu 20/22/24, Debian 9/10/11/12, CentOS 7/8/9)
- Добавлены все Dockerfiles для каждой версии ОС
- Добавлены файлы в ansible-controller (Dockerfile, docker-compose.yml, requirements.txt)
- Структура полностью соответствует реальной

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-26 01:34:02 +03:00
Сергей Антропов
fce70479c9 docs: обновлена структура проекта в README.md
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Добавлены все версии ОС в dockerfiles/
- Добавлена роль devops в roles/
- Добавлены preset'ы в molecule/presets/examples/
- Добавлены все CI/CD конфигурации
- Структура проекта полностью соответствует реальной

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-26 01:32:51 +03:00
Сергей Антропов
2c151301a0 docs: добавлены описания всех версий ОС в dockerfiles/README.md
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Добавлены описания Ubuntu 20.04, 22.04, 24.04
- Добавлены описания Debian 9, 10, 11, 12
- Добавлены описания CentOS 7, 8, 9
- Упрощена структура документации
- Все версии ОС теперь имеют полные описания

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-26 01:32:01 +03:00
Сергей Антропов
82afa9e981 docs: исправлен dockerfiles/README.md - убрано упоминание Docker CE
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Docker CE и Docker Compose не установлены в базовых образах
- Удалены устаревшие упоминания Docker пакетов
- Добавлены примечания о том, что Docker не установлен
- Документация приведена в соответствие с реальным состоянием Dockerfiles

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-26 01:30:10 +03:00
Сергей Антропов
8be79a21ee docs: обновлены QUICKSTART файлы в roles/
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- roles/ping/QUICKSTART.md - обновлены команды Makefile, добавлены новые возможности
- roles/devops/QUICKSTART.md - обновлены команды, добавлена версия 2.0.0
- Добавлены примеры проверки результатов в контейнерах
- Обновлены примеры использования с актуальными командами
- Добавлены разделы про теги и дополнительные возможности

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-26 01:27:42 +03:00
Сергей Антропов
4e380971a6 docs: полностью переписана документация в docs/
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Обновлены все файлы под актуальные команды Makefile
- Исправлены устаревшие команды (preset-list, container-info и т.д.)
- Добавлена версия 2.0.0 во все файлы
- examples.md полностью переписан с актуальными примерами
- creating-roles.md обновлен с правильными командами
- Удалены устаревшие примеры и команды

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-26 01:22:47 +03:00
Сергей Антропов
7c64b8c6fe docs: обновлен platform-support.md под новое название проекта
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Обновлен заголовок под AnsibleLab
- Добавлена версия 2.0.0
- Исправлено форматирование автора

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-26 01:20:23 +03:00
Сергей Антропов
3482980c3d docs: обновлен monitoring.md с актуальной информацией
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Убраны устаревшие скрипты мониторинга и алертов
- Добавлены реальные команды для диагностики AnsibleLab
- Упрощена структура документа
- Добавлены команды для macOS и Linux
- Удалены неактуальные разделы (дашборд, автоматизация)
- Добавлен раздел 'Решение проблем' с практичными решениями
- Добавлена информация о проверке preset'ов и контейнеров Molecule

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-26 01:20:13 +03:00
Сергей Антропов
afa0be02fd docs: обновлен getting-started.md под реальную структуру проекта
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Исправлены ссылки на репозиторий
- Добавлена актуальная структура ролей (docker, devops, ping)
- Обновлены команды и примеры под текущую версию проекта
- Добавлена информация о preset системе
- Убраны устаревшие разделы (CI/CD, мониторинг)
- Упрощена структура для быстрого старта

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-26 01:19:02 +03:00
Сергей Антропов
f410f7964c docs: добавлена роль devops в документацию
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Добавлена роль devops в раздел 'Доступные роли'
- Добавлена ссылка на документацию роли devops в разделе документации
- Роль для установки и настройки инструментов DevOps

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-26 01:14:47 +03:00
Сергей Антропов
757e35090e fix: исправлена документация по Docker образам - убран Docker CE
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Удалены упоминания об установленном Docker CE и Docker Compose Plugin
- Добавлены примечания, что Docker не установлен (закомментирован в Dockerfile)
- Исправлены описания всех образов (Ubuntu, Debian, CentOS, Alma, Rocky, RHEL, ALT, Astra, RED OS)
- Docker CE и Docker Compose закомментированы в Dockerfile'ах

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-26 01:12:50 +03:00
Сергей Антропов
65137093f4 docs: добавлена полная документация по Molecule и Docker образам
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Создан docs/dockerfiles.md с полной документацией по всем Docker образам
- Обновлен раздел Preset система в README с полным списком preset'ов
- Добавлены категории preset'ов: базовые, по ОС, специализированные
- Описаны все 25+ preset'ов из molecule/presets/
- Добавлена ссылка на docs/dockerfiles.md в основной README
- Документация по Docker образам перенесена из dockerfiles/README.md в docs/

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-26 01:11:30 +03:00
Сергей Антропов
3d3a28432c docs: полное обновление раздела 'Основные команды' в README
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Добавлены все команды из Makefile с подробными описаниями
- Организованы команды по категориям:
  * Управление ролями (list, create, delete, lint, test, deploy)
  * Управление Preset'ами (list, info, test)
  * Управление секретами Vault (init, create, edit, show, delete, encrypt, decrypt, rekey, check, scan)
  * Управление Git (push, pull, new)
  * Управление Docker образами (build, push, pull, clean, purge, info, update, builder management)
  * Управление Ansible Controller (build, rebuild, run, stop)
  * Собственные образы для тестирования (test, check, build)
  * Автоматизация (update-playbooks, generate-docs, setup-cicd)
  * Очистка (clean-containers, docker clean/purge)
  * Справка (help и детальная справка по каждой категории)
- Добавлены примеры использования команд
- Уточнены описания для каждой команды

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-26 01:08:35 +03:00
Сергей Антропов
bdc89b3e7c docs: добавлены ссылки на все документы из папки docs/
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Добавлены ссылки на все 16 документов из папки docs/
- Организованы ссылки по категориям:
  * Presets и тестирование
  * Развертывание и конфигурация
  * Безопасность и качество
  * Мониторинг и диагностика
  * Платформы и примеры

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-26 01:02:50 +03:00
Сергей Антропов
3f3507e079 refactor: переименование проекта из AnsibleTemplate в AnsibleLab
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Обновлены все упоминания AnsibleTemplate на AnsibleLab
- Изменены название проекта в README.md, Makefile и документации
- Обновлены комментарии в CI/CD конфигурациях

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-26 01:02:21 +03:00
Сергей Антропов
a879ea53a7 Merge branch 'testlab' into main
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Добавлена универсальная роль docker
- Обновлена документация
- Добавлен preset mytest

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-26 00:58:09 +03:00
Сергей Антропов
b41c110c16 feat: добавлена универсальная роль docker и обновлена документация
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
- Создана универсальная роль docker для установки Docker и Docker Compose
- Поддержка Debian, Ubuntu, CentOS, AlmaLinux, Rocky, RHEL
- Установка через официальный репозиторий или get.docker.com
- Полностью переписана документация README.md с актуальной информацией
- Добавлен preset mytest для тестирования
- Обновлен roles/deploy.yml с актуальными ролями

Автор: Сергей Антропов
Сайт: https://devops.org.ru
2025-10-26 00:58:00 +03:00
Сергей Антропов
304a5e4ebf Обновление проекта
Some checks failed
Ansible Testing / lint (push) Has been cancelled
Ansible Testing / test (default) (push) Has been cancelled
Ansible Testing / test (minimal) (push) Has been cancelled
Ansible Testing / test (performance) (push) Has been cancelled
Ansible Testing / deploy-check (push) Has been cancelled
2025-10-26 00:29:59 +03:00
141 changed files with 14418 additions and 5573 deletions

View File

@@ -1,7 +1,18 @@
skip_list:
- fqcn
- yaml[new-line-at-end-of-file]
- yaml[truthy]
- yaml[line-length]
- var-naming[no-role-prefix]
- 'ignore-errors'
- command-instead-of-module # Используем curl для GPG ключей (практичнее чем get_url)
- risky-shell-pipe # Pipe необходим для работы с GPG ключами
- no-changed-when # changed_when добавлен где необходимо
- yaml # Форматирование YAML
- var-naming # Наименования переменных
- internal-error # Внутренние ошибки синтаксиса
- fqcn # Use FQCN для builtin модулей
- ignore-errors # Используем ignore_errors для обработки ошибок
- name[casing] # Проверка регистра именования
- no-handler # Не используем handlers
- no-relative-paths # Не используем относительные пути
- no-same-owner # Не используем same_owner
- no-same-group # Не используем same_group
- no-same-permissions # Не используем same_permissions
- no-same-mode # Не используем same_mode
- no-same-user # Не используем same_user
warn_list: []

2
.dockerignore Normal file
View File

@@ -0,0 +1,2 @@
.github

View File

@@ -1,44 +0,0 @@
name: Ansible Testing
on: [push, pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install ansible ansible-lint
ansible-galaxy collection install -r requirements.yml
- name: Run lint
run: make role lint
test:
runs-on: ubuntu-latest
needs: lint
strategy:
matrix:
preset: [minimal, default, performance]
steps:
- uses: actions/checkout@v4
- name: Setup Docker
run: |
sudo systemctl start docker
sudo usermod -aG docker $USER
- name: Run tests
run: make role test ${{ matrix.preset }}
deploy-check:
runs-on: ubuntu-latest
needs: [lint, test]
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- name: Check deployment
run: make role deploy
env:
ANSIBLE_HOST_KEY_CHECKING: false

3
.gitignore vendored
View File

@@ -180,3 +180,6 @@ cython_debug/
# Cursor IDE
.cursor/
# Kubernetes kubeconfig
kubeconfig

1162
Makefile

File diff suppressed because it is too large Load Diff

2631
README.md

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
# GitLab CI для AnsibleTemplate
# GitLab CI для DevOpsLab
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru

View File

@@ -1,4 +1,4 @@
# Azure DevOps Pipeline для AnsibleLab
# Azure DevOps Pipeline для DevOpsLab
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru

View File

@@ -1,8 +1,8 @@
# GitHub Actions Workflow для AnsibleLab
# GitHub Actions Workflow для DevOpsLab
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
name: AnsibleLab CI/CD Pipeline
name: DevOpsLab CI/CD Pipeline
on:
push:

View File

@@ -1,4 +1,4 @@
# GitLab CI Pipeline для AnsibleLab
# GitLab CI Pipeline для DevOpsLab
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru

View File

@@ -1,4 +1,4 @@
// Jenkins Pipeline для AnsibleLab
// Jenkins Pipeline для DevOpsLab
// Автор: Сергей Антропов
// Сайт: https://devops.org.ru

View File

@@ -1,8 +1,8 @@
# Docker образы для универсальной системы тестирования AnsibleLab
# Docker образы для универсальной системы тестирования DevOpsLab
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 2.0.0
**Версия:** 3.0.0
## 🐳 Обзор
@@ -13,16 +13,48 @@
```
dockerfiles/
├── ansible-controller/ # Ansible контроллер с предустановленными коллекциями
├── alt-linux/ # ALT Linux с systemd
├── astra-linux/ # Astra Linux с systemd
├── redos/ # RED OS с systemd
├── rhel/ # Red Hat Enterprise Linux с systemd
├── centos/ # CentOS Stream с systemd
├── alma/ # AlmaLinux с systemd
├── rocky/ # Rocky Linux с systemd
├── ubuntu/ # Ubuntu с systemd
├── debian/ # Debian с systemd
── README.md # Документация
│ ├── Dockerfile
│ ├── docker-compose.yml
├── requirements.txt
│ └── requirements.yml
├── k8s/ # Kubernetes контроллер (Kind, kubectl, Helm, Istio)
│ └── Dockerfile
├── k8s-portforward/ # Port-forward контейнер (устаревший)
│ ├── Dockerfile
│ └── portforward-container.py
── alt-linux/ # ALT Linux P9 с systemd
│ └── Dockerfile
├── astra-linux/ # Astra Linux 1.7 с systemd
│ └── Dockerfile
├── redos/ # RED OS 9 с systemd
│ └── Dockerfile
├── rhel/ # Red Hat Enterprise Linux 8 с systemd
│ └── Dockerfile
├── centos7/ # CentOS 7 с systemd
│ └── Dockerfile
├── centos8/ # CentOS 8 Stream с systemd
│ └── Dockerfile
├── centos9/ # CentOS 9 Stream с systemd
│ └── Dockerfile
├── alma/ # AlmaLinux 8 с systemd
│ └── Dockerfile
├── rocky/ # Rocky Linux 8 с systemd
│ └── Dockerfile
├── ubuntu20/ # Ubuntu 20.04 LTS (focal) с systemd
│ └── Dockerfile
├── ubuntu22/ # Ubuntu 22.04 LTS (jammy) с systemd
│ └── Dockerfile
├── ubuntu24/ # Ubuntu 24.04 LTS (noble) с systemd
│ └── Dockerfile
├── debian9/ # Debian 9 (stretch) с systemd
│ └── Dockerfile
├── debian10/ # Debian 10 (buster) с systemd
│ └── Dockerfile
├── debian11/ # Debian 11 (bullseye) с systemd
│ └── Dockerfile
├── debian12/ # Debian 12 (bookworm) с systemd
│ └── Dockerfile
└── README.md # Этот файл
```
## 🚀 Доступные образы
@@ -36,12 +68,11 @@ dockerfiles/
#### Компоненты:
- **Ansible Core** с последними коллекциями
- **Docker CLI** для работы с контейнерами
- **kubectl** для управления Kubernetes
- **Helm** для управления пакетами Kubernetes
- **Kind** для локального Kubernetes
- **yq** для работы с YAML
- **jq** для работы с JSON
**Примечание:** Kubernetes инструменты (kubectl, Helm, Kind, Istio) были перенесены в отдельный образ `k8s`.
#### Предустановленные коллекции:
```yaml
collections:
@@ -80,76 +111,139 @@ docker run --rm \
-v $(pwd):/workspace \
-w /workspace \
inecs/ansible-lab:ansible-controller-latest \
ansible-playbook site.yml
ansible-playbook converge.yml
```
### 2. ubuntu
### 2. k8s
**Базовый образ:** `ubuntu:22.04`
**Тег:** `inecs/ansible-lab:ubuntu-latest`
**Описание:** Ubuntu 22.04 LTS с systemd и Docker
**Тег:** `inecs/ansible-lab:k8s-latest`
**Описание:** Kubernetes контроллер с инструментами для работы с Kubernetes, Helm, Istio и Kind кластерами
#### Компоненты:
- **Ubuntu 22.04 LTS** (Jammy Jellyfish)
- **systemd** для управления сервисами
- **Docker CE** с Docker Compose
- **Python 3** с pip
- **Пользователь ansible** с sudo правами
#### Установленные пакеты:
```bash
systemd systemd-sysv dbus
curl wget git vim nano htop tree jq
python3 python3-pip
docker-ce docker-ce-cli containerd.io docker-compose-plugin
```
#### Настройки systemd:
```bash
systemctl set-default multi-user.target
```
- **Docker CLI** (20.10.24) для работы с контейнерами
- **kubectl** (1.34.1) для управления Kubernetes
- **Helm** (latest) для управления пакетами Kubernetes
- **Kind** (0.30.0) для локальных Kubernetes кластеров
- **Istio CLI** (1.22.1) для управления Service Mesh
- **Python 3** с модулем yaml для выполнения скриптов
#### Использование:
```bash
# Создание Kind кластера
docker run -it --rm \
--name k8s-controller \
--network kind \
-v /var/run/docker.sock:/var/run/docker.sock:rw \
inecs/ansible-lab:k8s-latest \
kind create cluster --name lab
# Выполнение kubectl команд
docker exec k8s-controller kubectl get nodes
# Установка Helm релиза
docker exec k8s-controller helm install prometheus prometheus-community/kube-prometheus-stack
```
**Примечание:** Этот образ используется автоматически при выполнении `make k8s` команд. Контейнер запускается с именем `k8s-controller` и подключен к Docker daemon хоста.
### 3. Ubuntu
#### Ubuntu 20.04 (focal)
**Базовый образ:** `ubuntu:20.04`
**Тег:** `inecs/ansible-lab:ubuntu20`
**Описание:** Ubuntu 20.04 LTS с systemd
**Компоненты:**
- Ubuntu 20.04 LTS (Focal Fossa)
- systemd, Python 3, базовые утилиты
- Пользователь ansible с sudo правами
#### Ubuntu 22.04 (jammy) - основная версия
**Базовый образ:** `ubuntu:22.04`
**Тег:** `inecs/ansible-lab:ubuntu-latest` или `inecs/ansible-lab:ubuntu22`
**Описание:** Ubuntu 22.04 LTS с systemd
**Компоненты:**
- Ubuntu 22.04 LTS (Jammy Jellyfish)
- systemd, Python 3, базовые утилиты
- Пользователь ansible с sudo правами
#### Ubuntu 24.04 (noble)
**Базовый образ:** `ubuntu:24.04`
**Тег:** `inecs/ansible-lab:ubuntu24`
**Описание:** Ubuntu 24.04 LTS с systemd
**Компоненты:**
- Ubuntu 24.04 LTS (Noble Numbat)
- systemd, Python 3, базовые утилиты
- Пользователь ansible с sudo правами
**Примечание:** Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
**Использование:**
```bash
# Запуск Ubuntu контейнера
docker run -d --privileged \
--name ubuntu-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:ubuntu-latest
# Подключение к контейнеру
docker exec -it ubuntu-test bash
inecs/ansible-lab:ubuntu22
```
### 3. debian
### 4. Debian
#### Debian 9 (stretch)
**Базовый образ:** `debian:stretch`
**Тег:** `inecs/ansible-lab:debian9`
**Описание:** Debian 9 Stretch с systemd
**Компоненты:**
- Debian 9 (Stretch)
- systemd, Python 3, базовые утилиты
- Пользователь ansible с sudo правами
#### Debian 10 (buster)
**Базовый образ:** `debian:buster`
**Тег:** `inecs/ansible-lab:debian10`
**Описание:** Debian 10 Buster с systemd
**Компоненты:**
- Debian 10 (Buster)
- systemd, Python 3, базовые утилиты
- Пользователь ansible с sudo правами
#### Debian 11 (bullseye)
**Базовый образ:** `debian:bullseye`
**Тег:** `inecs/ansible-lab:debian11`
**Описание:** Debian 11 Bullseye с systemd
**Компоненты:**
- Debian 11 (Bullseye)
- systemd, Python 3, базовые утилиты
- Пользователь ansible с sudo правами
#### Debian 12 (bookworm) - основная версия
**Базовый образ:** `debian:bookworm`
**Тег:** `inecs/ansible-lab:debian-latest`
**Описание:** Debian 12 (Bookworm) с systemd и Docker
**Тег:** `inecs/ansible-lab:debian-latest` или `inecs/ansible-lab:debian12`
**Описание:** Debian 12 Bookworm с systemd
#### Компоненты:
- **Debian 12** (Bookworm)
- **systemd** для управления сервисами
- **Docker CE** с Docker Compose
- **Python 3** с pip
- **Пользователь ansible** с sudo правами
**Компоненты:**
- Debian 12 (Bookworm)
- systemd, Python 3, базовые утилиты
- Пользователь ansible с sudo правами
#### Установленные пакеты:
```bash
systemd systemd-sysv dbus
curl wget git vim nano htop tree jq
python3 python3-pip
docker-ce docker-ce-cli containerd.io docker-compose-plugin
```
**Примечание:** Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
#### Настройки systemd:
```bash
systemctl set-default multi-user.target
```
#### Использование:
**Использование:**
```bash
# Запуск Debian контейнера
docker run -d --privileged \
@@ -157,36 +251,23 @@ docker run -d --privileged \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:debian-latest
inecs/ansible-lab:debian12
```
### 4. rhel
### 5. RHEL (Red Hat Enterprise Linux)
**Базовый образ:** `registry.access.redhat.com/ubi8/ubi`
**Тег:** `inecs/ansible-lab:rhel-latest`
**Описание:** Red Hat Enterprise Linux 8 с systemd и Docker
**Описание:** Red Hat Enterprise Linux 8 с systemd
#### Компоненты:
- **RHEL 8** (Universal Base Image)
- **systemd** для управления сервисами
- **Docker CE** с Docker Compose
- **Python 3** с pip
- **Пользователь ansible** с sudo правами
**Компоненты:**
- RHEL 8 (Universal Base Image)
- systemd, Python 3, базовые утилиты
- Пользователь ansible с sudo правами
#### Установленные пакеты:
```bash
systemd systemd-sysv dbus
curl wget git vim nano jq
python3 python3-pip
docker-ce docker-ce-cli containerd.io docker-compose-plugin
```
**Примечание:** Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
#### Настройки systemd:
```bash
systemctl set-default multi-user.target
```
#### Использование:
**Использование:**
```bash
# Запуск RHEL контейнера
docker run -d --privileged \
@@ -197,25 +278,52 @@ docker run -d --privileged \
inecs/ansible-lab:rhel-latest
```
### 5. centos
### 6. CentOS
#### CentOS 7
**Базовый образ:** `centos:7`
**Тег:** `inecs/ansible-lab:centos7`
**Описание:** CentOS 7 с systemd
**Компоненты:**
- CentOS 7
- systemd, Python 3, базовые утилиты
- Пользователь ansible с sudo правами
#### CentOS 8
**Базовый образ:** `quay.io/centos/centos:stream8`
**Тег:** `inecs/ansible-lab:centos8`
**Описание:** CentOS 8 Stream с systemd
**Компоненты:**
- CentOS 8 Stream
- systemd, Python 3, базовые утилиты
- Пользователь ansible с sudo правами
#### CentOS 9 (stream) - основная версия
**Базовый образ:** `quay.io/centos/centos:stream9`
**Тег:** `inecs/ansible-lab:centos-latest`
**Описание:** CentOS Stream 9 с systemd и Docker
**Тег:** `inecs/ansible-lab:centos-latest` или `inecs/ansible-lab:centos9`
**Описание:** CentOS Stream 9 с systemd
#### Компоненты:
- **CentOS Stream 9**
- **systemd** для управления сервисами
- **Docker CE** с Docker Compose
- **Python 3** с pip
- **Пользователь ansible** с sudo правами
**Компоненты:**
- CentOS Stream 9
- systemd, Python 3, базовые утилиты
- Пользователь ansible с sudo правами
#### Установленные пакеты:
**Примечание:** Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
**Использование:**
```bash
systemd systemd-sysv dbus
curl wget git vim nano jq
python3 python3-pip
docker-ce docker-ce-cli containerd.io docker-compose-plugin
# Запуск CentOS контейнера
docker run -d --privileged \
--name centos-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:centos9
```
#### Настройки systemd:
@@ -234,7 +342,7 @@ docker run -d --privileged \
inecs/ansible-lab:centos-latest
```
### 6. alma
### 7. alma
**Базовый образ:** `almalinux:8`
**Тег:** `inecs/ansible-lab:alma-latest`
@@ -243,16 +351,16 @@ docker run -d --privileged \
#### Компоненты:
- **AlmaLinux 8**
- **systemd** для управления сервисами
- **Docker CE** с Docker Compose
- **Python 3** с pip
- **Пользователь ansible** с sudo правами
#### Установленные пакеты:
- **Примечание**: Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
```bash
systemd systemd-sysv dbus
curl wget git vim nano jq
python3 python3-pip
docker-ce docker-ce-cli containerd.io docker-compose-plugin
```
#### Настройки systemd:
@@ -271,7 +379,7 @@ docker run -d --privileged \
inecs/ansible-lab:alma-latest
```
### 7. rocky
### 8. rocky
**Базовый образ:** `rockylinux:8`
**Тег:** `inecs/ansible-lab:rocky-latest`
@@ -280,16 +388,16 @@ docker run -d --privileged \
#### Компоненты:
- **Rocky Linux 8**
- **systemd** для управления сервисами
- **Docker CE** с Docker Compose
- **Python 3** с pip
- **Пользователь ansible** с sudo правами
#### Установленные пакеты:
- **Примечание**: Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
```bash
systemd systemd-sysv dbus
curl wget git vim nano jq
python3 python3-pip
docker-ce docker-ce-cli containerd.io docker-compose-plugin
```
#### Настройки systemd:
@@ -308,7 +416,7 @@ docker run -d --privileged \
inecs/ansible-lab:rocky-latest
```
### 8. alt-linux
### 9. alt-linux
**Базовый образ:** `altlinux/p9`
**Тег:** `inecs/ansible-lab:alt-linux-latest`
@@ -317,16 +425,16 @@ docker run -d --privileged \
#### Компоненты:
- **ALT Linux 9** (Platform 9)
- **systemd** для управления сервисами
- **Docker CE** с Docker Compose
- **Python 3** с pip
- **Пользователь ansible** с sudo правами
#### Установленные пакеты:
- **Примечание**: Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
```bash
systemd systemd-sysv dbus
curl wget git vim nano htop tree jq
python3 python3-pip
docker-ce docker-ce-cli containerd.io docker-compose-plugin
```
#### Настройки systemd:
@@ -345,7 +453,7 @@ docker run -d --privileged \
inecs/ansible-lab:alt-linux-latest
```
### 9. astra-linux
### 10. astra-linux
**Базовый образ:** `astralinux/astra-1.7`
**Тег:** `inecs/ansible-lab:astra-linux-latest`
@@ -354,16 +462,16 @@ docker run -d --privileged \
#### Компоненты:
- **Astra Linux 1.7**
- **systemd** для управления сервисами
- **Docker CE** с Docker Compose
- **Python 3** с pip
- **Пользователь ansible** с sudo правами
#### Установленные пакеты:
- **Примечание**: Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
```bash
systemd systemd-sysv dbus
curl wget git vim nano htop tree jq
python3 python3-pip
docker-ce docker-ce-cli containerd.io docker-compose-plugin
```
#### Настройки systemd:
@@ -382,7 +490,7 @@ docker run -d --privileged \
inecs/ansible-lab:astra-linux-latest
```
### 10. redos
### 11. redos
**Базовый образ:** `redos/redos:9`
**Тег:** `inecs/ansible-lab:redos-latest`
@@ -391,16 +499,16 @@ docker run -d --privileged \
#### Компоненты:
- **RED OS 9**
- **systemd** для управления сервисами
- **Docker CE** с Docker Compose
- **Python 3** с pip
- **Пользователь ansible** с sudo правами
#### Установленные пакеты:
- **Примечание**: Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
```bash
systemd systemd-sysv dbus
curl wget git vim nano htop tree jq
python3 python3-pip
docker-ce docker-ce-cli containerd.io docker-compose-plugin
```
#### Настройки systemd:
@@ -499,7 +607,7 @@ make docker reset-builder
```yaml
# molecule/presets/custom-images.yml
---
#description: Preset с собственными образами AnsibleLab
#description: Preset с собственными образами DevOpsLab
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"

View File

@@ -0,0 +1,53 @@
# ALT Linux 10 (Platform 10) с systemd
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# https://hub.docker.com/_/alt/tags
# Тег: inecs/ansible-lab:alt10-latest
FROM alt:p10
# Обновляем систему
RUN apt-get update && apt-get dist-upgrade -y
# Устанавливаем systemd и необходимые пакеты
RUN apt-get install -y \
systemd \
dbus \
curl \
wget \
nano \
python3 \
sudo \
&& apt-get clean
# Устанавливаем pip для Python 3.11
RUN curl -sS https://bootstrap.pypa.io/pip/get-pip.py | python3
# Устанавливаем yq
# RUN wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_arm64 \
# && chmod +x /usr/local/bin/yq
# Устанавливаем Docker вручную для ALT Linux
# RUN apt-get update && apt-get install -y \
# ca-certificates \
# curl \
# gnupg \
# && apt-get clean
# Устанавливаем Docker Compose
# 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
# Настраиваем 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
# Команда по умолчанию (система запускается от root для systemd)
CMD ["/sbin/init"]

View File

@@ -1,7 +1,8 @@
# ALT Linux с systemd
# ALT Linux 9 (Platform 9) с systemd
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# https://hub.docker.com/_/alt/tags
# Тег: inecs/ansible-lab:alt9-latest
FROM alt:p9

View File

@@ -16,7 +16,7 @@ RUN apt-get install -y \
build-essential \
&& apt-get clean
# Устанавливаем Ansible, ansible-lint и passlib для хеширования паролей
# Устанавливаем Ansible, ansible-lint, passlib
RUN pip3 install ansible ansible-core ansible-lint passlib
# Устанавливаем дополнительные пакеты
@@ -35,8 +35,12 @@ RUN apt-get install -y \
RUN wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_arm64 \
&& chmod +x /usr/local/bin/yq
# Устанавливаем Docker CLI
RUN apt-get install -y docker.io docker-compose
# Устанавливаем Podman (вместо Docker). Для Ubuntu 22.04 — из universe
RUN apt-get install -y software-properties-common \
&& add-apt-repository -y universe \
&& apt-get update \
&& apt-get install -y podman \
&& apt-get clean
# Устанавливаем kubectl
RUN curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" \
@@ -46,10 +50,10 @@ RUN curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/s
# Устанавливаем Helm
RUN curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# Устанавливаем Kind
RUN curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.23.0/kind-linux-amd64 \
&& chmod +x ./kind \
&& mv ./kind /usr/local/bin/
# Устанавливаем Minikube (вместо Kind, для использования с драйвером podman)
RUN curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 \
&& chmod +x minikube-linux-amd64 \
&& mv minikube-linux-amd64 /usr/local/bin/minikube
## Устанавливаем Istio CLI
#RUN curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.22.1 sh - \
@@ -79,15 +83,21 @@ RUN chown -R ansible:ansible /ansible
# Переключаемся на пользователя ansible
USER ansible
# Устанавливаем дополнительные роли
RUN ansible-galaxy install geerlingguy.docker \
&& ansible-galaxy install geerlingguy.kubernetes
# Устанавливаем дополнительные роли (коллекция containers.podman в requirements.yml)
RUN ansible-galaxy install geerlingguy.kubernetes
# Настройки для работы с Docker
ENV DOCKER_HOST=unix:///var/run/docker.sock
# Устанавливаем molecule как root (delegated driver для Podman)
RUN pip3 install ansible ansible-core ansible-lint molecule passlib
# Проверяем, что molecule установлен
RUN which molecule || echo "molecule not found"
# Настройки для работы с Podman (сокет монтируется с хоста)
ENV CONTAINER_HOST=unix:///run/podman/podman.sock
ENV ANSIBLE_FORCE_COLOR=1
ENV ANSIBLE_STDOUT_CALLBACK=yaml
ENV ANSIBLE_CALLBACKS_ENABLED=profile_tasks
ENV PATH="/home/ansible/.local/bin:$PATH"
# Команда по умолчанию
CMD ["sleep", "infinity"]

View File

@@ -1,3 +1,6 @@
# Ansible Controller для Podman (сокет Podman)
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
version: "3.9"
services:
@@ -7,10 +10,10 @@ services:
privileged: true
command: sleep infinity
environment:
DOCKER_HOST: unix:///var/run/docker.sock
CONTAINER_HOST: unix:///run/podman/podman.sock
ANSIBLE_VAULT_PASSWORD_FILE: /ansible/vault/.vault
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /run/podman/podman.sock:/run/podman/podman.sock
- .:/ansible
working_dir: /ansible
networks:

View File

@@ -1,8 +1,10 @@
---
# Ansible Collections for Molecule Universal
# Ansible Collections for Molecule Universal (Podman)
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
collections:
- name: community.docker
version: ">=3.0.0"
- name: containers.podman
version: ">=1.10.0"
- name: community.general
version: ">=7.0.0"
- name: ansible.posix

View File

@@ -0,0 +1,79 @@
# Astra Linux совместимый образ для ARM64
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Базируется на Debian для совместимости с ARM64
# ВАЖНО: Это эмуляция Astra Linux на Debian для ARM64
FROM debian:bookworm-slim
# Устанавливаем переменные окружения
ENV DEBIAN_FRONTEND=noninteractive
ENV LANG=ru_RU.UTF-8
ENV LANGUAGE=ru_RU:ru
ENV LC_ALL=ru_RU.UTF-8
# Обновляем систему
RUN apt-get update && apt-get dist-upgrade -y
# Устанавливаем локали
RUN apt-get install -y locales && \
sed -i 's/# ru_RU.UTF-8 UTF-8/ru_RU.UTF-8 UTF-8/' /etc/locale.gen && \
locale-gen
# Устанавливаем systemd и необходимые пакеты
RUN apt-get install -y \
systemd \
systemd-sysv \
dbus \
curl \
wget \
nano \
python3 \
python3-pip \
sudo \
ca-certificates \
gnupg \
lsb-release \
&& apt-get clean
# Устанавливаем yq (автоопределение архитектуры)
RUN ARCH=$(dpkg --print-architecture | sed 's/amd64/amd64/; s/arm64/arm64/; s/aarch64/arm64/') && \
wget -qO /usr/local/bin/yq "https://github.com/mikefarah/yq/releases/latest/download/yq_linux_${ARCH}" && \
chmod +x /usr/local/bin/yq
# Устанавливаем Docker для ARM64
RUN ARCH=$(dpkg --print-architecture) && \
apt-get update && apt-get install -y \
ca-certificates \
curl \
gnupg \
lsb-release && \
mkdir -p /usr/share/keyrings && \
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg && \
echo "deb [arch=${ARCH} signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian bookworm stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null && \
apt-get update && \
apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin && \
apt-get clean
# Устанавливаем Docker Compose
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
# Создаем файлы конфигурации для эмуляции Astra Linux
RUN echo "astra-linux" > /etc/os-release && \
echo "VERSION_ID=\"1.7.6.uu2\"" >> /etc/os-release && \
echo "PRETTY_NAME=\"Astra Linux 1.7.6.uu2 (ARM64 Compatible)\"" >> /etc/os-release
# Настраиваем 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
# Команда по умолчанию (система запускается от root для systemd)
CMD ["/sbin/init"]

View File

@@ -0,0 +1,43 @@
# Kubernetes Port-Forward Container
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
ARG TARGETARCH
FROM ubuntu:22.04
# Обновляем систему
RUN apt-get update && apt-get upgrade -y && apt-get clean
# Устанавливаем базовые пакеты + socat для форвардинга портов
RUN apt-get install -y \
wget \
curl \
bash \
ca-certificates \
python3 \
python3-yaml \
socat \
netcat-openbsd \
&& apt-get clean
# Устанавливаем kubectl
RUN if [ "${TARGETARCH}" = "amd64" ]; then \
wget -O kubectl "https://dl.k8s.io/release/v1.34.1/bin/linux/amd64/kubectl"; \
else \
wget -O kubectl "https://dl.k8s.io/release/v1.34.1/bin/linux/arm64/kubectl"; \
fi && \
chmod +x kubectl && \
mv kubectl /usr/local/bin/
# Создаем рабочий каталог
WORKDIR /portforward
# Копируем скрипт порт-форвардинга
COPY portforward-container.py /portforward/portforward-container.py
# Делаем скрипт исполняемым
RUN chmod +x /portforward/portforward-container.py
# Команда по умолчанию
CMD ["python3", "/portforward/portforward-container.py"]

View File

@@ -0,0 +1,145 @@
#!/usr/bin/env python3
"""
Скрипт для работы внутри контейнера k8s-portforward
Автор: Сергей Антропов
Сайт: https://devops.org.ru
"""
import sys
import yaml
import subprocess
import time
import os
import signal
import json
def run_kubectl_portforward(cluster_name, namespace, service, remote_port, local_port):
"""Запускает kubectl port-forward внутри контейнера"""
cmd = [
"kubectl",
f"--server=https://{cluster_name}-control-plane:6443",
"--insecure-skip-tls-verify",
"port-forward",
"-n", namespace,
service,
f"{local_port}:{remote_port}"
]
print(f"[portforward] Запуск: {' '.join(cmd)}")
process = subprocess.Popen(
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
return process
def main():
"""Главная функция"""
# Загружаем preset
preset_file = "/workspace/molecule/presets/k8s/kubernetes.yml"
if not os.path.exists(preset_file):
print(f"❌ Файл {preset_file} не найден")
print("💡 Убедитесь, что workspace подключен в контейнер")
sys.exit(1)
with open(preset_file, 'r') as f:
preset = yaml.safe_load(f)
cluster_name = preset['kind_clusters'][0]['name']
addon_ports = preset['kind_clusters'][0].get('addon_ports', {})
print(f"🔌 Запуск порт-форвардинга для кластера: {cluster_name}")
processes = []
# Ingress HTTP
if addon_ports.get('ingress_http'):
port = addon_ports['ingress_http']
print(f" - Ingress HTTP: {port} -> ingress-nginx-controller:80")
proc = run_kubectl_portforward(
cluster_name, "ingress-nginx",
"svc/ingress-nginx-controller", 80, port
)
processes.append(proc)
# Ingress HTTPS
if addon_ports.get('ingress_https'):
port = addon_ports['ingress_https']
print(f" - Ingress HTTPS: {port} -> ingress-nginx-controller:443")
proc = run_kubectl_portforward(
cluster_name, "ingress-nginx",
"svc/ingress-nginx-controller", 443, port
)
processes.append(proc)
# Prometheus
if addon_ports.get('prometheus'):
port = addon_ports['prometheus']
print(f" - Prometheus: {port} -> monitoring-kube-prometheus-prometheus:9090")
proc = run_kubectl_portforward(
cluster_name, "monitoring",
"svc/monitoring-kube-prometheus-prometheus", 9090, port
)
processes.append(proc)
# Grafana
if addon_ports.get('grafana'):
port = addon_ports['grafana']
print(f" - Grafana: {port} -> monitoring-grafana:80")
proc = run_kubectl_portforward(
cluster_name, "monitoring",
"svc/monitoring-grafana", 80, port
)
processes.append(proc)
# Kiali
if addon_ports.get('kiali'):
port = addon_ports['kiali']
print(f" - Kiali: {port} -> kiali:20001")
proc = run_kubectl_portforward(
cluster_name, "istio-system",
"svc/kiali", 20001, port
)
processes.append(proc)
# Metrics Server
if addon_ports.get('metrics_server'):
port = addon_ports['metrics_server']
print(f" - Metrics Server: {port} -> metrics-server:4443")
proc = run_kubectl_portforward(
cluster_name, "kube-system",
"svc/metrics-server", 4443, port
)
processes.append(proc)
print("Все порты запущены. Ожидание завершения...")
print("💡 Контейнер будет работать, пока все port-forward активны")
# Ожидание завершения процессов
try:
while True:
time.sleep(1)
# Проверяем, что все процессы еще работают
alive = [p for p in processes if p.poll() is None]
if not alive:
print("⚠️ Все port-forward завершились")
break
except KeyboardInterrupt:
print("\n🛑 Получен сигнал завершения...")
# Завершаем все процессы
print("🗑️ Завершение port-forward...")
for proc in processes:
if proc.poll() is None:
proc.terminate()
try:
proc.wait(timeout=5)
except subprocess.TimeoutExpired:
proc.kill()
print("✅ Завершено")
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,73 @@
# Kubernetes Kind Container - Multi-Arch
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
ARG TARGETARCH
FROM ubuntu:22.04
# Обновляем систему
RUN apt-get update && apt-get upgrade -y && apt-get clean
# Устанавливаем базовые пакеты
RUN apt-get install -y \
wget \
curl \
git \
vim \
bash \
ca-certificates \
python3 \
python3-yaml \
file \
apt-transport-https \
gnupg \
lsb-release \
&& apt-get clean
# Устанавливаем Docker CLI
RUN DOCKER_VERSION=20.10.24 && \
if [ "${TARGETARCH}" = "amd64" ]; then \
wget -O /tmp/docker-cli.tgz "https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz" && \
tar -xz -C /tmp -f /tmp/docker-cli.tgz && \
mv /tmp/docker/docker /usr/local/bin/ && \
rm -rf /tmp/docker-cli.tgz /tmp/docker; \
else \
wget -O /tmp/docker-cli.tgz "https://download.docker.com/linux/static/stable/aarch64/docker-${DOCKER_VERSION}.tgz" && \
tar -xz -C /tmp -f /tmp/docker-cli.tgz && \
mv /tmp/docker/docker /usr/local/bin/ && \
rm -rf /tmp/docker-cli.tgz /tmp/docker; \
fi && \
chmod +x /usr/local/bin/docker
# Устанавливаем kubectl
RUN if [ "${TARGETARCH}" = "amd64" ]; then \
wget -O kubectl "https://dl.k8s.io/release/v1.34.1/bin/linux/amd64/kubectl"; \
else \
wget -O kubectl "https://dl.k8s.io/release/v1.34.1/bin/linux/arm64/kubectl"; \
fi && \
chmod +x kubectl && \
mv kubectl /usr/local/bin/
# Устанавливаем Helm
RUN wget https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 -O - | bash
# Устанавливаем Kind v0.30.0
RUN if [ "${TARGETARCH}" = "amd64" ]; then \
wget -O /usr/local/bin/kind "https://github.com/kubernetes-sigs/kind/releases/download/v0.30.0/kind-linux-amd64"; \
else \
wget -O /usr/local/bin/kind "https://github.com/kubernetes-sigs/kind/releases/download/v0.30.0/kind-linux-arm64"; \
fi && \
chmod +x /usr/local/bin/kind && \
ls -lh /usr/local/bin/kind && \
file /usr/local/bin/kind
# Устанавливаем Istio CLI
RUN ARCH=$(echo ${TARGETARCH} | sed 's/amd64/x86_64/; s/arm64/aarch64/') && \
ISTIO_VERSION=1.22.1 && \
wget -qO- https://istio.io/downloadIstio | ISTIO_VERSION=${ISTIO_VERSION} TARGET_ARCH=${ARCH} sh - && \
mv istio-${ISTIO_VERSION}/bin/istioctl /usr/local/bin/ && \
rm -rf istio-${ISTIO_VERSION}
# Команда по умолчанию
CMD ["sleep", "infinity"]

View File

@@ -0,0 +1,80 @@
# RedOS совместимый образ для ARM64
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Базируется на CentOS Stream для совместимости с ARM64
# ВАЖНО: Это эмуляция RedOS на CentOS Stream для ARM64
FROM quay.io/centos/centos:stream9
# Устанавливаем переменные окружения
ENV LANG=ru_RU.UTF-8
ENV LANGUAGE=ru_RU:ru
ENV LC_ALL=ru_RU.UTF-8
# Обновляем систему
RUN dnf update -y && dnf upgrade -y
# Устанавливаем локали
RUN dnf install -y glibc-langpack-ru glibc-locale-source && \
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8 || true
# Устанавливаем systemd и необходимые пакеты
RUN dnf install -y --allowerasing \
systemd \
systemd-sysv \
dbus \
curl \
wget \
nano \
python3 \
python3-pip \
sudo \
ca-certificates \
gnupg \
&& dnf clean all
# Устанавливаем yq (автоопределение архитектуры)
RUN ARCH=$(uname -m | sed 's/x86_64/amd64/; s/aarch64/arm64/') && \
wget -qO /usr/local/bin/yq "https://github.com/mikefarah/yq/releases/latest/download/yq_linux_${ARCH}" && \
chmod +x /usr/local/bin/yq
# Устанавливаем Docker для ARM64
RUN ARCH=$(uname -m) && \
dnf install -y dnf-plugins-core && \
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo && \
dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin && \
dnf clean all
# Устанавливаем Docker Compose
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
# Создаем файлы конфигурации для эмуляции RedOS
RUN echo "Red OS" > /etc/os-release && \
echo "VERSION_ID=\"8.0\"" >> /etc/os-release && \
echo "PRETTY_NAME=\"Red OS 8.0 (ARM64 Compatible)\"" >> /etc/os-release && \
echo "ID=\"redos\"" >> /etc/os-release && \
echo "ID_LIKE=\"rhel fedora\"" >> /etc/os-release && \
echo "VERSION=\"8.0\"" >> /etc/os-release && \
echo "VERSION_CODENAME=\"\"" >> /etc/os-release && \
echo "PLATFORM_ID=\"platform:el8\"" >> /etc/os-release && \
echo "HOME_URL=\"https://www.red-soft.ru/\"" >> /etc/os-release && \
echo "BUG_REPORT_URL=\"https://www.red-soft.ru/support/\"" >> /etc/os-release && \
echo "REDHAT_BUGZILLA_PRODUCT=\"Red OS\"" >> /etc/os-release && \
echo "REDHAT_BUGZILLA_PRODUCT_VERSION=\"8.0\"" >> /etc/os-release && \
echo "REDHAT_SUPPORT_PRODUCT=\"Red OS\"" >> /etc/os-release && \
echo "REDHAT_SUPPORT_PRODUCT_VERSION=\"8.0\"" >> /etc/os-release
# Настраиваем 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
# Команда по умолчанию (система запускается от root для systemd)
CMD ["/sbin/init"]

View File

@@ -15,13 +15,17 @@ RUN dnf install -y \
curl \
wget \
nano \
python39 \
python39-pip \
python3 \
python3-pip \
python3-devel \
sudo \
&& dnf clean all
# Создаем symlink для python3 -> python3.9
RUN ln -sf /usr/bin/python3.9 /usr/bin/python3
# Устанавливаем Python 3.11+ из EPEL
RUN dnf install -y epel-release && \
dnf install -y python311 python311-pip python311-devel && \
ln -sf /usr/bin/python3.11 /usr/bin/python3 && \
ln -sf /usr/bin/pip3.11 /usr/bin/pip3
# Устанавливаем yq
# RUN wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_arm64 \

264
docs/arm64-support.md Normal file
View File

@@ -0,0 +1,264 @@
# ARM64 Поддержка в DevOpsLab
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 3.0.0
## 📋 Описание
DevOpsLab обеспечивает полную поддержку ARM64 архитектуры для нативной производительности на Apple Silicon и ARM серверах. Все Docker образы собираются для обеих архитектур (AMD64 и ARM64).
## 🎯 Преимущества ARM64
- **Нативная производительность** - без эмуляции
- **Энергоэффективность** - меньше потребление энергии
- **Совместимость** - работает на Apple Silicon и ARM серверах
- **Скорость сборки** - быстрая компиляция на ARM64
## 🖥️ Поддерживаемые платформы
### Apple Silicon
- **MacBook Air M1/M2/M3**
- **MacBook Pro M1/M2/M3**
- **Mac Studio M1/M2**
- **Mac Pro M2**
### ARM серверы
- **AWS Graviton** (EC2 C6g, M6g, R6g)
- **Azure Ampere** (Dpsv5, Epsv5)
- **Google Cloud** (T2A)
- **Oracle Cloud** (Ampere A1)
## 🐳 Docker образы
### Multi-arch сборка
Все образы собираются для обеих архитектур:
```bash
# Проверка поддерживаемых архитектур
docker manifest inspect inecs/ansible-lab:ubuntu22-latest
# Результат
{
"manifests": [
{
"platform": {
"architecture": "amd64",
"os": "linux"
}
},
{
"platform": {
"architecture": "arm64",
"os": "linux"
}
}
]
}
```
### Доступные образы
| Образ | AMD64 | ARM64 | Описание |
|-------|-------|-------|----------|
| `ubuntu22-latest` | ✅ | ✅ | Ubuntu 22.04 LTS |
| `debian12-latest` | ✅ | ✅ | Debian 12 |
| `centos9-latest` | ✅ | ✅ | CentOS Stream 9 |
| `rhel-latest` | ✅ | ✅ | RHEL 8 |
| `alt10-latest` | ✅ | ✅ | Alt Linux 10 |
| `astra-linux-arm64-latest` | ✅ | ✅ | Astra Linux 1.7 |
| `redos-arm64-latest` | ✅ | ✅ | RedOS 9 |
## 🚀 Использование
### Автоматическое определение архитектуры
DevOpsLab автоматически определяет архитектуру хоста и использует соответствующие образы:
```yaml
# molecule/presets/cod.yml
platform: "linux/arm64" # Автоматически для ARM64 хостов
docker_platform: "linux/arm64"
```
### Принудительное использование ARM64
```bash
# Тестирование с ARM64 образами
make role test cod
# Проверка архитектуры контейнеров
docker exec -it ubuntu1 uname -m
# Результат: aarch64
```
### Смешанная архитектура
```yaml
# Для тестирования на разных архитектурах
hosts:
- name: ubuntu1
platform: "linux/arm64"
docker_platform: "linux/arm64"
- name: centos1
platform: "linux/amd64"
docker_platform: "linux/amd64"
```
## 🔧 Настройка
### Docker Buildx
```bash
# Создание multi-arch builder
docker buildx create --name multiarch --driver docker-container --use
# Проверка builder
docker buildx inspect multiarch
```
### Сборка образов
```bash
# Сборка для обеих архитектур
make docker build-image IMAGE=ubuntu22
# Сборка только для ARM64
docker buildx build --platform linux/arm64 -t inecs/ansible-lab:ubuntu22-arm64 .
```
## 📊 Производительность
### Сравнение производительности
| Операция | AMD64 (эмуляция) | ARM64 (нативная) | Ускорение |
|----------|------------------|------------------|-----------|
| Сборка образа | 5 мин | 2 мин | 2.5x |
| Запуск контейнера | 10 сек | 3 сек | 3.3x |
| Тестирование роли | 2 мин | 45 сек | 2.7x |
### Потребление ресурсов
| Ресурс | AMD64 (эмуляция) | ARM64 (нативная) | Экономия |
|--------|------------------|------------------|----------|
| CPU | 100% | 30% | 70% |
| Память | 2GB | 800MB | 60% |
| Энергия | 100% | 40% | 60% |
## 🐛 Диагностика
### Проверка архитектуры
```bash
# Архитектура хоста
uname -m
# Результат: arm64
# Архитектура Docker
docker version --format '{{.Server.Arch}}'
# Результат: aarch64
# Архитектура контейнера
docker run --rm ubuntu:22.04 uname -m
# Результат: aarch64
```
### Проверка образов
```bash
# Список образов с архитектурой
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Architecture}}"
# Детальная информация об образе
docker inspect inecs/ansible-lab:ubuntu22-latest | jq '.[0].Architecture'
```
### Проверка Molecule
```bash
# Тестирование с COD preset
make role test cod
# Проверка контейнеров
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Platform}}"
```
## 🔄 Обновление
### Обновление образов
```bash
# Пересборка всех образов
make docker rebuild
# Пересборка конкретного образа
make docker build-image IMAGE=astra-linux-arm64
```
### Обновление preset
```bash
# Обновление COD preset для ARM64
make role test cod
# Проверка результатов
docker exec -it ubuntu1 uname -m
```
## 📚 Примеры
### Тестирование на Apple Silicon
```bash
# На MacBook с M1/M2/M3
make role test cod
# Проверка производительности
time make role test cod
# Результат: real 0m45.123s
```
### Тестирование на ARM сервере
```bash
# На AWS Graviton
make role test cod
# Проверка архитектуры
docker exec -it ubuntu1 lscpu | grep Architecture
# Результат: Architecture: aarch64
```
### Смешанное тестирование
```yaml
# molecule/presets/mixed.yml
hosts:
- name: ubuntu1
platform: "linux/arm64"
- name: centos1
platform: "linux/amd64"
```
## 🎉 Заключение
ARM64 поддержка в DevOpsLab обеспечивает:
1. **Нативную производительность** - без эмуляции
2. **Энергоэффективность** - меньше потребление ресурсов
3. **Совместимость** - работает на всех ARM платформах
4. **Автоматизацию** - автоматическое определение архитектуры
5. **Гибкость** - поддержка смешанных конфигураций
Используйте ARM64 для:
- Разработки на Apple Silicon
- Тестирования на ARM серверах
- Оптимизации производительности
- Экономии ресурсов
- Ускорения CI/CD пайплайнов
---
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru

View File

@@ -1,4 +1,4 @@
# Настройка CI/CD для AnsibleLab
# Настройка CI/CD для DevOpsLab
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
@@ -91,7 +91,7 @@ jobs:
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git add molecule/default/site.yml roles/deploy.yml
git add molecule/default/run.yml roles/deploy.yml
git diff --staged --quiet || git commit -m "Auto-update playbooks for new roles"
git push
@@ -272,7 +272,7 @@ stages:
- script: |
git config --local user.email "action@azure.com"
git config --local user.name "Azure DevOps"
git add molecule/default/site.yml deploy.yml
git add molecule/default/run.yml deploy.yml
git diff --staged --quiet || git commit -m "Auto-update playbooks for new roles"
git push
displayName: 'Commit Changes'
@@ -480,7 +480,7 @@ pipeline {
sh '''
git config --local user.email "jenkins@example.com"
git config --local user.name "Jenkins"
git add molecule/default/site.yml roles/deploy.yml
git add molecule/default/run.yml roles/deploy.yml
git diff --staged --quiet || git commit -m "Auto-update playbooks for new roles"
git push
'''
@@ -656,7 +656,7 @@ update-playbooks:
- ./scripts/update-playbooks.sh
- git config --local user.email "gitlab@example.com"
- git config --local user.name "GitLab CI"
- git add molecule/default/site.yml deploy.yml
- git add molecule/default/run.yml deploy.yml
- git diff --staged --quiet || git commit -m "Auto-update playbooks for new roles"
- git push
only:
@@ -847,7 +847,7 @@ pipeline {
# scripts/setup-cicd.sh
# Автоматическая настройка CI/CD
echo "🔧 Настройка CI/CD для AnsibleTemplate..."
echo "🔧 Настройка CI/CD для DevOpsLab..."
# Создание директории .github/workflows
mkdir -p .github/workflows

266
docs/cod-preset.md Normal file
View File

@@ -0,0 +1,266 @@
# COD Preset - Тестирование российских и зарубежных ОС
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 3.0.0
## 📋 Описание
COD preset (Code of Operations Development) - это специализированный пресет для тестирования Ansible ролей на российских и зарубежных операционных системах с поддержкой ARM64 архитектуры.
## 🎯 Цель
Обеспечить комплексное тестирование инфраструктурных решений на:
- **Зарубежных ОС**: Ubuntu, Debian, CentOS, RHEL
- **Российских ОС**: Alt Linux, Astra Linux
- **Архитектура**: ARM64 (нативная поддержка)
## 🖥️ Поддерживаемые ОС
### Зарубежные ОС
- **Ubuntu 22.04 LTS** - популярная Linux дистрибуция
- **Debian 12** - стабильная основа для многих дистрибуций
- **CentOS Stream 9** - community версия RHEL
- **RHEL 8** - корпоративная Linux платформа
### Российские ОС
- **Alt Linux 10** - российская Linux дистрибуция
- **Astra Linux 1.7** - защищенная ОС для государственных организаций
## 🚀 Использование
### Базовое тестирование
```bash
# Запуск тестирования с COD preset
make role test cod
# Проверка статуса контейнеров
docker ps -a --filter "network=labnet" --format "table {{.Names}}\t{{.Status}}\t{{.Image}}"
```
### Тестирование конкретной роли
```bash
# Тестирование роли devops
make role test cod
# Тестирование роли docker
make role test cod
```
### Проверка результатов
```bash
# Проверка пользователя devops на всех хостах
docker exec -it ubuntu1 id devops
docker exec -it debian1 id devops
docker exec -it alt1 id devops
docker exec -it astra1 id devops
docker exec -it centos1 id devops
docker exec -it rhel1 id devops
# Проверка SSH ключей
docker exec -it ubuntu1 cat /home/devops/.ssh/authorized_keys
docker exec -it alt1 cat /home/devops/.ssh/authorized_keys
```
## 📊 Конфигурация
### Структура preset
```yaml
---
# COD пресет с 6 контейнерами (Ubuntu + Debian + Alt + Astra + CentOS + RHEL)
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# Образы для ARM64
images:
ubuntu: "inecs/ansible-lab:ubuntu22-latest"
debian: "inecs/ansible-lab:debian12-latest"
alt: "inecs/ansible-lab:alt10-latest"
astra: "inecs/ansible-lab:astra-linux-arm64-latest"
centos: "inecs/ansible-lab:centos9-latest"
rhel: "inecs/ansible-lab:rhel-latest"
# ARM64 платформа
platform: "linux/arm64"
docker_platform: "linux/arm64"
# Хосты
hosts:
- name: ubuntu1
family: ubuntu
groups: [cod, ubuntu]
platform: "linux/arm64"
# ... остальные хосты
```
### Группы хостов
- **`cod`** - все хосты COD preset
- **`ubuntu`** - Ubuntu хосты
- **`debian`** - Debian хосты
- **`alt`** - Alt Linux хосты
- **`astra`** - Astra Linux хосты
- **`centos`** - CentOS хосты
- **`rhel`** - RHEL хосты
## 🔧 Особенности
### ARM64 поддержка
- **Нативная архитектура** - все контейнеры собираются для ARM64
- **Оптимальная производительность** - без эмуляции
- **Совместимость** - работает на Apple Silicon и ARM серверах
### Российские ОС
- **Alt Linux** - полная поддержка пакетного менеджера apt
- **Astra Linux** - совместимый образ на базе Debian
- **Автоматическое определение** ОС в роли devops
### Универсальная роль devops
Роль автоматически определяет тип ОС и применяет соответствующие конфигурации:
```yaml
# Для российских ОС
devops_russian_os_config:
clearlinux: # Astra Linux
package_manager: "apt"
sudo_group: "sudo"
additional_groups: ["sudo", "docker", "systemd-journal"]
altlinux: # Alt Linux
package_manager: "apt"
sudo_group: "sudo"
additional_groups: ["sudo", "docker", "systemd-journal"]
```
## 📈 Примеры использования
### Тестирование инфраструктурных ролей
```bash
# Тестирование роли мониторинга
make role test cod
# Проверка установки пакетов на разных ОС
docker exec -it ubuntu1 dpkg -l | grep monitoring
docker exec -it centos1 rpm -qa | grep monitoring
```
### Тестирование безопасности
```bash
# Тестирование роли безопасности
make role test cod
# Проверка настроек безопасности
docker exec -it astra1 cat /etc/ssh/sshd_config | grep PermitRootLogin
docker exec -it rhel1 cat /etc/ssh/sshd_config | grep PermitRootLogin
```
### Тестирование контейнеризации
```bash
# Тестирование роли Docker
make role test cod
# Проверка Docker на разных ОС
docker exec -it ubuntu1 docker --version
docker exec -it alt1 docker --version
```
## 🐛 Диагностика
### Проверка контейнеров
```bash
# Статус всех контейнеров
docker ps -a --filter "network=labnet"
# Логи конкретного контейнера
docker logs ubuntu1
docker logs alt1
docker logs astra1
```
### Проверка сети
```bash
# Информация о сети
docker network inspect labnet
# Проверка связности
docker exec -it ubuntu1 ping -c 3 debian1
docker exec -it alt1 ping -c 3 astra1
```
### Проверка роли devops
```bash
# Проверка пользователя
docker exec -it ubuntu1 id devops
docker exec -it alt1 id devops
# Проверка групп
docker exec -it ubuntu1 groups devops
docker exec -it centos1 groups devops
# Проверка sudo прав
docker exec -it ubuntu1 sudo -l -U devops
docker exec -it rhel1 sudo -l -U devops
```
## 🔄 Обновление
### Обновление образов
```bash
# Пересборка всех образов
make docker rebuild
# Пересборка конкретного образа
make docker build-image IMAGE=astra-linux-arm64
make docker build-image IMAGE=redos-arm64
```
### Обновление preset
```bash
# Проверка синтаксиса
make presets info PRESET=cod
# Тестирование обновленного preset
make role test cod
```
## 📚 Связанная документация
- **[examples.md](examples.md)** - Примеры использования
- **[creating-roles.md](creating-roles.md)** - Создание ролей
- **[universal-testing.md](universal-testing.md)** - Универсальное тестирование
- **[presets-by-os.md](presets-by-os.md)** - Presets по ОС
## 🎉 Заключение
COD preset обеспечивает:
1. **Комплексное тестирование** на российских и зарубежных ОС
2. **ARM64 поддержку** для оптимальной производительности
3. **Универсальность** - одна роль работает на всех ОС
4. **Автоматизацию** - минимальные настройки для максимального результата
5. **Надежность** - проверка совместимости с реальными системами
Используйте COD preset для:
- Тестирования инфраструктурных решений
- Проверки совместимости с российскими ОС
- Разработки универсальных Ansible ролей
- Валидации безопасности на разных платформах
---
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru

View File

@@ -1,7 +1,8 @@
# Создание и разработка ролей для AnsibleLab
# Создание и разработка ролей для DevOpsLab
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 3.0.0
## 🚀 Быстрый старт
@@ -56,6 +57,7 @@ roles/my-role/
```bash
# Интерактивное создание роли
make role create
# Введите имя роли: my-role
# Система автоматически:
# - Создаст структуру папок
@@ -75,6 +77,8 @@ touch roles/my-role/{tasks,handlers,meta}/main.yml
touch roles/my-role/defaults/main.yml
touch roles/my-role/vars/main.yml
touch roles/my-role/README.md
# Добавление роли в roles/deploy.yml вручную
```
## 📝 Разработка роли
@@ -243,7 +247,7 @@ my_role_cache_dir: /var/cache/my-role
galaxy_info:
author: Сергей Антропов
description: Моя кастомная роль для AnsibleTemplate
description: Моя кастомная роль для DevOpsLab
company: https://devops.org.ru
license: MIT
min_ansible_version: "2.9"
@@ -411,7 +415,7 @@ make role deploy
### 1. Автоматическое включение в playbook'и
Роль автоматически включается в:
- `molecule/default/site.yml` (для тестирования)
- `molecule/default/run.yml` (для тестирования)
- `roles/deploy.yml` (для продакшн развертывания)
### 2. Обновление playbook'ов
@@ -532,78 +536,3 @@ MIT
## Автор
Сергей Антропов - https://devops.org.ru
```
## 🚀 Полный цикл разработки
### 1. Создание роли
```bash
# Создание структуры
mkdir -p roles/my-role/{tasks,handlers,templates,files,vars,defaults,meta}
touch roles/my-role/{tasks,handlers,meta}/main.yml
touch roles/my-role/defaults/main.yml
touch roles/my-role/vars/main.yml
touch roles/my-role/README.md
```
### 2. Разработка
```bash
# Редактирование файлов роли
nano roles/my-role/tasks/main.yml
nano roles/my-role/defaults/main.yml
# ... остальные файлы
```
### 3. Тестирование
```bash
# Lint проверка
make role lint
# Тестирование в Docker
make role test minimal
# Тестирование с custom preset
make role test my-custom-preset
```
### 4. Развертывание
```bash
# Тестирование на реальных серверах
make role deploy
# Развертывание на продакшн
make role deploy
# Подтвердить развертывание: y
```
## 🔧 Лучшие практики
### 1. Структура кода
- **Используйте теги** для группировки задач
- **Добавляйте условия** для условного выполнения
- **Используйте обработчики** для перезапуска сервисов
- **Документируйте переменные** в defaults/main.yml
### 2. Безопасность
- **Используйте vault** для секретов
- **Проверяйте права** пользователей
- **Настраивайте файрвол** при необходимости
- **Используйте SSL** для защищенных соединений
### 3. Производительность
- **Используйте кеширование** для повторных операций
- **Оптимизируйте пакеты** для уменьшения размера
- **Используйте параллельное выполнение** где возможно
- **Мониторьте ресурсы** системы
---
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru

325
docs/devops-role.md Normal file
View File

@@ -0,0 +1,325 @@
# Роль devops - Универсальная настройка пользователей и SSH
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 3.0.0
## 📋 Описание
Роль `devops` - это универсальная Ansible роль для настройки пользователей и SSH ключей на всех поддерживаемых операционных системах. Роль автоматически определяет тип ОС и применяет соответствующие конфигурации.
## 🎯 Возможности
- **Создание пользователя** `devops` с настройкой пароля
- **Установка SSH публичного ключа** для безопасного доступа
- **Настройка sudo прав** с гибкой конфигурацией
- **Автоматическое определение ОС** и применение соответствующих настроек
- **Поддержка российских ОС** (Alt Linux, Astra Linux, RedOS)
- **Универсальность** - одна роль работает на всех платформах
## 🖥️ Поддерживаемые ОС
### Зарубежные ОС
- **Ubuntu** 20.04, 22.04, 24.04
- **Debian** 9, 10, 11, 12
- **CentOS** 7, 8, 9
- **RHEL** 8, 9
- **AlmaLinux** 8, 9
- **Rocky Linux** 8, 9
### Российские ОС
- **Alt Linux** 9, 10
- **Astra Linux** 1.7 (совместимый образ)
- **RedOS** 9 (совместимый образ)
## 🚀 Использование
### Базовое использование
```yaml
---
- name: Настройка пользователя devops
hosts: all
become: true
roles:
- devops
vars:
devops_user: "devops"
devops_password: "{{ vault_devops_password }}"
devops_ssh_public_key: "{{ vault_devops_ssh_public_key }}"
```
### С кастомными настройками
```yaml
---
- name: Настройка пользователя devops
hosts: all
become: true
roles:
- devops
vars:
devops_user: "admin"
devops_password: "{{ vault_admin_password }}"
devops_ssh_public_key: "{{ vault_admin_ssh_key }}"
devops_additional_groups: ["sudo", "docker", "wheel"]
devops_sudo_nopasswd: true
```
## ⚙️ Переменные
### Основные переменные
| Переменная | Описание | По умолчанию |
|------------|----------|--------------|
| `devops_user` | Имя пользователя | `devops` |
| `devops_password` | Пароль пользователя | `""` |
| `devops_ssh_public_key` | SSH публичный ключ | `""` |
| `devops_additional_groups` | Дополнительные группы | `["sudo"]` |
| `devops_sudo_nopasswd` | Sudo без пароля | `false` |
| `devops_shell` | Оболочка пользователя | `/bin/bash` |
### Vault переменные
| Переменная | Описание | Пример |
|------------|----------|--------|
| `vault_devops_password` | Пароль из vault | `"secure_password"` |
| `vault_devops_ssh_public_key` | SSH ключ из vault | `"ssh-rsa AAAAB3..."` |
## 🔧 Конфигурация по ОС
### Автоматическое определение
Роль автоматически определяет ОС и применяет соответствующие настройки:
```yaml
# Для Debian/Ubuntu
devops_debian_config:
package_manager: "apt"
sudo_group: "sudo"
additional_groups: ["sudo", "docker", "systemd-journal"]
# Для RHEL/CentOS
devops_rhel_config:
package_manager: "yum"
sudo_group: "wheel"
additional_groups: ["wheel", "docker", "systemd-journal"]
# Для российских ОС
devops_russian_os_config:
clearlinux: # Astra Linux
package_manager: "apt"
sudo_group: "sudo"
altlinux: # Alt Linux
package_manager: "apt"
sudo_group: "sudo"
```
## 📊 Примеры использования
### Тестирование с COD preset
```bash
# Тестирование на всех ОС
make role test cod
# Проверка результатов
docker exec -it ubuntu1 id devops
docker exec -it alt1 id devops
docker exec -it astra1 id devops
```
### Использование в других ролях
```yaml
---
- name: Настройка инфраструктуры
hosts: all
become: true
roles:
- devops # Сначала настраиваем пользователя
- docker # Затем устанавливаем Docker
- monitoring # И мониторинг
```
### Создание пользователей для разных целей
```yaml
---
- name: Настройка пользователей
hosts: all
become: true
tasks:
- name: Создание пользователя devops
include_role:
name: devops
vars:
devops_user: "devops"
devops_password: "{{ vault_devops_password }}"
devops_ssh_public_key: "{{ vault_devops_ssh_key }}"
- name: Создание пользователя admin
include_role:
name: devops
vars:
devops_user: "admin"
devops_password: "{{ vault_admin_password }}"
devops_ssh_public_key: "{{ vault_admin_ssh_key }}"
devops_additional_groups: ["sudo", "docker", "wheel"]
```
## 🔐 Безопасность
### SSH ключи
```yaml
# В vault/secrets.yml
vault_devops_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC..."
vault_devops_password: "secure_password_123"
```
### Sudo права
```yaml
# Базовые sudo права
devops_sudo_nopasswd: false
# Расширенные права
devops_additional_groups: ["sudo", "docker", "wheel", "systemd-journal"]
```
## 🐛 Диагностика
### Проверка пользователя
```bash
# Проверка существования пользователя
id devops
# Проверка групп
groups devops
# Проверка sudo прав
sudo -l -U devops
```
### Проверка SSH
```bash
# Проверка SSH ключей
cat /home/devops/.ssh/authorized_keys
# Проверка прав доступа
ls -la /home/devops/.ssh/
```
### Проверка конфигурации
```bash
# Проверка sudo конфигурации
cat /etc/sudoers.d/devops
# Проверка SSH конфигурации
grep -i "permitrootlogin" /etc/ssh/sshd_config
```
## 📚 Шаблоны
### SSH конфигурация
```jinja2
# templates/devops_ssh_config.j2
# SSH конфигурация для пользователя {{ devops_user }}
Match User {{ devops_user }}
PasswordAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
```
### Sudo конфигурация
```jinja2
# templates/devops_sudoers.j2
# Sudo права для пользователя {{ devops_user }}
{{ devops_user }} ALL=(ALL) {% if devops_sudo_nopasswd %}NOPASSWD:{% endif %}ALL
```
## 🔄 Обновление
### Обновление роли
```bash
# Проверка синтаксиса
make role lint devops
# Тестирование
make role test cod
# Развертывание
make role deploy
```
### Обновление переменных
```bash
# Редактирование vault
make vault edit
# Имя файла: secrets
# Проверка vault
make vault check
```
## 📈 Лучшие практики
### 1. Используйте Vault для секретов
```yaml
# Хорошо
devops_password: "{{ vault_devops_password }}"
# Плохо
devops_password: "hardcoded_password"
```
### 2. Настраивайте группы по необходимости
```yaml
# Для Docker хостов
devops_additional_groups: ["sudo", "docker"]
# Для мониторинга
devops_additional_groups: ["sudo", "systemd-journal"]
```
### 3. Используйте условную логику
```yaml
# В вашем playbook
- name: Настройка devops пользователя
include_role:
name: devops
when: ansible_os_family in ['Debian', 'RedHat', 'Altlinux', 'Clearlinux']
```
## 🎉 Заключение
Роль `devops` обеспечивает:
1. **Универсальность** - работает на всех поддерживаемых ОС
2. **Автоматизацию** - минимальные настройки для максимального результата
3. **Безопасность** - правильная настройка SSH и sudo
4. **Гибкость** - настройка под любые требования
5. **Надежность** - проверенная конфигурация для всех платформ
Используйте роль `devops` для:
- Настройки базовых пользователей
- Установки SSH ключей
- Конфигурации sudo прав
- Подготовки инфраструктуры
- Тестирования на разных ОС
---
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru

514
docs/dockerfiles.md Normal file
View File

@@ -0,0 +1,514 @@
# Docker образы DevOpsLab
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 3.0.0
## 🐳 Обзор
DevOpsLab использует предварительно собранные Docker образы для различных операционных систем с полной поддержкой systemd. Все образы поддерживают multi-arch сборку и автоматически публикуются в Docker Hub под namespace `inecs/ansible-lab`.
## 📁 Структура dockerfiles/
```
dockerfiles/
├── ansible-controller/ # Ansible контроллер
│ ├── Dockerfile
│ ├── docker-compose.yml
│ ├── requirements.txt
│ └── requirements.yml
├── k8s/ # Kubernetes контроллер (Kind, kubectl, Helm, Istio)
│ └── Dockerfile
├── k8s-portforward/ # Port-forward контейнер (устаревший)
│ ├── Dockerfile
│ └── portforward-container.py
├── alt-linux/ # ALT Linux P9
├── astra-linux/ # Astra Linux 1.7
├── redos/ # RED OS 9
├── rhel/ # Red Hat Enterprise Linux 8
├── centos7/ # CentOS 7
├── centos8/ # CentOS 8
├── centos9/ # CentOS Stream 9
├── alma/ # AlmaLinux 8
├── rocky/ # Rocky Linux 8
├── ubuntu20/ # Ubuntu 20.04 LTS
├── ubuntu22/ # Ubuntu 22.04 LTS
├── ubuntu24/ # Ubuntu 24.04 LTS
├── debian9/ # Debian 9 Stretch
├── debian10/ # Debian 10 Buster
├── debian11/ # Debian 11 Bullseye
├── debian12/ # Debian 12 Bookworm
└── README.md # Документация по Dockerfiles
```
## 🚀 Доступные образы
### ansible-controller
**Базовый образ:** `ubuntu:22.04`
**Теги:** `inecs/ansible-lab:ansible-controller-latest`
**Платформы:** linux/amd64, linux/arm64
Ansible контроллер с предустановленными коллекциями и инструментами для разработки и тестирования.
#### Компоненты:
- Ansible Core с последними коллекциями
- Docker CLI для работы с контейнерами
- yq для работы с YAML
- jq для работы с JSON
- Molecule для тестирования ролей
**Примечание:** Kubernetes инструменты (kubectl, Helm, Kind, Istio) были перенесены в отдельный образ `k8s`.
#### Предустановленные коллекции:
```yaml
collections:
- name: community.docker
version: ">=3.0.0"
- name: community.general
version: ">=7.0.0"
- name: ansible.posix
version: ">=1.5.4"
- name: kubernetes.core
version: ">=2.0.0"
```
#### Использование:
```bash
# Запуск контроллера
docker run -it --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(pwd):/workspace \
-w /workspace \
inecs/ansible-lab:ansible-controller-latest
# Выполнение команды
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(pwd):/workspace \
-w /workspace \
inecs/ansible-lab:ansible-controller-latest \
ansible-playbook run.yml
```
### k8s
**Базовый образ:** `ubuntu:22.04`
**Теги:** `inecs/ansible-lab:k8s-latest`
**Платформы:** linux/amd64, linux/arm64
Kubernetes контроллер с инструментами для работы с Kubernetes, Helm, Istio и Kind кластерами.
#### Компоненты:
- **Docker CLI** (20.10.24) для работы с контейнерами
- **kubectl** (1.34.1) для управления Kubernetes
- **Helm** (latest) для управления пакетами Kubernetes
- **Kind** (0.30.0) для локальных Kubernetes кластеров
- **Istio CLI** (1.22.1) для управления Service Mesh
- Python 3 с модулем yaml для выполнения скриптов
#### Использование:
```bash
# Создание Kind кластера
docker run -it --rm \
--name k8s-controller \
--network kind \
-v /var/run/docker.sock:/var/run/docker.sock:rw \
inecs/ansible-lab:k8s-latest \
kind create cluster --name lab
# Выполнение kubectl команд
docker exec k8s-controller kubectl get nodes
# Установка Helm релиза
docker exec k8s-controller helm install prometheus prometheus-community/kube-prometheus-stack
```
**Примечание:** Этот образ используется автоматически при выполнении `make k8s` команд. Контейнер запускается с именем `k8s-controller` и подключен к Docker daemon хоста.
### Ubuntu
**Базовые образы:**
- `ubuntu:20.04``inecs/ansible-lab:ubuntu20-latest`
- `ubuntu:22.04``inecs/ansible-lab:ubuntu22-latest`
- `ubuntu:24.04``inecs/ansible-lab:ubuntu24-latest`
**Платформы:** linux/amd64, linux/arm64
Ubuntu LTS с systemd.
#### Компоненты:
- systemd для управления сервисами
- Python 3 с pip
- Пользователь ansible с sudo правами
- Основные утилиты (curl, wget, git, vim, nano, htop, tree, jq)
- **Примечание**: Docker CE и Docker Compose не установлены (закомментированы в Dockerfile)
#### Использование:
```bash
docker run -d --privileged \
--name ubuntu-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:ubuntu22-latest
```
### Debian
**Базовые образы:**
- `debian:9``inecs/ansible-lab:debian9-latest`
- `debian:10``inecs/ansible-lab:debian10-latest`
- `debian:11``inecs/ansible-lab:debian11-latest`
- `debian:bookworm``inecs/ansible-lab:debian12-latest`
**Платформы:** linux/amd64, linux/arm64
Debian с systemd.
#### Компоненты:
- systemd для управления сервисами
- Python 3 с pip
- Пользователь ansible с sudo правами
- Основные утилиты
- **Примечание**: Docker CE и Docker Compose не установлены
#### Использование:
```bash
docker run -d --privileged \
--name debian-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:debian12-latest
```
### CentOS
**Базовые образы:**
- `centos:7``inecs/ansible-lab:centos7-latest`
- `quay.io/centos/centos:8``inecs/ansible-lab:centos8-latest`
- `quay.io/centos/centos:stream9``inecs/ansible-lab:centos9-latest`
**Платформы:** linux/amd64, linux/arm64
CentOS с systemd.
#### Компоненты:
- systemd для управления сервисами
- Python 3 с pip
- Пользователь ansible с sudo правами
- Основные утилиты
- **Примечание**: Docker CE и Docker Compose не установлены
#### Использование:
```bash
docker run -d --privileged \
--name centos-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:centos9-latest
```
### AlmaLinux
**Базовый образ:** `almalinux:8`
**Тег:** `inecs/ansible-lab:alma-latest`
**Платформы:** linux/amd64, linux/arm64
AlmaLinux 8 с systemd.
### Rocky Linux
**Базовый образ:** `rockylinux:8`
**Тег:** `inecs/ansible-lab:rocky-latest`
**Платформы:** linux/amd64, linux/arm64
Rocky Linux 8 с systemd.
### Red Hat Enterprise Linux
**Базовый образ:** `registry.access.redhat.com/ubi8/ubi`
**Тег:** `inecs/ansible-lab:rhel-latest`
**Платформы:** linux/amd64, linux/arm64
Red Hat Enterprise Linux 8 с systemd.
### ALT Linux
**Базовые образы:**
- `altlinux/p9``inecs/ansible-lab:alt9-latest`
- `altlinux/p10``inecs/ansible-lab:alt10-latest`
**Платформы:** linux/amd64, linux/arm64
ALT Linux P9 и P10 с systemd.
#### Компоненты:
- systemd для управления сервисами
- Python 3 с pip
- Пользователь ansible с sudo правами
- Основные утилиты (curl, wget, nano, sudo)
#### Использование:
```bash
docker run -d --privileged \
--name alt-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:alt9-latest
```
### Astra Linux
**Базовые образы:**
- `registry.astralinux.ru/library/astra/ubi17:1.7.6.uu2``inecs/ansible-lab:astra-linux-latest` (AMD64)
- `debian:bookworm-slim``inecs/ansible-lab:astra-linux-arm64-latest` (ARM64 совместимый)
**Платформы:** linux/amd64, linux/arm64
Astra Linux 1.7 с systemd. Для ARM64 используется совместимый образ на базе Debian.
#### Компоненты:
- systemd для управления сервисами
- Python 3 с pip
- Пользователь ansible с sudo правами
- Docker CE и Docker Compose
- yq для работы с YAML
- Основные утилиты (curl, wget, nano, sudo)
#### Особенности ARM64 версии:
- Эмулирует Astra Linux через настройку `/etc/os-release`
- Максимально совместим с оригинальным Astra Linux
- Поддерживает все необходимые пакеты и конфигурации
#### Использование:
```bash
# AMD64 версия (оригинальная)
docker run -d --privileged \
--name astra-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:astra-linux-latest
# ARM64 версия (совместимая)
docker run -d --privileged \
--name astra-arm64-test \
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:astra-linux-arm64-latest
```
#### Сборка ARM64 версии:
```bash
# Специальная команда для сборки Astra Linux с поддержкой ARM64
make docker build-astra-arm64
```
### RED OS
**Базовый образ:** `registry.red-soft.ru/ubi7/ubi`
**Тег:** `inecs/ansible-lab:redos-latest`
**Платформы:** linux/amd64 (ограничение базового образа)
RED OS 9 с systemd.
## 🔨 Сборка образов
### Сборка всех образов
```bash
# Собрать все образы (multi-arch)
make docker build
# Пересборка с очисткой кеша
make docker rebuild
# Сборка конкретного образа
make docker build-image IMAGE=centos7
```
### Поддерживаемые платформы
По умолчанию все образы собираются для следующих платформ:
- `linux/amd64` - 64-bit x86
- `linux/arm64` - 64-bit ARM
Дополнительные платформы (опционально):
- `linux/riscv64` - RISC-V 64-bit
- `linux/ppc64le` - PowerPC 64-bit LE
- `linux/s390x` - IBM Z
- `linux/386` - 32-bit x86
- `linux/arm/v7` - ARM v7
- `linux/arm/v6` - ARM v6
### Тегирование
Все образы автоматически получают теги:
- `inecs/ansible-lab:<имя>-<версия>` - версионированный тег
- `inecs/ansible-lab:<имя>-latest` - последняя версия
Например:
- `inecs/ansible-lab:centos9-9.0`
- `inecs/ansible-lab:centos9-latest`
- `inecs/ansible-lab:ubuntu22-22.04`
- `inecs/ansible-lab:ubuntu22-latest`
## 📤 Публикация в Docker Hub
### Требования
1. Авторизация в Docker Hub:
```bash
docker login
```
2. Настройка билд-ксер (buildx) для multi-arch:
```bash
make docker setup-builder
```
### Публикация
```bash
# Публикация всех образов
make docker push
# Публикация конкретного образа
make docker build-image IMAGE=centos7
# (публикуется автоматически при сборке)
```
## 🧪 Использование в Molecule
### Preset конфигурация
```yaml
# molecule/presets/my-preset.yml
images:
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
centos9: "inecs/ansible-lab:centos9-latest"
debian12: "inecs/ansible-lab:debian12-latest"
hosts:
- name: web1
family: ubuntu22
groups: [web, test]
- name: db1
family: centos9
groups: [database, test]
```
### Тестирование с preset
```bash
# Использование preset в тестах
MOLECULE_PRESET=my-preset make role test
# Или напрямую
make role test my-preset
```
## 🔧 Особенности образов
### Поддержка systemd
Все образы настроены для работы с systemd в контейнере:
```bash
docker run -d --privileged \
--tmpfs /run --tmpfs /run/lock \
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
--cap-add SYS_ADMIN \
inecs/ansible-lab:ubuntu22-latest
```
### Настройки по умолчанию
- **Пользователь ansible**: пароль `ansible`, sudo без пароля
- **SSH доступ**: включен для пользователя ansible
- **systemd**: multi-user.target по умолчанию
- **Временные файловые системы**: `/run`, `/run/lock`
- **Volumes**: `/sys/fs/cgroup`
### Docker внутри Docker
Все образы поддерживают запуск Docker внутри контейнера:
```bash
docker run -d --privileged \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
--tmpfs /run --tmpfs /run/lock \
--cap-add SYS_ADMIN \
inecs/ansible-lab:centos9-latest
```
## 📋 Матрица совместимости
| Образ | Платформы | systemd | Docker | Python 3 | Kubernetes Tools |
|-------|-----------|---------|--------|----------|------------------|
| ansible-controller | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
| k8s | amd64, arm64 | ❌ | ✅ | ✅ | ✅ (kubectl, Helm, Kind, Istio) |
| ubuntu20/22/24 | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
| debian9/10/11/12 | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
| centos7/8/9 | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
| alma | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
| rocky | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
| rhel | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
| alt9/alt10 | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
| astra-linux | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
| astra-linux-arm64 | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
| redos | amd64 | ✅ | ✅ | ✅ | ❌ |
## 🛠️ Управление образами
### Проверка наличия образов
```bash
# Проверка локальных образов
docker images | grep inecs/ansible-lab
# Проверка в Molecule
make custom-images check
```
### Обновление образов
```bash
# Загрузить свежие образы
make docker pull
# Пересобрать с обновлениями
make docker rebuild
# Полное обновление
make docker update
```
### Очистка
```bash
# Удалить локальные образы
make docker clean
# Полная очистка
make docker purge
```
## 📚 Дополнительная информация
- [Структура dockerfiles/](../dockerfiles/)
- [Makefile команды](../README.md#-управление-docker-образами)
- [Preset система](molecule-guide.md#preset-система)
- [CI/CD конфигурация](cicd-setup.md)
## 🔗 Полезные ссылки
- **Docker Hub**: https://hub.docker.com/r/inecs/ansible-lab
- **DevOpsLab**: https://devops.org.ru
- **Документация**: https://github.com/DevOpsLab/docs

View File

@@ -1,425 +1,381 @@
# Примеры использования универсальной системы тестирования
# Примеры использования DevOpsLab
## Пример 1: Тестирование кластера etcd + PostgreSQL + Patroni
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 3.0.0
### Описание
Этот пример демонстрирует тестирование высокодоступного кластера PostgreSQL с Patroni и etcd.
## Быстрый старт
### Preset: etcd-patroni
```yaml
# molecule/presets/etcd-patroni.yml
hosts:
# ETCD кластер (5 узлов для высокой доступности)
- name: etcd1
family: debian
groups: [etcd, cluster]
- name: etcd2
family: rhel
groups: [etcd, cluster]
- name: etcd3
family: debian
groups: [etcd, cluster]
- name: etcd4
family: rhel
groups: [etcd, cluster]
- name: etcd5
family: debian
groups: [etcd, cluster]
# Patroni кластер (3 узла PostgreSQL)
- name: patroni1
family: rhel
groups: [patroni, database, cluster]
- name: patroni2
family: debian
groups: [patroni, database, cluster]
- name: patroni3
family: rhel
groups: [patroni, database, cluster]
# HAProxy для балансировки
- name: haproxy
family: debian
groups: [haproxy, loadbalancer]
publish: ["5000:5000", "5001:5001"] # RW и RO порты
# DinD узел для тестирования Docker Compose внутри
- name: app-dind
type: dind
groups: [apps, docker]
publish: ["8080:8080"]
```
### Запуск тестирования
### Базовое тестирование роли
```bash
# Информация о preset'е
make preset-info PRESET=etcd-patroni
# Тестирование роли ping с minimal preset (1 хост)
make role test minimal
# Тестирование с preset'ом
make preset-test PRESET=etcd-patroni
# Тестирование роли docker с default preset (2 хоста)
make role lint docker
make role test docker
```
# Или через role test
make role test etcd-patroni
### Просмотр доступных preset'ов
```bash
# Список всех preset'ов
make presets list
# Информация о конкретном preset'е
make presets info PRESET=default
make presets info PRESET=all-images
```
## Пример 1: Тестирование роли Docker
### Описание
Тестирование универсальной роли Docker на разных ОС.
```bash
# Lint проверка
make role lint docker
# Тестирование с minimal preset (1 хост Debian)
make role test minimal
# Тестирование с default preset (Ubuntu + Debian)
make role test default
# Тестирование с preset all-images (16 хостов, все ОС)
make role test all-images
```
### Проверка результатов
```bash
# Проверить статус контейнеров
make container-info
# Просмотр созданных контейнеров
docker ps -a --filter "network=labnet"
# Проверить vault файлы
make vault-check
# Просмотр логов контейнера
docker logs $(docker ps -aq --filter "network=labnet" | head -1)
# Вход в контейнер для проверки
docker exec -it $(docker ps -aq --filter "network=labnet" | head -1) bash
```
## Пример 2: Нагрузочное тестирование
## Пример 2: Использование роли devops
### Описание
Этот пример демонстрирует тестирование под нагрузкой с множественными серверами и кэшем.
### Описание роли devops
### Preset: performance
Роль `devops` - это универсальная роль для настройки пользователей и SSH ключей на всех поддерживаемых ОС.
**Возможности:**
- Создание пользователя `devops` с настройкой пароля
- Установка SSH публичного ключа
- Настройка sudo прав
- Автоматическое определение ОС и применение соответствующих конфигураций
- Поддержка российских ОС (Alt Linux, Astra Linux, RedOS)
### Тестирование роли devops
```bash
# Тестирование с COD preset (6 хостов)
make role test cod
# Проверка результатов
docker exec -it ubuntu1 id devops
docker exec -it alt1 id devops
docker exec -it astra1 id devops
```
### Использование в других ролях
```yaml
# molecule/presets/performance.yml
hosts:
# Основные серверы (5 узлов)
- name: server1
family: debian
groups: [servers, web, app]
- name: server2
family: rhel
groups: [servers, web, app]
- name: server3
family: debian
groups: [servers, web, app]
- name: server4
family: rhel
groups: [servers, web, app]
- name: server5
family: debian
groups: [servers, web, app]
# База данных (3 узла)
- name: db1
family: rhel
groups: [database, db]
- name: db2
family: debian
groups: [database, db]
- name: db3
family: rhel
groups: [database, db]
# Кэш (3 узла Redis)
- name: cache1
family: debian
groups: [cache, redis]
- name: cache2
family: rhel
groups: [cache, redis]
- name: cache3
family: debian
groups: [cache, redis]
# Load balancer
- name: lb1
family: rhel
groups: [loadbalancer, haproxy]
publish: ["80:80", "443:443"]
# DinD узел для тестирования Docker Compose
- name: compose-dind
type: dind
groups: [apps, docker]
publish: ["8080:8080", "8081:8081"]
```
### Запуск тестирования
```bash
# Тестирование с performance preset'ом
make role test performance
# Проверка статуса
make container-info
```
## Пример 3: Тестирование безопасности
### Описание
Этот пример демонстрирует тестирование в безопасной среде с bastion хостами и изоляцией.
### Preset: security
```yaml
# molecule/presets/security.yml
hosts:
# Bastion хосты (точки входа)
- name: bastion1
family: rhel
groups: [bastion, security, jump]
publish: ["2222:22"]
- name: bastion2
family: debian
groups: [bastion, security, jump]
publish: ["2223:22"]
# Внутренние серверы (без внешнего доступа)
- name: internal1
family: rhel
groups: [internal, servers, app]
- name: internal2
family: debian
groups: [internal, servers, app]
- name: internal3
family: rhel
groups: [internal, servers, app]
# База данных (изолированная сеть)
- name: db-secure1
family: rhel
groups: [database, secure, internal]
- name: db-secure2
family: debian
groups: [database, secure, internal]
# Мониторинг и логирование
- name: monitor1
family: debian
groups: [monitoring, security, logs]
- name: monitor2
family: rhel
groups: [monitoring, security, logs]
# Firewall и сетевые компоненты
- name: fw1
family: rhel
groups: [firewall, network, security]
- name: fw2
family: debian
groups: [firewall, network, security]
# DOoD узел для тестирования Docker безопасности
- name: docker-secure
type: dood
family: debian
groups: [docker, security, apps]
publish: ["8080:8080"]
env:
DOCKER_HOST: "unix:///var/run/docker.sock"
```
### Запуск тестирования
```bash
# Тестирование с security preset'ом
make role test security
# Проверка безопасности
make vault-check
make vault-scan
```
## Пример 4: Тестирование на разных ОС
### Описание
Этот пример демонстрирует тестирование на различных операционных системах.
### Preset: multi-os
```yaml
# molecule/presets/multi-os.yml
hosts:
# Debian/Ubuntu серверы
- name: ubuntu1
family: ubuntu
groups: [ubuntu, servers, web]
- name: debian1
family: debian
groups: [debian, servers, web]
- name: ubuntu2
family: ubuntu
groups: [ubuntu, servers, app]
- name: debian2
family: debian
groups: [debian, servers, app]
# RHEL/CentOS серверы
- name: rhel1
family: rhel
groups: [rhel, servers, web]
- name: centos1
family: centos
groups: [centos, servers, web]
- name: rhel2
family: rhel
groups: [rhel, servers, app]
- name: centos2
family: centos
groups: [centos, servers, app]
# База данных на разных ОС
- name: db-ubuntu
family: ubuntu
groups: [database, ubuntu, db]
- name: db-rhel
family: rhel
groups: [database, rhel, db]
# Load balancer
- name: lb-mixed
family: debian
groups: [loadbalancer, haproxy]
publish: ["80:80", "443:443"]
# DinD узел для тестирования Docker
- name: docker-mixed
type: dind
groups: [docker, apps]
publish: ["8080:8080"]
```
### Запуск тестирования
```bash
# Тестирование с multi-os preset'ом
make role test multi-os
# Проверка типов контейнеров
make container-types
```
## Пример 5: Создание собственного preset'а
### Описание
Этот пример демонстрирует создание собственного preset'а для специфических нужд.
### Создание preset'а
```bash
# Создать новый preset
cat > molecule/presets/my-custom.yml << 'EOF'
---
# Пресет для тестирования веб-приложения
# Автор: Ваше имя
# Сайт: https://your-site.com
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы
images:
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
rhel: "quay.io/centos/centos:stream9-systemd"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
# Описание кластера
hosts:
# Веб-серверы
- name: web1
family: debian
groups: [web, servers]
publish: ["80:80", "443:443"]
- name: web2
family: rhel
groups: [web, servers]
publish: ["8080:80", "8443:443"]
# База данных
- name: db1
family: rhel
groups: [database, db]
- name: db2
family: debian
groups: [database, db]
# Кэш
- name: cache1
family: debian
groups: [cache, redis]
# DinD узел для тестирования
- name: app-dind
type: dind
groups: [apps, docker]
publish: ["8080:8080"]
EOF
```
### Использование preset'а
```bash
# Информация о preset'е
make preset-info PRESET=my-custom
# Тестирование с preset'ом
make preset-test PRESET=my-custom
# Или через role test
make role test my-custom
```
## Пример 6: Работа с Ansible Vault
### Создание vault файла
```bash
# Создать файл секретов
make vault create
# Ввести имя файла: secrets
# Ввести содержимое:
# ---
# database_password: "super_secret_password"
# api_key: "your_api_key_here"
# ssl_cert: "your_ssl_certificate"
```
### Использование в ролях
```yaml
# roles/my-role/tasks/main.yml
- name: Configure database
template:
src: database.conf.j2
dest: /etc/database.conf
# В вашем playbook
- name: Настройка пользователя devops
include_role:
name: devops
vars:
db_password: "{{ database_password }}"
api_key: "{{ api_key }}"
devops_user: "devops"
devops_password: "{{ vault_devops_password }}"
devops_ssh_public_key: "{{ vault_devops_ssh_public_key }}"
```
### Проверка безопасности
## Пример 3: Создание собственной роли
### Создание роли
```bash
# Проверить vault файлы
make vault-check
# Интерактивное создание новой роли
make role create
# Введите имя роли: nginx
# Найти потенциальные секреты
make vault-scan
# Редактирование роли
cd roles/nginx
nano tasks/main.yml
```
### Разработка роли
**`roles/nginx/tasks/main.yml`:**
```yaml
---
- name: Установка nginx
package:
name: nginx
state: present
when: ansible_os_family in ['Debian', 'RedHat']
- name: Запуск nginx
systemd:
name: nginx
state: started
enabled: yes
```
### Тестирование роли
```bash
# Lint проверка
make role lint nginx
# Тестирование с minimal preset
make role test minimal
# Проверка работы nginx
docker exec -it $(docker ps -aq --filter "network=labnet" | head -1) systemctl status nginx
```
## Пример 4: Использование preset'ов
### Minimal preset (1 хост)
```bash
# Быстрое тестирование на 1 хосте
make role test minimal
# Проверка контейнера
docker ps -a --filter "network=labnet"
```
### Default preset (2 хоста)
```bash
# Тестирование на Ubuntu + Debian
make role test default
# Проверка нескольких контейнеров
docker ps -a --filter "network=labnet"
```
### COD preset (6 хостов) - ARM64
```bash
# Тестирование на Ubuntu + Debian + Alt + Astra + CentOS + RHEL
make role test cod
# Проверка всех контейнеров
docker ps -a --filter "network=labnet" --format "table {{.Names}}\t{{.Status}}"
```
**Особенности COD preset:**
- **Платформа**: ARM64 (нативная поддержка)
- **ОС**: Ubuntu 22.04, Debian 12, Alt Linux 10, Astra Linux, CentOS Stream 9, RHEL
- **Группы**: `cod`, `ubuntu`, `debian`, `alt`, `astra`, `centos`, `rhel`
- **Использование**: Полное тестирование на российских и зарубежных ОС
### All-images preset (16 хостов)
```bash
# Полное тестирование всех ОС
make role test all-images
# Проверка всех контейнеров
docker ps -a --filter "network=labnet" --format "table {{.Names}}\t{{.Status}}"
```
### Preset'ы по ОС
```bash
# Тестирование на всех версиях Ubuntu
make role test ubuntu-all
# Тестирование на всех версиях Debian
make role test debian-all
# Тестирование на всех версиях CentOS
make role test centos-all
```
## Пример 5: Работа с Ansible Vault
### Создание секретов
```bash
# Инициализация vault
make vault init
# Создание нового файла секретов
make vault create
# Имя файла: secrets
```
### Редактирование секретов
```bash
# Редактирование
make vault edit
# Имя файла: secrets
# Просмотр секретов
make vault show
# Имя файла: secrets
```
### Использование в тестировании
Секреты автоматически расшифровываются при запуске тестов и шифруются обратно после завершения.
## Пример 6: CI/CD интеграция
### GitHub Actions
```yaml
name: Ansible Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run tests
run: |
make role lint
make role test minimal
```
### GitLab CI
```yaml
test:
script:
- make role lint
- make role test minimal
only:
- merge_requests
- main
```
## Пример 7: Диагностика и отладка
### Проверка линтинга
```bash
# Линт всех ролей
make role lint
# Линт конкретной роли
make role lint docker
# Линт с подробным выводом
ansible-lint roles/docker/ -vv
```
### Диагностика тестов
```bash
# Проверка preset'ов
make presets list
make presets info PRESET=default
# Проверка контейнеров
docker ps -a --filter "network=labnet"
docker network inspect labnet
# Просмотр логов
docker logs -f $(docker ps -aq --filter "network=labnet" | head -1)
```
### Очистка
```bash
# Очистка контейнеров Molecule
make clean-containers
# Очистка образов
make docker clean
# Полная очистка
make docker purge
```
## Полезные команды
### Просмотр информации
```bash
# Список всех ролей
make role list
# Список preset'ов
make presets list
# Информация об образах
make docker info
# Справка по командам
make help
```
### Docker операции
```bash
# Проверка builder'а
make docker check-builder
# Диагностика buildx
make docker diagnose
# Настройка builder'а
make docker setup-builder
# Пересборка образов
make docker rebuild
```
### Vault операции
```bash
# Создание vault
make vault init
# Работа с секретами
make vault create
make vault edit
make vault show
# Проверка vault
make vault check
```
## Заключение
Эти примеры демонстрируют различные способы использования универсальной системы тестирования Ansible ролей. Вы можете:
Эти примеры демонстрируют основные возможности DevOpsLab:
1. Использовать готовые preset'ы для быстрого тестирования
2. Создавать собственные preset'ы для специфических нужд
3. Комбинировать различные типы контейнеров
4. Использовать Ansible Vault для безопасности
5. Тестировать на различных операционных системах
1. **Быстрое тестирование** с minimal preset
2. **Универсальная роль devops** для настройки пользователей и SSH
3. **COD preset** для тестирования российских и зарубежных ОС (ARM64)
4. **Полное тестирование** с all-images preset
5. **Создание ролей** через интерактивные команды
6. **Работа с Vault** для секретов
7. **Диагностика** и отладка тестов
8. **Интеграция CI/CD** для автоматизации
Для получения дополнительной информации используйте:
- `make help` - общая справка
- `make preset-list` - список preset'ов
- `make container-types` - типы контейнеров
- `make vault` - команды Vault
Для получения дополнительной информации:
- Используйте `make help` для списка команд
- Читайте документацию в `docs/` директории
- Изучайте примеры в `roles/docker/`
---
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru

View File

@@ -1,18 +1,31 @@
# Быстрый старт с AnsibleLab
# Быстрый старт с DevOpsLab
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 3.0.0
## 🚀 Установка и настройка
### 1. Клонирование репозитория
```bash
git clone https://github.com/your-username/AnsibleLab.git
cd AnsibleLab
git clone ssh://git@git.antropoff.ru:222/Ansible/DevOpsLab.git
cd DevOpsLab
```
### 2. Настройка Docker
### 2. Проверка структуры проекта
```bash
# Просмотр доступных ролей
make role list
# Просмотр доступных preset'ов
make presets list
```
### 3. Настройка Docker (опционально)
Если вы хотите собрать собственные образы:
```bash
# Настройка multi-arch builder
@@ -25,22 +38,11 @@ make docker build
make docker info
```
**Примечание:** Используются готовые образы из Docker Hub `inecs/ansible-lab`.
## 🧪 Первое тестирование
### 1. Управление ролями
```bash
# Просмотр всех ролей
make role list
# Создание новой роли (интерактивно)
make role create
# Удаление роли (интерактивно)
make role delete
```
### 2. Просмотр доступных preset'ов
### 1. Просмотр доступных preset'ов
```bash
# Список всех preset'ов
@@ -50,42 +52,58 @@ make presets list
make presets info PRESET=default
```
### 3. Тестирование роли ping
### 2. Тестирование роли ping
```bash
# Тестирование с default preset
make role test
# Тестирование с minimal preset
# Тестирование с minimal preset (1 хост)
make role test minimal
```
### 3. Проверка результатов
```bash
# Просмотр логов
docker logs ansible-controller
# Проверка через логи
docker logs ansible-controller 2>/dev/null || echo "Контейнер не запущен"
# Вход в контейнер для отладки
docker exec -it ansible-controller bash
# Просмотр созданных контейнеров
docker ps -a --filter "network=labnet"
```
## 🔧 Создание первой роли
### 1. Создание структуры роли
### 1. Создание новой роли
```bash
# Создание директории роли
mkdir -p roles/my-role/{tasks,handlers,templates,files,vars,defaults,meta}
# Создание основных файлов
touch roles/my-role/{tasks,handlers,meta}/main.yml
touch roles/my-role/defaults/main.yml
touch roles/my-role/vars/main.yml
touch roles/my-role/README.md
# Интерактивное создание роли
make role create
# Введите имя роли (например: nginx)
```
### 2. Разработка роли
### 2. Редактирование роли
После создания роли будет создана структура в `roles/<имя-роли>/`:
```
roles/my-role/
├── tasks/
│ └── main.yml
├── handlers/
│ └── main.yml
├── defaults/
│ └── main.yml
├── vars/
│ └── main.yml
├── meta/
│ └── main.yml
├── templates/
├── files/
└── README.md
```
### 3. Написание задач роли
**`roles/my-role/tasks/main.yml`:**
```yaml
@@ -94,28 +112,19 @@ touch roles/my-role/README.md
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Установка пакетов
package:
name: "{{ my_role_packages }}"
state: present
when: my_role_enabled | default(true)
tags:
- my-role
- install
- name: Проверка установленных пакетов
debug:
msg: "Роль {{ role_name }} выполняется на {{ ansible_hostname }}"
- name: Настройка конфигурации
template:
src: my-role.conf.j2
dest: /etc/my-role/my-role.conf
owner: root
group: root
mode: '0644'
notify: restart my-role
tags:
- my-role
- config
- name: Установка пакетов (пример)
package:
name: "{{ my_role_packages | default([]) }}"
state: present
when: my_role_packages is defined
```
### 4. Настройка defaults
**`roles/my-role/defaults/main.yml`:**
```yaml
---
@@ -123,172 +132,104 @@ touch roles/my-role/README.md
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Основные настройки
my_role_packages: []
my_role_enabled: true
my_role_packages:
- nginx
- curl
# Конфигурация
my_role_config_file: /etc/my-role/my-role.conf
my_role_log_level: info
```
### 3. Тестирование роли
### 5. Тестирование роли
```bash
# Lint проверка
make role lint
# Проверка синтаксиса
make role lint my-role
# Тестирование в Docker
# Тестирование с минимальным preset
make role test minimal
# Тестирование с custom preset
make role test my-custom-preset
```
## 🚀 Развертывание на продакшн
### 6. Добавление роли в deploy.yml
### 1. Настройка инвентори
Роль автоматически добавляется в `roles/deploy.yml` при создании.
**`inventory/hosts.ini`:**
```ini
# Продакшн серверы
[web_servers]
web1.example.com ansible_host=192.168.1.10
web2.example.com ansible_host=192.168.1.11
## 📚 Доступные роли
[db_servers]
db1.example.com ansible_host=192.168.1.20
db2.example.com ansible_host=192.168.1.21
### Docker
[all:vars]
ansible_user=devops
ansible_ssh_private_key_file=~/.ssh/id_rsa
ansible_ssh_common_args='-o StrictHostKeyChecking=no'
```
### 2. Настройка SSH ключей
Универсальная роль для установки Docker и Docker Compose.
```bash
# Генерация SSH ключа
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
# Копирование ключа на серверы
ssh-copy-id devops@web1.example.com
ssh-copy-id devops@web2.example.com
# Тестирование роли docker
make role lint docker
make role test docker
```
### 3. Тестирование подключения
**Документация:** [roles/docker/README.md](../roles/docker/README.md)
### DevOps
Роль для установки и настройки инструментов DevOps.
**Документация:** [roles/devops/README.md](../roles/devops/README.md)
### Ping
Простая роль для проверки ping.
```bash
# Проверка подключения
ansible all -i inventory/hosts.ini -m ping
# Dry-run развертывания
make role deploy
# Тестирование роли ping
make role lint ping
make role test ping
```
### 4. Развертывание
**Документация:** [roles/ping/README.md](../roles/ping/README.md)
## 🎯 Preset система
### Базовые preset'ы
- **`default`** - Стандартный preset (2 хоста: Ubuntu + Debian)
- **`minimal`** - Минимальный preset (1 хост: Debian)
- **`test`** - Базовый тест (2 хоста)
### Preset'ы по ОС
- **Ubuntu**: `ubuntu20`, `ubuntu22`, `ubuntu24`, `ubuntu-all`
- **Debian**: `debian9`, `debian10`, `debian11`, `debian12`, `debian-all`
- **CentOS**: `centos7`, `centos8`, `centos9`, `centos-all`
### Специализированные preset'ы
- **`all-images`** - Все образы (16 хостов)
- **`multi-os`** - Multi-OS тестирование (8 хостов)
- **`docker-full`** - Docker тестирование (4 хоста)
- **`performance`** - Тест производительности (8 хостов)
- **`security`** - Тест безопасности (6 хостов)
## 🔐 Работа с секретами
### Инициализация Vault
```bash
# Развертывание на продакшн
make role deploy
# Подтвердить развертывание: y
```
## 🔐 Управление секретами
### 1. Инициализация vault
```bash
# Создание файла пароля
# Создание файла с паролем
make vault init
# Создание файла секретов
make vault create
```
### 2. Работа с секретами
### Создание и редактирование секретов
```bash
# Редактирование секретов
# Создание нового секрета
make vault create
# Редактирование существующего
make vault edit
# Просмотр секретов
# Просмотр секрета
make vault show
# Шифрование файла
make vault encrypt
```
## 🏗️ CI/CD интеграция
## 📖 Дополнительная документация
### 1. GitHub Actions
```yaml
# .github/workflows/ansible-test.yml
name: Ansible Testing
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run tests
run: make role test
```
### 2. Azure DevOps
```yaml
# azure-pipelines.yml
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
stages:
- stage: Test
jobs:
- job: TestJob
steps:
- script: make role test
```
## 📊 Мониторинг и диагностика
### 1. Диагностика Docker
```bash
# Диагностика buildx проблем
make docker diagnose
# Проверка builder'а
make docker setup-builder
# Сброс builder'а при проблемах
make docker reset-builder
```
### 2. Логи и отчеты
```bash
# Просмотр логов контейнера
docker logs ansible-controller
# Вход в контейнер для отладки
docker exec -it ansible-controller bash
```
## 🎯 Следующие шаги
1. **Изучите документацию** по [созданию ролей](creating-roles.md)
2. **Настройте CI/CD** по [инструкции](cicd-setup.md)
3. **Изучите Docker образы** в [dockerfiles/README.md](../dockerfiles/README.md)
4. **Настройте мониторинг** по [руководству](monitoring.md)
---
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
- [Руководство по Molecule](molecule-guide.md)
- [Создание ролей](creating-roles.md)
- [Docker образы](dockerfiles.md)
- [Preset система](presets-by-os.md)
- [Настройка CI/CD](cicd-setup.md)

110
docs/k8s-ingress-fix.md Normal file
View File

@@ -0,0 +1,110 @@
# Исправление проблемы с Ingress
## Проблема
После создания Kubernetes кластера Ingress ресурсы не доступны по доменным именам.
## Причина
1. **extraPortMappings не добавлялись в конфигурацию Kind** - порты 80 и 443 не пробрасывались на host
2. **Записи в /etc/hosts не добавлялись автоматически** при применении манифестов
## Решение
### Вариант 1: Быстрое исправление (без пересоздания кластера)
1. **Добавьте запись в `/etc/hosts` вручную:**
```bash
echo "127.0.0.1 grafana.local #k8s" | sudo tee -a /etc/hosts
```
2. **Создайте port-forward для Ingress напрямую:**
```bash
# Подключитесь к кластеру
export KUBECONFIG=$(docker exec k8s-controller cat /root/.kube/config)
# Замените 0.0.0.0 на localhost в kubeconfig
export KUBECONFIG=$(echo "$KUBECONFIG" | sed 's/0\.0\.0\.0:6443/localhost:6443/g' > /tmp/kubeconfig-local.yaml && echo /tmp/kubeconfig-local.yaml)
# Создайте port-forward для Ingress HTTP
kubectl port-forward -n ingress-nginx svc/ingress-nginx-controller 8081:80 &
# Проверьте доступность
curl -H "Host: grafana.local" http://localhost:8081
```
3. **Откройте в браузере:**
```
http://grafana.local:8081
```
### Вариант 2: Пересоздание кластера (рекомендуется)
Исправления уже внесены в код. Просто пересоздайте кластер:
```bash
# Удалите старый кластер
make k8s destroy kubernetes
# Создайте новый (с исправлениями)
make k8s create kubernetes
# Примените манифест с Ingress
make k8s manifest apply kubernetes manifests/test-grafana-ingress.yaml
# Запись в /etc/hosts добавится автоматически
# Проверьте
cat /etc/hosts | grep k8s
# Откройте в браузере
open http://grafana.local:8081
```
## Проверка
```bash
# 1. Проверьте Ingress
docker exec k8s-controller kubectl --server=https://lab-control-plane:6443 --insecure-skip-tls-verify get ingress --all-namespaces
# 2. Проверьте ports control-plane
docker port lab-control-plane
# Должны быть:
# 6443/tcp -> 0.0.0.0:6443
# 80/tcp -> 0.0.0.0:8081 <- после исправления
# 443/tcp -> 0.0.0.0:8443 <- после исправления
# 3. Проверьте доступность
curl -H "Host: grafana.local" http://localhost:8081
```
## Что было исправлено
1. В `scripts/create_k8s_cluster.py` исправлена логика добавления `extraPortMappings` в конфигурацию Kind
2. Порты 80 и 443 теперь правильно пробрасываются на host (8081 и 8443)
3. Манифест Ingress можно применить и автоматически добавить запись в `/etc/hosts`
## Дополнительно
Если Ingress всё ещё не работает:
1. **Проверьте статус подов Ingress Controller:**
```bash
docker exec k8s-controller kubectl --server=https://lab-control-plane:6443 --insecure-skip-tls-verify get pods -n ingress-nginx
```
2. **Проверьте логи Ingress Controller:**
```bash
docker exec k8s-controller kubectl --server=https://lab-control-plane:6443 --insecure-skip-tls-verify logs -n ingress-nginx -l app.kubernetes.io/component=controller
```
3. **Проверьте события:**
```bash
docker exec k8s-controller kubectl --server=https://lab-control-plane:6443 --insecure-skip-tls-verify get events -n monitoring
```

232
docs/k8s-scripts.md Normal file
View File

@@ -0,0 +1,232 @@
# Скрипты управления Kubernetes
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
## Обзор
В проекте используются несколько Python скриптов для автоматизации работы с Kubernetes кластерами на базе Kind. Все скрипты находятся в директории `scripts/`.
## Скрипты
### 1. `create_k8s_cluster.py`
**Назначение:** Создание Kind кластера, установка аддонов и создание Docker контейнеров из пресета.
**Принцип работы:**
1. **Парсинг пресета:** Читает YAML файл пресета (например, `molecule/presets/k8s/kubernetes.yml`)
2. **Создание Docker сети:**
- Проверяет наличие сети (по умолчанию `labnet`)
- Создает сеть если её нет
3. **Создание Docker контейнеров:**
- Читает секцию `hosts` из пресета
- Для каждого хоста создает Docker контейнер с настройками из `systemd_defaults`
- Использует образы из секции `images`
4. **Создание Kind кластера:**
- Генерирует конфигурацию Kind в формате YAML
- Настраивает `extraPortMappings` для Ingress портов
- Создает кластер через команду `kind create cluster`
5. **Установка аддонов:**
- **Ingress NGINX:** Устанавливает ingress-nginx controller через kubectl apply
- **Metrics Server:** Устанавливает metrics-server с патчем для insecure TLS
- **Istio:** Устанавливает Istio через istioctl с профилем demo
- **Kiali:** Устанавливает Kiali через Helm (использует Helm chart)
- **Prometheus Stack:** Устанавливает Prometheus + Grafana через Helm (kube-prometheus-stack)
6. **Подключение к сети Kind:** Подключает контейнер `k8s-controller` к сети `kind` для доступа к API серверу
**Параметры:**
```bash
python3 scripts/create_k8s_cluster.py <preset_file> <container_name>
```
**Пример:**
```bash
python3 scripts/create_k8s_cluster.py molecule/presets/k8s/kubernetes.yml k8s-controller
```
---
### 2. `delete_hosts.py`
**Назначение:** Удаление Docker контейнеров, созданных из секции `hosts` пресета.
**Принцип работы:**
1. **Парсинг пресета:** Читает YAML файл пресета
2. **Получение списка хостов:** Извлекает секцию `hosts`
3. **Удаление контейнеров:** Для каждого хоста выполняет `docker rm -f <host_name>`
**Параметры:**
```bash
python3 scripts/delete_hosts.py <preset_file>
```
**Пример:**
```bash
python3 scripts/delete_hosts.py molecule/presets/k8s/kubernetes.yml
```
---
### 3. `portforward.py`
**Назначение:** Управление port-forward для доступа к сервисам Kubernetes извне кластера.
**Принцип работы:**
1. **Загрузка пресета:** Читает файл `molecule/presets/k8s/kubernetes.yml`
2. **Получение kubeconfig:**
- Копирует kubeconfig из контейнера `k8s-controller` через `docker exec`
- Сохраняет во временный файл
3. **Модификация kubeconfig:**
- Заменяет `server: https://0.0.0.0:6443` на `server: https://localhost:6443`
- Это необходимо для доступа с локальной машины
4. **Создание port-forward:**
- Запускает `kubectl port-forward` для каждого сервиса из `addon_ports`
- Использует формат: `kubectl port-forward -n <namespace> svc/<service> <local_port>:<remote_port>`
- Управляет процессами через PID
**Команды:**
- `create` - создает port-forward для всех сервисов
- `list` - показывает список активных портов
- `clear` - останавливает все port-forward процессы
- `recreate` - очищает и заново создает port-forward
- `delete <port>` - удаляет конкретный port-forward
**Пример использования:**
```bash
python3 scripts/portforward.py create
python3 scripts/portforward.py list
python3 scripts/portforward.py delete 3000
python3 scripts/portforward.py clear
```
**Важно:** Скрипт должен запускаться на локальной машине, где установлены `kubectl` и Python 3.
---
### 4. `k8s_status.py`
**Назначение:** Детальный отчет о состоянии Kubernetes кластера.
**Принцип работы:**
1. **Подключение к кластеру:**
- Получает имя кластера через `kind get clusters`
- Формирует адрес API сервера: `https://<cluster_name>-control-plane:6443`
- Выполняет все kubectl команды через `docker exec k8s-controller`
2. **Сбор информации:**
- **Общая информация:** версия Kubernetes
- **Узлы:** статус, ресурсы, описание каждого узла
- **Namespaces:** список всех namespace
- **Использование ресурсов:** метрики через metrics-server (если установлен)
- **Pods:** поды по каждому namespace
- **Deployments:** deployments по namespace
- **DaemonSets:** daemonsets по namespace
- **StatefulSets:** statefulsets по namespace
- **Services:** сервисы по namespace
- **Ingress:** ingress ресурсы
- **PVC:** PersistentVolumeClaims
- **События:** последние 20 событий по namespace
- **Helm релизы:** список установленных через Helm
3. **Форматирование вывода:**
- Использует секции с разделителями
- Группирует информацию по namespace
- Показывает только непустые секции
**Пример использования:**
```bash
python3 scripts/k8s_status.py
```
**Интеграция:**
- Автоматически вызывается командой `make k8s status [preset]`
**Особенности:**
- Выполняет все команды внутри контейнера `k8s-controller`
- Использует прямой адрес control-plane для подключения
- Обходит проблемы с kubeconfig через `--insecure-skip-tls-verify`
---
## Архитектура взаимодействия
```
┌─────────────────────────────────────────────────────┐
│ Локальная машина │
│ │
│ Makefile → Python скрипты → Docker API │
│ ↓ ↓ ↓ │
│ make k8s scripts/*.py docker exec │
└─────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ Docker контейнер │
│ k8s-controller │
│ ┌──────────────────────────────────────────┐ │
│ │ kind, kubectl, helm, istioctl │ │
│ └──────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ Docker сеть: kind │
│ ┌──────────────────────────────────────────┐ │
│ │ Kind Kubernetes Cluster │ │
│ │ • Control Plane (6443) │ │
│ │ • Worker Nodes │ │
│ │ • Services (ClusterIP) │ │
│ │ • Ingress │ │
│ └──────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
```
## Общие принципы
1. **Изоляция:** Все kubectl команды выполняются внутри контейнера `k8s-controller`
2. **Безопасность:** Используется `--insecure-skip-tls-verify` для обхода проблем с сертификатами
3. **Автоматизация:** Скрипты вызываются автоматически через Makefile
4. **Логгирование:** Все скрипты выводят подробную информацию о своих действиях
## Требования
- Python 3 (на локальной машине)
- kubectl (на локальной машине, для portforward.py)
- Docker
- Docker контейнер `k8s-controller` должен быть запущен
## Отладка
Если что-то не работает:
1. **Проверьте контейнер:**
```bash
docker ps | grep k8s-controller
```
2. **Запустите скрипт вручную:**
```bash
python3 scripts/k8s_status.py
```
3. **Посмотрите логи:**
```bash
docker logs k8s-controller
```
4. **Проверьте кластер:**
```bash
docker exec k8s-controller kubectl get nodes
```

395
docs/kubernetes-commands.md Normal file
View File

@@ -0,0 +1,395 @@
# Команды для работы с Kubernetes
Автор: Сергей Антропов
Сайт: https://devops.org.ru
## Содержание
- [Работа с манифестами](#работа-с-манифестами)
- [Работа с Helm](#работа-с-helm)
- [Работа с Helm репозиториями](#работа-с-helm-репозиториями)
## Работа с манифестами
Команды для применения, удаления и обновления манифестов YAML в кластере.
### Синтаксис
```bash
make k8s manifest [команда] [пресет] [URL_или_путь_к_файлу]
```
### Команды
#### `apply` - Применение манифеста
Применяет манифест YAML к кластеру.
```bash
make k8s manifest apply kubernetes https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
```
**Примеры:**
```bash
# Применение манифеста из URL
make k8s manifest apply kubernetes https://example.com/deploy.yaml
# Применение локального манифеста
make k8s manifest apply kubernetes ./manifests/my-app.yaml
```
#### `delete` - Удаление ресурсов
Удаляет ресурсы из кластера по манифесту.
```bash
make k8s manifest delete kubernetes https://example.com/deploy.yaml
```
#### `update` - Обновление манифеста
Обновляет ресурсы в кластере, используя манифест.
```bash
make k8s manifest update kubernetes https://example.com/deploy.yaml
```
### Примеры использования
```bash
# Установка NGINX Ingress Controller
make k8s manifest apply kubernetes https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
# Удаление ресурсов
make k8s manifest delete kubernetes https://example.com/deploy.yaml
# Обновление конфигурации
make k8s manifest update kubernetes https://example.com/deploy.yaml --force
```
## Работа с Helm
Команды для установки, обновления и управления Helm чартами в кластере.
### Синтаксис
```bash
make k8s helm [команда] [пресет] [релиз] [чант]
```
### Команды
#### `apply` - Установка/обновление чарта
Устанавливает новый релиз или обновляет существующий.
```bash
make k8s helm apply kubernetes my-nginx nginx/nginx-ingress
```
**Параметры:**
- `пресет` - имя пресета кластера
- `релиз` - имя релиза (например: my-nginx)
- `чарт` - имя чарта (например: nginx/nginx-ingress)
**Примеры:**
```bash
# Установка nginx-ingress
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress
# Установка с указанием репозитория
make k8s helm apply kubernetes prometheus prometheus-community/prometheus
```
#### `delete` - Удаление релиза
Удаляет Helm релиз из кластера.
```bash
make k8s helm delete kubernetes my-nginx
```
**Примеры:**
```bash
# Удаление релиза
make k8s helm delete kubernetes nginx-ingress
# Удаление с флагом --keep-history
# (не поддерживается в текущей реализации)
```
#### `update` - Обновление релиза
Обновляет существующий Helm релиз.
```bash
make k8s helm update kubernetes my-nginx nginx/nginx-ingress
```
#### `rollback` - Откат релиза
Откатывает релиз к предыдущей версии.
```bash
make k8s helm rollback kubernetes my-nginx
```
**Примеры:**
```bash
# Откат к предыдущей ревизии
make k8s helm rollback kubernetes my-nginx
# Откат к конкретной ревизии (не поддерживается в текущей реализации)
```
#### `list` - Список релизов
Показывает список всех установленных Helm релизов.
```bash
make k8s helm list kubernetes
```
**Пример вывода:**
```
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
nginx-ingress default 1 2024-01-15 12:00:00.000000 +0000 UTC deployed nginx-ingress-0.1.0 1.0.0
```
#### `status` - Статус релиза
Показывает подробную информацию о статусе релиза.
```bash
make k8s helm status kubernetes my-nginx
```
### Примеры использования
```bash
# 1. Установка NGINX Ingress Controller
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress
# 2. Проверка статуса
make k8s helm status kubernetes nginx-ingress
# 3. Обновление релиза
make k8s helm update kubernetes nginx-ingress nginx/nginx-ingress
# 4. Просмотр списка релизов
make k8s helm list kubernetes
# 5. Откат релиза
make k8s helm rollback kubernetes nginx-ingress
# 6. Удаление релиза
make k8s helm delete kubernetes nginx-ingress
```
## Работа с Helm репозиториями
Команды для управления Helm репозиториями.
### Синтаксис
```bash
make k8s helmrepo [команда] [пресет] [имя] [URL]
```
### Команды
#### `add` - Добавление репозитория
Добавляет новый Helm репозиторий.
```bash
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
```
**Примеры:**
```bash
# Добавление официального репозитория Helm
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
# Добавление репозитория Bitnami
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
# Добавление репозитория NGINX
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
# Добавление репозитория Prometheus
make k8s helmrepo add kubernetes prometheus-community https://prometheus-community.github.io/helm-charts
# Добавление пользовательского репозитория
make k8s helmrepo add kubernetes my-repo https://charts.example.com
```
#### `list` - Список репозиториев
Показывает список всех добавленных Helm репозиториев.
```bash
make k8s helmrepo list kubernetes
```
**Пример вывода:**
```
NAME URL
stable https://charts.helm.sh/stable
bitnami https://charts.bitnami.com/bitnami
nginx https://helm.nginx.com/stable
```
#### `delete` - Удаление репозитория
Удаляет Helm репозиторий.
```bash
make k8s helmrepo delete kubernetes stable
```
**Примеры:**
```bash
# Удаление репозитория
make k8s helmrepo delete kubernetes stable
```
#### `update` - Обновление репозиториев
Обновляет информацию о всех Helm репозиториях.
```bash
make k8s helmrepo update kubernetes
```
**Примеры:**
```bash
# Обновление всех репозиториев
make k8s helmrepo update kubernetes
```
#### `packages` - Список пакетов
Показывает список пакетов в указанном репозитории.
```bash
make k8s helmrepo packages kubernetes stable
```
**Примеры:**
```bash
# Просмотр пакетов в репозитории stable
make k8s helmrepo packages kubernetes stable
# Просмотр пакетов в репозитории nginx
make k8s helmrepo packages kubernetes nginx
# Поиск конкретного пакета
make k8s helmrepo packages kubernetes stable | grep nginx
```
### Примеры использования
```bash
# 1. Добавление нескольких репозиториев
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
# 2. Просмотр списка репозиториев
make k8s helmrepo list kubernetes
# 3. Обновление репозиториев
make k8s helmrepo update kubernetes
# 4. Поиск пакетов в репозитории
make k8s helmrepo packages kubernetes stable
# 5. Удаление репозитория
make k8s helmrepo delete kubernetes my-custom-repo
# 6. Установка пакета из добавленного репозитория
make k8s helm apply kubernetes my-nginx nginx/nginx-ingress
```
## Полный рабочий пример
```bash
# 1. Создание кластера
make k8s create kubernetes
# 2. Добавление Helm репозиториев
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
# 3. Обновление репозиториев
make k8s helmrepo update kubernetes
# 4. Просмотр доступных пакетов
make k8s helmrepo packages kubernetes nginx
# 5. Установка NGINX Ingress Controller
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress
# 6. Проверка статуса
make k8s helm status kubernetes nginx-ingress
# 7. Просмотр списка релизов
make k8s helm list kubernetes
# 8. Применение манифеста
make k8s manifest apply kubernetes https://example.com/deploy.yaml
# 9. Откат релиза (если нужно)
make k8s helm rollback kubernetes nginx-ingress
# 10. Удаление релиза
make k8s helm delete kubernetes nginx-ingress
# 11. Удаление репозитория
make k8s helmrepo delete kubernetes nginx
# 12. Удаление кластера
make k8s destroy kubernetes
```
## Обработка ошибок
### Ошибка: Контейнер не запущен
```
❌ Контейнер k8s-kubernetes не запущен
💡 Запустите: make k8s create kubernetes
```
**Решение:** Запустите кластер перед выполнением команд.
### Ошибка: Неизвестная команда
```
❌ Неизвестная команда: unknown
💡 Доступные команды: apply, delete, update
```
**Решение:** Используйте правильную команду из списка доступных.
### Ошибка: Не указаны параметры
```
❌ Ошибка: Укажите имя релиза и чарт
💡 Пример: make k8s helm apply kubernetes my-release stable/nginx-ingress
```
**Решение:** Укажите все необходимые параметры команды.
## Дополнительная информация
- Все команды kubectl и helm выполняются внутри контейнера `k8s-[пресет]`
- Вам не нужно устанавливать kubectl или helm локально
- Подключение к кластеру происходит через имя узла control-plane
- Используется флаг `--insecure-skip-tls-verify` для обхода проблем с сертификатами
## Автор
Сергей Антропов
Сайт: https://devops.org.ru

View File

@@ -0,0 +1,906 @@
# Полное руководство по работе с Kubernetes кластерами
Автор: Сергей Антропов
Сайт: https://devops.org.ru
## Содержание
- [Введение](#введение)
- [Создание кластера](#создание-кластера)
- [Управление кластером](#управление-кластером)
- [Работа с манифестами](#работа-с-манифестами)
- [Работа с Helm](#работа-с-helm)
- [Настройка Ingress](#настройка-ingress)
- [Мониторинг и аддоны](#мониторинг-и-аддоны)
- [Service Mesh с Istio](#service-mesh-с-istio)
- [Примеры полных развертываний](#примеры-полных-развертываний)
## Введение
DevOpsLab предоставляет полную поддержку создания и управления локальными Kubernetes кластерами на основе Kind (Kubernetes in Docker). Kind позволяет запускать Kubernetes кластеры внутри Docker контейнеров, что идеально подходит для разработки, тестирования и обучения.
### Основные возможности
- Создание многоузловых Kubernetes кластеров
- Установка и управление Helm чартами
- Работа с манифестами YAML
- Настройка Ingress контроллеров
- Установка систем мониторинга (Prometheus, Grafana)
- Развертывание Service Mesh (Istio, Kiali)
- Изоляция сети и безопасность
### Преимущества
- Не требует установки локального Kubernetes
- Быстрое создание и удаление кластеров
- Поддержка многоузловых конфигураций
- Полная совместимость с production окружениями
- Контейнеризация всех инструментов
## Создание кластера
### Базовое создание
Простое создание минимального кластера без дополнительных компонентов:
```bash
make k8s create
```
Создаст кластер с пресетом `k8s-minimal` - один control-plane узел без дополнительных компонентов.
### Создание полнофункционального кластера
Создание кластера с предустановленными компонентами:
```bash
make k8s create kubernetes
```
Этот пресет создает кластер со следующими компонентами:
- 1 control-plane узел
- 2 worker узла
- Ingress NGINX Controller
- Metrics Server
- Istio Service Mesh
- Kiali для визуализации Istio
- Prometheus Stack (Prometheus + Grafana)
### Конфигурация пресета
Пресеты находятся в `molecule/presets/k8s/`. Пример конфигурации:
```yaml
kind_clusters:
- name: lab
workers: 2
api_port: 6443
addons:
ingress_nginx: true
metrics_server: true
istio: true
kiali: true
prometheus_stack: true
ingress_host_http_port: 8081
ingress_host_https_port: 8443
addon_ports:
prometheus: 9090
grafana: 3000
kiali: 20001
```
### Проверка статуса кластера
```bash
# Показать узлы кластера
make k8s nodes kubernetes
# Вывод:
# NAME STATUS ROLES AGE VERSION
# lab-control-plane Ready control-plane 5m v1.34.0
# lab-worker Ready <none> 4m v1.34.0
# lab-worker2 Ready <none> 4m v1.34.0
# Показать подробный статус
make k8s status kubernetes
```
### Подключение к кластеру
```bash
# Получить kubeconfig
make k8s config kubernetes
# Использовать kubeconfig
export KUBECONFIG=$(pwd)/kubeconfig
kubectl get nodes
```
## Управление кластером
### Остановка и запуск
```bash
# Остановить кластер (без удаления)
make k8s stop kubernetes
# Запустить остановленный кластер
make k8s start kubernetes
# Перезапустить кластер
make k8s stop kubernetes && make k8s start kubernetes
```
### Удаление кластера
```bash
# Полное удаление кластера и контейнера
make k8s destroy kubernetes
```
### Получение shell в контейнере
```bash
# Открыть интерактивный shell
make k8s shell kubernetes
# Теперь доступны все команды kubectl, helm, kind внутри контейнера
kubectl get nodes
helm list
kind get clusters
```
## Работа с манифестами
### Применение манифеста
Применение манифеста из URL:
```bash
make k8s manifest apply kubernetes https://example.com/deploy.yaml
```
Применение локального манифеста:
```bash
# Создайте файл example-deployment.yaml
cat > example-deployment.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
EOF
# Применить манифест
make k8s manifest apply kubernetes ./example-deployment.yaml
```
### Удаление ресурсов
```bash
make k8s manifest delete kubernetes https://example.com/deploy.yaml
```
### Обновление ресурсов
```bash
make k8s manifest update kubernetes https://example.com/deploy.yaml
```
## Работа с Helm
### Добавление Helm репозиториев
Список популярных репозиториев:
```bash
# Официальный Helm репозиторий
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
# Bitnami (большая коллекция чартов)
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
# NGINX Inc
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
# Prometheus Community
make k8s helmrepo add kubernetes prometheus-community https://prometheus-community.github.io/helm-charts
# Istio
make k8s helmrepo add kubernetes istio https://istio-release.storage.googleapis.com/charts
# Информация о репозиториях
make k8s helmrepo list kubernetes
```
### Обновление репозиториев
```bash
make k8s helmrepo update kubernetes
```
### Поиск чартов
```bash
# Просмотр всех чартов в репозитории
make k8s helmrepo packages kubernetes bitnami
# Поиск конкретного чарта
make k8s helmrepo packages kubernetes bitnami | grep nginx
# Поиск в нескольких репозиториях
make k8s helmrepo packages kubernetes bitnami | grep redis
make k8s helmrepo packages kubernetes stable | grep postgresql
```
### Установка Helm чартов
#### Пример 1: Установка Redis
```bash
# Добавить репозиторий
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
# Обновить индекс
make k8s helmrepo update kubernetes
# Установить Redis
make k8s helm apply kubernetes redis bitnami/redis
# Проверить статус
make k8s helm status kubernetes redis
# Посмотреть список релизов
make k8s helm list kubernetes
```
#### Пример 2: Установка PostgreSQL
```bash
make k8s helm apply kubernetes postgres bitnami/postgresql
make k8s helm status kubernetes postgres
```
#### Пример 3: Установка Nginx Ingress через Helm
```bash
# Добавить репозиторий (если еще не добавлен)
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
# Обновить индекс
make k8s helmrepo update kubernetes
# Установить NGINX Ingress
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress-controller
# Проверить
make k8s helm status kubernetes nginx-ingress
```
### Обновление Helm релизов
```bash
# Обновить релиз до последней версии
make k8s helm update kubernetes redis bitnami/redis
# Проверить после обновления
make k8s helm status kubernetes redis
```
### Откат Helm релизов
```bash
# Откатить к предыдущей версии
make k8s helm rollback kubernetes redis
# Проверить статус после отката
make k8s helm status kubernetes redis
```
### Удаление Helm релизов
```bash
# Удалить релиз
make k8s helm delete kubernetes redis
make k8s helm delete kubernetes postgres
```
## Настройка Ingress
### Установка NGINX Ingress Controller
Ingress контроллер обычно устанавливается при создании кластера с пресетом `kubernetes`. Если нужна переустановка:
```bash
# Через манифест
make k8s manifest apply kubernetes \
https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
# Или через Helm
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress-controller
```
### Создание Ingress ресурса
Создайте файл `example-ingress.yaml`:
```yaml
apiVersion: v1
kind: Service
metadata:
name: hello-service
spec:
selector:
app: hello
ports:
- port: 80
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-deployment
spec:
replicas: 2
selector:
matchLabels:
app: hello
template:
metadata:
labels:
app: hello
spec:
containers:
- name: hello
image: hashicorp/http-echo:latest
args:
- "-text=Hello from Kubernetes!"
ports:
- containerPort: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: hello.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: hello-service
port:
number: 80
```
Примените манифест:
```bash
make k8s manifest apply kubernetes ./example-ingress.yaml
```
Проверьте доступность:
```bash
# Добавьте запись в /etc/hosts
echo "127.0.0.1 hello.local" | sudo tee -a /etc/hosts
# Откройте в браузере или проверьте через curl
curl http://hello.local:8081
```
### TLS Ingress
Создайте TLS сертификат и добавьте в Ingress:
```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello-tls-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
tls:
- hosts:
- hello.local
secretName: tls-secret
rules:
- host: hello.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: hello-service
port:
number: 80
```
## Мониторинг и аддоны
### Prometheus Stack
Prometheus Stack устанавливается автоматически при создании кластера с пресетом `kubernetes`.
#### Доступ к Grafana
```bash
# 1. Получите пароль администратора
kubectl --kubeconfig kubeconfig get secret monitoring-grafana \
-n monitoring -o jsonpath="{.data.admin-password}" | base64 -d
# 2. Откройте браузер
# URL: http://localhost:3000
# Username: admin
# Password: [результат из команды выше]
```
#### Доступ к Prometheus
```bash
# URL: http://localhost:9090
# Откройте в браузере для просмотра метрик
```
#### Просмотр метрик
```bash
# Получить список метрик
curl http://localhost:9090/api/v1/label/__name__/values
# Запрос конкретной метрики
curl 'http://localhost:9090/api/v1/query?query=up'
```
### Установка дополнительных инструментов мониторинга
#### Loki для логов
```bash
# Добавить репозиторий Grafana
make k8s helmrepo add kubernetes grafana https://grafana.github.io/helm-charts
# Установить Loki
make k8s helm apply kubernetes loki grafana/loki-stack
# Проверить статус
make k8s helm status kubernetes loki
```
#### Jaeger для трейсинга
```bash
# Добавить репозиторий Jaeger
make k8s helmrepo add kubernetes jaegertracing https://jaegertracing.github.io/helm-charts
# Установить Jaeger
make k8s helm apply kubernetes jaeger jaegertracing/jaeger
# Проверить статус
make k8s helm status kubernetes jaeger
```
## Service Mesh с Istio
### Установка Istio
Istio устанавливается автоматически при создании кластера с пресетом `kubernetes`.
### Ручная установка Istio
```bash
# Добавить репозиторий Istio
make k8s helmrepo add kubernetes istio https://istio-release.storage.googleapis.com/charts
# Установить Istio base
make k8s helm apply kubernetes istio-base istio/base
# Установить Istiod (control plane)
make k8s helm apply kubernetes istiod istio/istiod \
--set values.global.istiod.enableAnalysis=true
# Установить Istio Ingress Gateway
make k8s helm apply kubernetes istio-ingress istio/gateway
```
### Kiali для визуализации Istio
Kiali устанавливается автоматически с пресетом `kubernetes`.
#### Доступ к Kiali
```bash
# URL: http://localhost:20001
# Откройте в браузере для визуализации Service Mesh
# Настройки доступа
# Username: admin
# Password: admin (если используется анонимный доступ)
```
#### Ручная установка Kiali
```bash
# Добавить репозиторий Kiali
make k8s helmrepo add kubernetes kiali https://kiali.org/helm-charts
# Установить Kiali
make k8s helm apply kubernetes kiali-server kiali/kiali-server \
--set auth.strategy=anonymous \
--set deployment.ingress.enabled=true \
--set server.web_root="/"
# Проверить статус
make k8s helm status kubernetes kiali-server
```
### Пример приложения с Istio
Создайте файл `istio-app.yaml`:
```yaml
apiVersion: v1
kind: Namespace
metadata:
name: bookinfo
labels:
istio-injection: enabled
---
apiVersion: v1
kind: Service
metadata:
name: productpage
namespace: bookinfo
spec:
ports:
- port: 9080
name: http
targetPort: 9080
selector:
app: productpage
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: productpage
namespace: bookinfo
spec:
replicas: 1
selector:
matchLabels:
app: productpage
template:
metadata:
labels:
app: productpage
spec:
containers:
- name: productpage
image: istio/examples-bookinfo-productpage-v1:latest
ports:
- containerPort: 9080
```
Примените:
```bash
make k8s manifest apply kubernetes ./istio-app.yaml
```
## Примеры полных развертываний
### Пример 1: WordPress с MySQL
```bash
# 1. Установить MySQL через Helm
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
make k8s helm apply kubernetes mysql bitnami/mysql \
--set auth.rootPassword=secretpassword
# 2. Создать манифест для WordPress
cat > wordpress.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
spec:
replicas: 2
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress
image: wordpress:latest
env:
- name: WORDPRESS_DB_HOST
value: mysql.default.svc.cluster.local
- name: WORDPRESS_DB_USER
value: root
- name: WORDPRESS_DB_PASSWORD
value: secretpassword
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: wordpress
spec:
selector:
app: wordpress
ports:
- port: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: wordpress-ingress
spec:
rules:
- host: wordpress.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: wordpress
port:
number: 80
EOF
# 3. Применить манифест
make k8s manifest apply kubernetes ./wordpress.yaml
```
### Пример 2: Многоуровневое приложение с мониторингом
```bash
# 1. Установить Redis
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
make k8s helm apply kubernetes redis bitnami/redis
# 2. Установить PostgreSQL
make k8s helm apply kubernetes postgres bitnami/postgresql
# 3. Создать приложение
cat > app.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-server
spec:
replicas: 3
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: api
version: v1
spec:
containers:
- name: api
image: nginx:alpine
ports:
- containerPort: 80
env:
- name: REDIS_HOST
value: redis-master.default.svc.cluster.local
- name: POSTGRES_HOST
value: postgresql-postgresql.default.svc.cluster.local
---
apiVersion: v1
kind: Service
metadata:
name: api-service
spec:
selector:
app: api
ports:
- port: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-ingress
spec:
rules:
- host: api.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
EOF
# 4. Применить
make k8s manifest apply kubernetes ./app.yaml
```
### Пример 3: CI/CD с Jenkins в Kubernetes
```bash
# 1. Установить Jenkins
make k8s helmrepo add kubernetes jenkins https://charts.jenkins.io
make k8s helm apply kubernetes jenkins jenkins/jenkins \
--set persistence.enabled=true \
--set controller.installPlugins.enabled=true
# 2. Получить пароль администратора
kubectl --kubeconfig kubeconfig exec \
-n default svc/jenkins -c jenkins -- \
cat /run/secrets/additional/chart-admin-password
```
## Полезные команды и советы
### Мониторинг ресурсов
```bash
# Просмотр использования ресурсов узлами
kubectl --kubeconfig kubeconfig top nodes
# Просмотр использования ресурсов подами
kubectl --kubeconfig kubeconfig top pods
# Детальная информация о узле
kubectl --kubeconfig kubeconfig describe node lab-control-plane
```
### Отладка
```bash
# Просмотр логов пода
kubectl --kubeconfig kubeconfig logs <pod-name>
# Просмотр логов с follow
kubectl --kubeconfig kubeconfig logs -f <pod-name>
# Выполнить команду в поде
kubectl --kubeconfig kubeconfig exec -it <pod-name> -- /bin/sh
# Описание ресурса
kubectl --kubeconfig kubeconfig describe pod <pod-name>
kubectl --kubeconfig kubeconfig describe service <service-name>
```
### Масштабирование
```bash
# Масштабировать Deployment
kubectl --kubeconfig kubeconfig scale deployment <deployment-name> --replicas=5
# Автомасштабирование (требует metrics-server)
kubectl --kubeconfig kubeconfig autoscale deployment <deployment-name> \
--cpu-percent=70 --min=2 --max=10
```
### Экспорт конфигурации
```bash
# Экспортировать ресурс в YAML
kubectl --kubeconfig kubeconfig get deployment <name> -o yaml > exported.yaml
# Экспортировать все ресурсы namespace
kubectl --kubeconfig kubeconfig get all -n <namespace> -o yaml > all-resources.yaml
```
## Безопасность
### Использование Secrets
```bash
# Создать Secret из файла
kubectl --kubeconfig kubeconfig create secret generic my-secret \
--from-file=username=./username.txt \
--from-file=password=./password.txt
# Создать Secret из литерала
kubectl --kubeconfig kubeconfig create secret generic my-secret \
--from-literal=username=admin \
--from-literal=password=secret123
```
### Network Policies
Создайте файл `network-policy.yaml`:
```yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
role: api
ports:
- protocol: TCP
port: 5432
egress:
- to:
- podSelector:
matchLabels:
role: api
ports:
- protocol: TCP
port: 5432
```
Примените:
```bash
make k8s manifest apply kubernetes ./network-policy.yaml
```
## Заключение
DevOpsLab предоставляет полный набор инструментов для работы с Kubernetes кластерами локально. Вы можете:
- Создавать и управлять кластерами
- Устанавливать и настраивать приложения
- Работать с мониторингом и Service Mesh
- Тестировать перед развертыванием в production
Все инструменты работают внутри Docker контейнеров, что обеспечивает изоляцию и переносимость.
## Автор
Сергей Антропов
Сайт: https://devops.org.ru

794
docs/kubernetes-kind.md Normal file
View File

@@ -0,0 +1,794 @@
# Kubernetes Kind Кластеры
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
## Содержание
- [Описание](#описание)
- [Требования к системе](#требования-к-системе)
- [Возможности](#возможности)
- [Быстрый старт](#быстрый-старт)
- [Команды управления](#команды-управления)
- [Работа с Helm](#работа-с-helm)
- [Работа с манифестами](#работа-с-манифестами)
- [Управление Ingress](#управление-ingress)
- [Проброс портов (Port-forward)](#проброс-портов-port-forward)
- [Мониторинг и логи](#мониторинг-и-логи)
- [Конфигурация](#конфигурация)
- [Архитектура](#архитектура)
- [Доступ к приложениям](#доступ-к-приложениям)
- [Кроссплатформенность](#кроссплатформенность)
- [Подробная документация по скриптам](#подробная-документация-по-скриптам)
- [Best Practices](#best-practices)
- [Troubleshooting](#troubleshooting)
---
## Описание
Проект поддерживает автоматическое создание и управление Kubernetes кластерами на базе [Kind](https://kind.sigs.k8s.io/) для тестирования в изолированной лабораторной среде.
Kind позволяет создавать локальные Kubernetes кластеры внутри Docker контейнеров, что идеально подходит для разработки и тестирования без необходимости устанавливать полный Kubernetes.
## Требования к системе
### Обязательные требования
1. **Docker** - для запуска Kind кластеров
2. **Python 3** - для управления port-forward
3. **kubectl** - для работы с кластером
**Установка на macOS:**
```bash
brew install docker python3 kubectl
```
**Установка на Ubuntu/Debian:**
```bash
sudo apt update && sudo apt install -y docker.io python3 python3-pip kubectl
```
**Установка на CentOS/RHEL:**
```bash
sudo yum install -y docker python3 python3-pip kubectl
sudo systemctl start docker
sudo systemctl enable docker
```
### Проверка установки
```bash
docker --version
python3 --version
kubectl version --client
```
### Docker группы
На Linux добавьте пользователя в группу docker:
```bash
sudo usermod -aG docker $USER
# Выйдите и войдите заново
```
---
## Возможности
- ✅ Создание Kind кластеров с настраиваемым количеством worker-узлов
- ✅ Автоматическая установка аддонов (Ingress NGINX, Metrics Server, Istio, Kiali, Prometheus Stack)
-**Автоматический port-forward** для доступа к сервисам
- ✅ Работа с Helm (установка, удаление, обновление, rollback)
- ✅ Работа с Kubernetes манифестами
- ✅ Управление Helm репозиториями
- ✅ Автоматическое управление `/etc/hosts` для Ingress
- ✅ Управление Docker контейнерами в лабораторной сети
- ✅ Интеграция с Istio Service Mesh
- ✅ Детальный отчет о состоянии кластера
---
## Быстрый старт
### 1. Создание кластера
```bash
# Создание кластера с полным набором аддонов
make k8s create kubernetes
```
### 2. Проверка статуса
```bash
# Детальный отчет о кластере
make k8s status kubernetes
```
### 3. Доступ к аддонам
После создания кластера автоматически создаются port-forward:
- Grafana: http://localhost:3000
- Prometheus: http://localhost:9090
- Kiali: http://localhost:20001
### 4. Удаление кластера
```bash
make k8s destroy kubernetes
```
---
## Команды управления
### Создание кластера
```bash
# Минимальный кластер (без аддонов)
make k8s create
# Полный кластер с аддонами
make k8s create kubernetes
# Пользовательский пресет
make k8s create my-custom-preset
```
**Что происходит:**
1. Создается контейнер `k8s-controller` с инструментами (Kind, kubectl, Helm, Istio CLI)
2. Создаются Docker контейнеры из раздела `hosts` (если есть)
3. Создается Kind кластер
4. Устанавливаются аддоны
5. Создается автоматический port-forward
6. Добавляются записи в `/etc/hosts` для Ingress
### Управление жизненным циклом
```bash
# Удаление кластера (с очисткой port-forward и /etc/hosts)
make k8s destroy [preset]
# Остановка кластера (без удаления)
make k8s stop [preset]
# Запуск остановленного кластера
make k8s start [preset]
# Детальный отчет о состоянии
make k8s status [preset]
# Показать узлы кластера
make k8s nodes [preset]
```
### Получение kubeconfig
```bash
# Сохранить kubeconfig для подключения
make k8s config [preset]
# Использовать конфиг
export KUBECONFIG=kubeconfig
kubectl get nodes
```
### Shell доступ
```bash
# Открыть shell в контейнере k8s-controller
make k8s shell [preset]
```
---
## Работа с Helm
Helm - это менеджер пакетов для Kubernetes.
### Управление релизами
```bash
# Установить чарт
make k8s helm apply kubernetes nginx stable/nginx-ingress
# Обновить релиз
make k8s helm update kubernetes nginx stable/nginx-ingress
# Откатить релиз
make k8s helm rollback kubernetes nginx
# Посмотреть статус релиза
make k8s helm status kubernetes nginx
# Удалить релиз
make k8s helm delete kubernetes nginx
# Список всех релизов
make k8s helm list kubernetes
```
### Управление репозиториями
```bash
# Добавить репозиторий
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
# Обновить репозиторий
make k8s helmrepo update kubernetes stable
# Список репозиториев
make k8s helmrepo list kubernetes
# Показать доступные чарты
make k8s helmrepo packages kubernetes stable
# Удалить репозиторий
make k8s helmrepo delete kubernetes stable
```
### Пример: установка MySQL
```bash
# Добавить репозиторий Bitnami
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
# Установить MySQL
make k8s helm apply kubernetes mysql bitnami/mysql
# Проверить статус
make k8s helm status kubernetes mysql
```
---
## Работа с манифестами
Применение обычных Kubernetes манифестов (без Helm).
```bash
# Применить манифест из URL
make k8s manifest apply kubernetes https://example.com/deploy.yaml
# Применить манифест из файла
make k8s manifest apply kubernetes /path/to/manifest.yaml
# Удалить манифест
make k8s manifest delete kubernetes https://example.com/deploy.yaml
```
### Пример: создание Deployment
```yaml
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
```
```bash
# Применить
make k8s manifest apply kubernetes ./nginx-deployment.yaml
```
---
## Управление Ingress
### Доступ к приложениям через Ingress
Для доступа к приложениям по доменным именам нужно вручную добавить записи в `/etc/hosts`:
```bash
# Добавить запись в /etc/hosts
echo "127.0.0.1 grafana.local #k8s" | sudo tee -a /etc/hosts
# Очистить DNS кеш macOS
sudo killall -HUP mDNSResponder
```
После этого приложение будет доступно по адресу:
```
http://grafana.local:8081
```
**Пример манифеста Ingress:**
```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: grafana-ingress
namespace: monitoring
spec:
rules:
- host: grafana.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: monitoring-grafana
port:
number: 80
```
**Важно:**
- Записи в `/etc/hosts` нужно добавлять вручную
- Используйте порт 8081 для HTTP и 8443 для HTTPS
- Для удаления записей используйте sudo
---
## Проброс портов (Port-forward)
Port-forward позволяет получить доступ к ClusterIP сервисам извне кластера.
### Автоматический port-forward
После создания кластера автоматически создаются порты:
- Ingress HTTP: `8081:80`
- Ingress HTTPS: `8443:443`
- Grafana: `3000:80`
- Prometheus: `9090:9090`
- Kiali: `20001:20001`
### Управление вручную
```bash
# Создать port-forward
make k8s portforward create
# Список активных портов
make k8s portforward list
# Удалить конкретный порт
make k8s portforward delete 3000
# Очистить все порты
make k8s portforward clear
# Пересоздать порты
make k8s portforward recreate
```
### Ручной port-forward для своих сервисов
```bash
# Подключиться к кластеру
export KUBECONFIG=$(docker exec k8s-controller cat /root/.kube/config)
# Создать port-forward
kubectl port-forward -n default svc/my-service 8080:80
```
---
## Мониторинг и логи
### Детальный статус кластера
```bash
make k8s status kubernetes
```
Показывает:
- Узлы кластера
- Namespaces
- Pods
- Services
- Ingress
- Deployments
- DaemonSets
- StatefulSets
- PVC
- События
- Helm релизы
- Использование ресурсов
### Доступ к аддонам
**Grafana:**
```
URL: http://localhost:3000
Login: admin
Password: admin
```
**Prometheus:**
```
URL: http://localhost:9090
```
**Kiali:**
```
URL: http://localhost:20001
Login: admin
Password: admin
```
### Логи контейнера
```bash
# Логи k8s-controller
docker logs k8s-controller
# Логи в реальном времени
docker logs -f k8s-controller
```
### Логи кластера
```bash
# Логи конкретного pod
make k8s shell kubernetes
kubectl logs -n monitoring <pod-name>
# Все логи в namespace
kubectl logs -n monitoring --all-containers=true --tail=100
```
---
## Конфигурация
### Пресеты
Пресеты находятся в `molecule/presets/k8s/`:
**kubernetes.yml** - полный набор аддонов:
- Ingress NGINX
- Metrics Server
- Istio
- Kiali
- Prometheus + Grafana
### Структура пресета
```yaml
k8s_cluster:
name: lab
nodes: 1
addons:
ingress: true
metrics_server: true
istio: true
kiali: true
prometheus_stack: true
addon_ports:
ingress_http: 8081
ingress_https: 8443
prometheus: 9090
grafana: 3000
kiali: 20001
metrics_server: 4443
hosts:
- name: test1
image: centos8
systemd_defaults:
container: true
images:
centos8:
name: inecs/ansible-lab:centos8-latest
```
### Пользовательский пресет
Создайте файл `molecule/presets/k8s/my-preset.yml`:
```yaml
k8s_cluster:
name: my-cluster
nodes: 2
addons:
ingress: true
metrics_server: false
istio: false
kiali: false
prometheus_stack: false
```
Использование:
```bash
make k8s create my-preset
```
---
## Архитектура
```
┌─────────────────────────────────────────────────────┐
│ Локальная машина │
│ │
│ ┌──────────────────────────────────────────────┐ │
│ │ Makefile → Python скрипты → Docker API │ │
│ │ kubectl (port-forward) │ │
│ └──────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ Docker: k8s-controller │
│ ┌──────────────────────────────────────────────┐ │
│ │ kind, kubectl, helm, istioctl │ │
│ └──────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ Docker сеть: kind │
│ ┌──────────────────────────────────────────────┐ │
│ │ Kind Kubernetes Cluster │ │
│ │ • Control Plane (6443) │ │
│ │ • Worker Nodes │ │
│ │ • Services (ClusterIP) │ │
│ │ • Ingress Controller │ │
│ │ • Istio Service Mesh │ │
│ └──────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
```
### Компоненты
1. **k8s-controller** - контейнер с инструментами управления
2. **Kind кластер** - Kubernetes кластер в Docker контейнерах
3. **Port-forward** - локальные процессы на хосте
4. **Ingress** - маршрутизация трафика внутрь кластера
---
## Доступ к приложениям
### Доступ через Ingress
1. Создайте Ingress манифест
2. Примените через `make k8s manifest apply`
3. Запись автоматически добавится в `/etc/hosts`
4. Приложение доступно по доменному имени
### Доступ через port-forward
Для ClusterIP сервисов:
```bash
kubectl port-forward -n namespace svc/service-name 8080:80
```
Доступ: http://localhost:8080
### Доступ внутри кластера
Из другого pod:
```bash
kubectl exec -it pod-name -- curl http://service-name.namespace:80
```
---
## Кроссплатформенность
### Поддерживаемые платформы
- **macOS (Intel & Apple Silicon)** - полная поддержка
- **Linux (amd64 & arm64)** - полная поддержка
- **Windows** - через WSL2
### Проблемы на разных платформах
**Apple Silicon (M1/M2):**
- Используется ARM64 образы
- Автоматическое определение архитектуры
**Linux:**
- Требуются права на Docker socket
- Возможны проблемы с selinux
---
## Подробная документация по скриптам
Для подробного описания работы всех скриптов управления Kubernetes смотрите:
📖 [Документация по скриптам Kubernetes](k8s-scripts.md)
Включает:
- Описание каждого скрипта
- Принцип работы
- Примеры использования
- Архитектура взаимодействия
- Отладка
---
## Best Practices
### 1. Используйте пресеты
Не создавайте кластеры вручную, используйте пресеты для консистентности.
### 2. Очищайте после работы
```bash
# После тестирования
make k8s destroy kubernetes
```
### 3. Проверяйте статус
```bash
# Регулярно проверяйте статус
make k8s status kubernetes
```
### 4. Используйте Helm для сложных приложений
Для многослойных приложений лучше использовать Helm вместо сырых манифестов.
### 5. Логируйте изменения
Все изменения в кластере через `make k8s` автоматически логируются.
---
## Troubleshooting
### Кластер не создается
**Проблема:** `kind create cluster` завершается с ошибкой
**Решение:**
```bash
# Проверьте Docker
docker ps
# Перезапустите Docker
sudo systemctl restart docker
# Очистите старые кластеры
kind delete cluster --all
```
### Port-forward не работает
**Проблема:** Невозможно подключиться к порту
**Решение:**
```bash
# Проверьте процессы
make k8s portforward list
# Пересоздайте порты
make k8s portforward recreate
# Проверьте, что порт свободен
lsof -i :3000
```
### kubectl не подключается
**Проблема:** `kubectl get nodes` выдает ошибку
**Решение:**
```bash
# Проверьте контейнер
docker ps | grep k8s-controller
# Зайдите в контейнер
make k8s shell kubernetes
# Проверьте кластер
kubectl get nodes
# Если не работает, пересоздайте кластер
make k8s destroy kubernetes
make k8s create kubernetes
```
### Аддоны не устанавливаются
**Проблема:** Grafana/Prometheus/Kiali не доступны
**Решение:**
```bash
# Проверьте статус кластера
make k8s status kubernetes
# Проверьте pods
make k8s shell kubernetes
kubectl get pods -n monitoring
kubectl logs -n monitoring <pod-name>
# Пересоздайте кластер
make k8s destroy kubernetes
make k8s create kubernetes
```
### Ingress не работает
**Проблема:** Доменные имена не резолвятся
**Решение:**
```bash
# Проверьте Ingress
make k8s shell kubernetes
kubectl get ingress --all-namespaces
# Добавьте запись в /etc/hosts вручную
echo "127.0.0.1 grafana.local #k8s" | sudo tee -a /etc/hosts
# Очистите DNS кеш
sudo killall -HUP mDNSResponder
# Проверьте доступность
curl http://grafana.local:8081
```
### Helm чарты не устанавливаются
**Проблема:** `helm install` завершается с ошибкой
**Решение:**
```bash
# Проверьте репозитории
make k8s helmrepo list kubernetes
# Обновите репозитории
make k8s helmrepo update kubernetes stable
# Проверьте логи
make k8s shell kubernetes
kubectl logs -l app=<release-name>
```
### Контейнер k8s-controller не запускается
**Проблема:** `docker: Error response from daemon: ...`
**Решение:**
```bash
# Проверьте образ
docker images | grep k8s
# Пересоберите образ
make docker build-image IMAGE=k8s-amd64
make docker build-image IMAGE=k8s-arm64
# Проверьте Docker
docker system prune -f
```
---
## Контакты
- **Автор:** Сергей Антропов
- **Сайт:** https://devops.org.ru
- **GitHub:** https://github.com/your-repo
---
## Лицензия
MIT

View File

@@ -6,7 +6,7 @@
## Обзор
Линтинг ролей - это автоматическая проверка синтаксиса, стиля и соответствия лучшим практикам Ansible. В AnsibleTemplate используется `ansible-lint` для обеспечения качества кода.
Линтинг ролей - это автоматическая проверка синтаксиса, стиля и соответствия лучшим практикам Ansible. В DevOpsLab используется `ansible-lint` для обеспечения качества кода.
## Команды линтинга

View File

@@ -5,7 +5,7 @@
## 📋 Обзор
Molecule - это инструмент для тестирования Ansible ролей в изолированных окружениях. В проекте AnsibleLab используется универсальная конфигурация Molecule с поддержкой множества операционных систем и различных preset'ов для тестирования.
Molecule - это инструмент для тестирования Ansible ролей в изолированных окружениях. В проекте DevOpsLab используется универсальная конфигурация Molecule с поддержкой множества операционных систем и различных preset'ов для тестирования.
### 🔧 Fallback значения
@@ -26,7 +26,7 @@ molecule/
│ ├── converge.yml # Выполнение ролей в контейнерах
│ ├── verify.yml # Проверка результатов тестирования
│ ├── destroy.yml # Удаление тестовых контейнеров
│ └── site.yml # Основной playbook для тестирования
│ └── run.yml # Основной playbook для обновления контейнеров
└── presets/ # Preset конфигурации для разных сценариев
├── minimal.yml # Минимальный preset (1 хост)
├── performance.yml # Performance preset (12 хостов)
@@ -64,7 +64,7 @@ platforms:
```
- **Назначение:** Определяет доступные Docker образы для тестирования
- **Поддерживаемые ОС:** Ubuntu, Debian, RHEL, CentOS, AlmaLinux, Rocky Linux, Alt Linux, Astra Linux, RedOS
- **Собственные образы:** AnsibleLab создает собственные образы для тестирования
- **Собственные образы:** DevOpsLab создает собственные образы для тестирования
**Provisioner (Провижнер):**
```yaml
@@ -131,7 +131,7 @@ vars:
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
images:
alt: "inecs/ansible-lab:alt-linux-latest"
alt: "inecs/ansible-lab:alt9-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos: "inecs/ansible-lab:centos-latest"
@@ -154,7 +154,7 @@ vars:
```
- **Назначение:** Определение fallback значений для случаев когда preset файл не найден
- **Функция:** Обеспечение работоспособности даже без preset файлов
- **Образы:** Собственные образы AnsibleLab для всех поддерживаемых ОС
- **Образы:** Собственные образы DevOpsLab для всех поддерживаемых ОС
- **Systemd настройки:** Стандартные настройки для systemd контейнеров
#### Основные задачи:
@@ -392,12 +392,12 @@ vars:
command: >
bash -lc "
ANSIBLE_ROLES_PATH=/workspace/roles
ansible-playbook -i {{ lookup('env','MOLECULE_EPHEMERAL_DIRECTORY') }}/inventory/hosts.ini /workspace/molecule/default/site.yml
ansible-playbook -i {{ lookup('env','MOLECULE_EPHEMERAL_DIRECTORY') }}/inventory/hosts.ini /workspace/molecule/default/run.yml
"
```
- **Назначение:** Выполнение основного playbook'а
- **Функции:**
- Запуск `site.yml` в ansible-controller контейнере
- Запуск `run.yml` в ansible-controller контейнере
- Использование сгенерированного инвентори
- Установка пути к ролям
@@ -602,7 +602,7 @@ vars:
- **Назначение:** Отображение сводки по очистке
- **Функция:** Информация о удаленных ресурсах
### 6. `molecule/default/site.yml` - Основной playbook
### 6. `molecule/default/run.yml` - Основной playbook
**Назначение:** Основной playbook для тестирования ролей.

View File

@@ -1,7 +1,8 @@
# Мониторинг и диагностика AnsibleLab
# Мониторинг и диагностика DevOpsLab
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 3.0.0
## 🔍 Диагностика Docker
@@ -14,31 +15,37 @@ docker info
# Проверка запущенных контейнеров
docker ps -a
# Проверка образов
# Проверка образов DevOpsLab
docker images | grep inecs/ansible-lab
# Проверка сетей
docker network ls
docker network ls | grep labnet
```
### Диагностика buildx проблем
```bash
# Диагностика buildx
# Полная диагностика buildx
make docker diagnose
# Проверка builder'а
make docker setup-builder
make docker check-builder
# Сброс builder'а при проблемах
make docker reset-builder
# Настройка builder'а
make docker setup-builder
```
### Логи Docker
```bash
# Логи Docker daemon
sudo journalctl -u docker.service
# Логи Docker daemon (Linux)
sudo journalctl -u docker.service -f
# Логи Docker (macOS)
tail -f ~/Library/Containers/com.docker.docker/Data/log/vm/dockerd.log
# Логи конкретного контейнера
docker logs ansible-controller
@@ -48,6 +55,9 @@ docker logs -t ansible-controller
# Следить за логами в реальном времени
docker logs -f ansible-controller
# Последние 100 строк логов
docker logs --tail 100 ansible-controller
```
## 🧪 Диагностика тестирования
@@ -63,76 +73,91 @@ make presets info PRESET=default
# Проверка файлов preset'ов
ls -la molecule/presets/
# Проверка всех preset'ов
find molecule/presets -name "*.yml" -exec echo "=== {} ===" \; -exec cat {} \;
```
### Проверка инвентори
```bash
# Проверка тестового инвентори
cat ${MOLECULE_EPHEMERAL_DIRECTORY}/inventory/hosts.ini
# Проверка продакшн инвентори
cat inventory/hosts.ini
# Тестирование подключения
ansible all -i inventory/hosts.ini -m ping
# Проверка доступности хостов
ansible all -i inventory/hosts.ini -m shell -a "uname -a"
```
### Логи тестирования
```bash
# Логи Molecule
ls -la molecule/default/.molecule/
# Проверка созданных контейнеров
docker ps -a --filter "network=labnet"
# Логи конкретного теста
cat molecule/default/.molecule/test/ansible.log
# Логи всех контейнеров Molecule
docker ps -a --filter "network=labnet" --format "{{.Names}}" | while read name; do
echo "=== $name ==="
docker logs $name 2>&1 | tail -20
done
# Логи Ansible
cat molecule/default/.molecule/test/ansible.log | grep ERROR
# Очистка контейнеров Molecule
make clean-containers
```
## 📊 Мониторинг производительности
## 📊 Мониторинг ресурсов
### Мониторинг ресурсов
### Мониторинг Docker
```bash
# Использование CPU и памяти
docker stats
# Статистика использования ресурсов контейнерами
docker stats --no-stream
# Использование диска Docker
docker system df
# Детальная информация о диске
docker system df -v
# Очистка неиспользуемых ресурсов
docker system prune -a
```
### Мониторинг системы
```bash
# Использование диска
df -h
# Использование памяти
free -h
free -h # Linux
vm_stat # macOS
# Процессы Docker
ps aux | grep docker
# CPU и память в реальном времени
top
# или
htop
```
### Мониторинг сети
```bash
# Статистика сети
# Инспекция сети labnet
docker network inspect labnet
# Подключения к портам
# Статистика сети
docker network inspect labnet --format '{{json .Containers}}' | jq
# Просмотр портов
netstat -tulpn | grep docker
# Проверка DNS
nslookup docker.io
```
### Мониторинг логов
```bash
# Логи системы
sudo journalctl -f
# Логи Docker
sudo journalctl -u docker.service -f
# Логи Ansible
tail -f /var/log/ansible.log
# Просмотр установленных соединений
ss -tulpn | grep docker
```
## 🔧 Диагностика ролей
@@ -144,447 +169,253 @@ tail -f /var/log/ansible.log
make role lint
# Lint проверка конкретной роли
ansible-lint roles/my-role/
make role lint docker
make role lint devops
make role lint ping
# Проверка синтаксиса YAML
ansible-playbook --syntax-check roles/my-role/tasks/main.yml
# Проверка синтаксиса файлов роли
ansible-playbook --syntax-check roles/docker/tasks/main.yml
```
### Проверка переменных
```bash
# Проверка переменных роли
# Просмотр всех переменных для хоста
ansible-inventory --list -i inventory/hosts.ini
# Проверка переменных для конкретного хоста
# Проверка переменных конкретного хоста
ansible-inventory --host web1.example.com -i inventory/hosts.ini
# Проверка переменных группы
ansible-inventory --host web_servers -i inventory/hosts.ini
# Просмотр всех групп
ansible-inventory --list | jq 'keys'
```
### Тестирование ролей
```bash
# Тестирование с verbose выводом
ansible-playbook -i inventory/hosts.ini site.yml -vvv
# Тестирование с подробным выводом
make role test 2>&1 | tee test-output.log
# Тестирование конкретной роли
ansible-playbook -i inventory/hosts.ini site.yml --tags my-role
make role test docker
# Тестирование с dry-run
ansible-playbook -i inventory/hosts.ini site.yml --check
# Тестирование с minimal preset
make role test minimal
# Просмотр результатов теста
docker logs $(docker ps -aq --filter "network=labnet" | head -1)
```
## 🚨 Алерты и уведомления
## 🚨 Решение проблем
### Настройка алертов
### Проблемы с Docker
#### Docker не запускается
```bash
#!/bin/bash
# scripts/monitor.sh
# Скрипт мониторинга AnsibleLab
# Проверка Docker
if ! docker info >/dev/null 2>&1; then
echo "❌ Docker не запущен"
# Отправка уведомления
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"❌ Docker не запущен в AnsibleLab"}' \
$SLACK_WEBHOOK_URL
fi
# Проверка образов
if ! docker images | grep -q inecs/ansible-lab; then
echo "❌ Образы AnsibleLab не найдены"
# Отправка уведомления
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"❌ Образы AnsibleLab не найдены"}' \
$SLACK_WEBHOOK_URL
fi
# Проверка preset'ов
if [ ! -d "molecule/presets" ]; then
echo "❌ Директория preset'ов не найдена"
# Отправка уведомления
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"❌ Директория preset'ов не найдена"}' \
$SLACK_WEBHOOK_URL
fi
echo "✅ Мониторинг завершен"
```
### Настройка cron для мониторинга
```bash
# Добавление в crontab
crontab -e
# Проверка каждые 5 минут
*/5 * * * * /path/to/scripts/monitor.sh
# Проверка каждый час
0 * * * * /path/to/scripts/monitor.sh
# Проверка каждый день в 9:00
0 9 * * * /path/to/scripts/monitor.sh
```
## 📈 Метрики и отчеты
### Сбор метрик
```bash
#!/bin/bash
# scripts/collect-metrics.sh
# Сбор метрик AnsibleLab
echo "📊 Сбор метрик AnsibleLab..."
# Создание директории для метрик
mkdir -p metrics
# Метрики Docker
echo "=== Docker Metrics ===" > metrics/docker.txt
docker info >> metrics/docker.txt
docker images >> metrics/docker.txt
docker ps -a >> metrics/docker.txt
# Метрики системы
echo "=== System Metrics ===" > metrics/system.txt
df -h >> metrics/system.txt
free -h >> metrics/system.txt
uptime >> metrics/system.txt
# Метрики Ansible
echo "=== Ansible Metrics ===" > metrics/ansible.txt
ansible --version >> metrics/ansible.txt
ansible-galaxy list >> metrics/ansible.txt
# Метрики ролей
echo "=== Roles Metrics ===" > metrics/roles.txt
find roles/ -name "main.yml" -path "*/tasks/*" | wc -l >> metrics/roles.txt
ls -la roles/ >> metrics/roles.txt
echo "✅ Метрики собраны"
```
### Генерация отчетов
```bash
#!/bin/bash
# scripts/generate-report.sh
# Генерация отчета о состоянии AnsibleLab
echo "📋 Генерация отчета..."
# Создание директории для отчетов
mkdir -p reports
# Отчет о Docker
cat > reports/docker-report.md << EOF
# Docker Report
## Образы
\`\`\`
$(docker images | grep inecs/ansible-lab)
\`\`\`
## Контейнеры
\`\`\`
$(docker ps -a)
\`\`\`
## Сети
\`\`\`
$(docker network ls)
\`\`\`
EOF
# Отчет о ролях
cat > reports/roles-report.md << EOF
# Roles Report
## Количество ролей
$(find roles/ -name "main.yml" -path "*/tasks/*" | wc -l)
## Список ролей
\`\`\`
$(find roles/ -name "main.yml" -path "*/tasks/*" | sed 's|roles/||; s|/tasks/main.yml||')
\`\`\`
EOF
# Отчет о preset'ах
cat > reports/presets-report.md << EOF
# Presets Report
## Количество preset'ов
$(ls -1 molecule/presets/*.yml | wc -l)
## Список preset'ов
\`\`\`
$(ls -1 molecule/presets/*.yml | sed 's|molecule/presets/||g' | sed 's|\.yml||g')
\`\`\`
EOF
echo "✅ Отчеты сгенерированы"
```
## 🔍 Отладка проблем
### Общие проблемы
#### 1. Docker не запускается
```bash
# Проверка статуса Docker
# Проверка статуса (Linux)
sudo systemctl status docker
# Запуск Docker
# Запуск Docker (Linux)
sudo systemctl start docker
# Проверка логов
sudo journalctl -u docker.service
# Проверка логов (Linux)
sudo journalctl -u docker.service -f
# Перезапуск Docker Desktop (macOS/Windows)
# Use Docker Desktop interface
```
#### 2. Образы не собираются
#### Buildx зависает
```bash
# Проверка builder'а
# Диагностика
make docker diagnose
# Сброс builder'а
make docker reset-builder
# Очистка кеша
make docker clean
# Очистка контейнеров buildkit
docker ps -a --filter "name=buildx_buildkit" --format "{{.Names}}" | xargs -r docker rm -f
```
#### 3. Тесты не проходят
#### Образы не собираются
```bash
# Проверка preset'ов
make presets list
# Очистка builder'а
make docker clean-builder
# Проверка инвентори
cat ${MOLECULE_EPHEMERAL_DIRECTORY}/inventory/hosts.ini
# Пересоздание builder'а
make docker setup-builder
# Проверка логов
docker logs ansible-controller
# Полная пересборка
make docker rebuild
```
#### 4. Роли не работают
### Проблемы с тестированием
#### Preset'ы не работают
```bash
# Проверка preset файлов
ls -la molecule/presets/
# Проверка синтаксиса preset'а
yamllint molecule/presets/default.yml
# Информация о preset'е
make presets info PRESET=default
```
#### Контейнеры не запускаются
```bash
# Проверка созданных контейнеров
docker ps -a --filter "network=labnet"
# Логи контейнера
docker logs <container-name>
# Перезапуск контейнера
docker restart <container-name>
# Удаление всех контейнеров Molecule
make clean-containers
```
#### Роли не выполняются
```bash
# Проверка синтаксиса
make role lint
# Тест с verbose выводом
ansible-playbook -i inventory/hosts.ini run.yml -vvv
# Проверка переменных
ansible-inventory --list -i inventory/hosts.ini
# Тестирование с verbose
ansible-playbook -i inventory/hosts.ini site.yml -vvv
# Dry-run без выполнения
ansible-playbook -i inventory/hosts.ini run.yml --check
```
### Логи для отладки
### Проблемы с ролями
#### Синтаксические ошибки
```bash
# Сбор всех логов
# Lint проверка
make role lint
# Проверка конкретной роли
ansible-lint roles/docker/
# Проверка YAML синтаксиса
yamllint roles/docker/tasks/main.yml
```
#### Логика не работает
```bash
# Проверка переменных
ansible-playbook -i inventory/hosts.ini run.yml --list-tags
ansible-playbook -i inventory/hosts.ini run.yml --list-tasks
# Выполнение конкретной задачи
ansible-playbook -i inventory/hosts.ini run.yml --tags docker
# Debug режим
ansible-playbook -i inventory/hosts.ini run.yml -vvv
```
## 📈 Сбор диагностической информации
### Скрипт диагностики
```bash
#!/bin/bash
# Создание отчета для диагностики
echo "🔍 Сбор диагностической информации..."
# Создание директории для логов
mkdir -p debug-logs
# Логи Docker
docker info > debug-logs/docker-info.txt
docker images > debug-logs/docker-images.txt
docker ps -a > debug-logs/docker-containers.txt
# Docker информация
docker info > debug-logs/docker-info.txt 2>&1
docker images > debug-logs/docker-images.txt 2>&1
docker ps -a > debug-logs/docker-containers.txt 2>&1
docker network ls > debug-logs/docker-networks.txt 2>&1
# Логи системы
df -h > debug-logs/disk-usage.txt
free -h > debug-logs/memory-usage.txt
ps aux > debug-logs/processes.txt
# Системная информация
df -h > debug-logs/disk-usage.txt 2>&1
free -h > debug-logs/memory-usage.txt 2>&1 2>/dev/null || vm_stat > debug-logs/memory-usage.txt 2>&1
ps aux | grep docker > debug-logs/docker-processes.txt 2>&1
# Логи Ansible
ansible --version > debug-logs/ansible-version.txt
ansible-galaxy list > debug-logs/ansible-galaxy.txt
# Информация о проекте
ls -la roles/ > debug-logs/roles-list.txt 2>&1
ls -la molecule/presets/ > debug-logs/presets-list.txt 2>&1
cat inventory/hosts.ini > debug-logs/inventory.txt 2>&1
# Логи ролей
find roles/ -name "*.yml" -exec ansible-playbook --syntax-check {} \; > debug-logs/roles-syntax.txt
# Создание архива
tar -czf debug-logs-$(date +%Y%m%d-%H%M%S).tar.gz debug-logs/
echo "✅ Диагностическая информация собрана в: debug-logs-$(date +%Y%m%d-%H%M%S).tar.gz"
```
## 📊 Дашборд мониторинга
### Простой дашборд
### Команды для быстрой диагностики
```bash
#!/bin/bash
# scripts/dashboard.sh
# Простой дашборд мониторинга
echo "📊 AnsibleLab Dashboard"
echo "=========================="
# Статус Docker
if docker info >/dev/null 2>&1; then
echo "✅ Docker: Запущен"
else
echo "❌ Docker: Не запущен"
fi
# Количество образов
IMAGES=$(docker images | grep inecs/ansible-lab | wc -l)
echo "📦 Образы: $IMAGES"
# Количество ролей
ROLES=$(find roles/ -name "main.yml" -path "*/tasks/*" | wc -l)
echo "🎭 Роли: $ROLES"
# Количество preset'ов
PRESETS=$(ls -1 molecule/presets/*.yml 2>/dev/null | wc -l)
echo "⚙️ Preset'ы: $PRESETS"
# Использование диска
DISK=$(df -h . | tail -1 | awk '{print $5}')
echo "💾 Диск: $DISK"
# Использование памяти
MEMORY=$(free -h | grep Mem | awk '{print $3 "/" $2}')
echo "🧠 Память: $MEMORY"
echo "=========================="
# Быстрая проверка состояния
echo "=== Docker Status ===" && docker info | head -5
echo "=== DevOpsLab Images ===" && docker images | grep inecs/ansible-lab
echo "=== Roles ===" && ls -1 roles/ | grep -v "\.yml"
echo "=== Presets ===" && ls -1 molecule/presets/*.yml 2>/dev/null | wc -l
echo "=== Disk Usage ===" && df -h . | tail -1
```
### Веб-дашборд
## 🔧 Полезные команды
```html
<!DOCTYPE html>
<html>
<head>
<title>AnsibleLab Dashboard</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
.status { padding: 10px; margin: 10px 0; border-radius: 5px; }
.success { background-color: #d4edda; color: #155724; }
.error { background-color: #f8d7da; color: #721c24; }
.info { background-color: #d1ecf1; color: #0c5460; }
</style>
</head>
<body>
<h1>📊 AnsibleLab Dashboard</h1>
<div id="status"></div>
<script>
function updateStatus() {
fetch('/api/status')
.then(response => response.json())
.then(data => {
const statusDiv = document.getElementById('status');
statusDiv.innerHTML = `
<div class="status ${data.docker ? 'success' : 'error'}">
Docker: ${data.docker ? '✅ Запущен' : '❌ Не запущен'}
</div>
<div class="status info">
Образы: ${data.images}
</div>
<div class="status info">
Роли: ${data.roles}
</div>
<div class="status info">
Preset'ы: ${data.presets}
</div>
`;
})
.catch(error => {
console.error('Error:', error);
});
}
// Обновление каждые 30 секунд
setInterval(updateStatus, 30000);
updateStatus();
</script>
</body>
</html>
```
## 🔧 Автоматизация мониторинга
### Настройка мониторинга
### Очистка
```bash
#!/bin/bash
# scripts/setup-monitoring.sh
# Настройка мониторинга AnsibleLab
# Очистка контейнеров Molecule
make clean-containers
echo "🔧 Настройка мониторинга..."
# Очистка Docker образов DevOpsLab
make docker clean
# Создание директорий
mkdir -p {scripts,metrics,reports,debug-logs}
# Очистка всего Docker
make docker purge
# Создание скрипта мониторинга
cat > scripts/monitor.sh << 'EOF'
#!/bin/bash
# Скрипт мониторинга AnsibleLab
# Очистка buildx
make docker clean-builder
```
# Проверка Docker
if ! docker info >/dev/null 2>&1; then
echo "❌ Docker не запущен"
exit 1
fi
### Проверка
# Проверка образов
if ! docker images | grep -q inecs/ansible-lab; then
echo "❌ Образы AnsibleLab не найдены"
exit 1
fi
```bash
# Проверка наличия образов
make custom-images check
echo "✅ Мониторинг завершен"
EOF
# Проверка builder'а
make docker check-builder
# Создание скрипта сбора метрик
cat > scripts/collect-metrics.sh << 'EOF'
#!/bin/bash
# Сбор метрик AnsibleLab
# Информация об образах
make docker info
```
echo "📊 Сбор метрик..."
### Тестирование
# Метрики Docker
docker info > metrics/docker-info.txt
docker images > metrics/docker-images.txt
```bash
# Быстрый тест
make role test minimal
# Метрики системы
df -h > metrics/disk-usage.txt
free -h > metrics/memory-usage.txt
# Полный тест
make role test all-images
echo "✅ Метрики собраны"
EOF
# Создание скрипта генерации отчетов
cat > scripts/generate-report.sh << 'EOF'
#!/bin/bash
# Генерация отчета о состоянии AnsibleLab
echo "📋 Генерация отчета..."
# Отчет о Docker
cat > reports/docker-report.md << EOL
# Docker Report
## Образы
\`\`\`
$(docker images | grep inecs/ansible-lab)
\`\`\`
EOL
echo "✅ Отчеты сгенерированы"
EOF
# Делаем скрипты исполняемыми
chmod +x scripts/*.sh
echo "✅ Мониторинг настроен"
# Тест с конкретным preset'ом
make role test docker-full
```
---

View File

@@ -1,12 +1,12 @@
# Поддержка платформ в пресетах
## Автор
Сергей Антропов
Сайт: https://devops.org.ru
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
**Версия:** 3.0.0
## Описание
Начиная с версии 1.0, Molecule Template поддерживает указание конкретных платформ для хостов в пресетах. Это позволяет автоматически фильтровать хосты, которые не поддерживаются на текущей архитектуре системы.
DevOpsLab поддерживает указание конкретных платформ для хостов в пресетах. Это позволяет автоматически фильтровать хосты, которые не поддерживаются на текущей архитектуре системы.
## Обязательные требования

86
docs/podman.md Normal file
View File

@@ -0,0 +1,86 @@
# Работа с Podman (ветка podman)
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
В ветке `podman` проект переведён на использование **только Podman** (без Docker и Docker Compose).
## Требования
- **Podman** установлен и запущен (rootful: сокет `/run/podman/podman.sock`)
- **podman compose** (встроен в Podman 4.1+ или пакет `podman-compose`)
- Для K8s: **Minikube** и **kubectl** на хосте
## Основные изменения
### Molecule
- Драйвер: `delegated` (создание/удаление контейнеров в `create.yml` / `destroy.yml` через Ansible).
- Используется коллекция **containers.podman** (`podman_network`, `podman_container`).
- Сокет: `/run/podman/podman.sock` (DOoD-узлы заменены на POoD с монтированием сокета Podman).
- Инвентарь: `ansible_connection=containers.podman.podman`.
### Makefile
- Все вызовы `docker` заменены на `podman`.
- Сборка образов: `podman build --platform ...` (без buildx).
- Compose: `podman compose` (вместо `docker-compose`).
- Сокет в целях контроллера: `PODMAN_SOCKET ?= /run/podman/podman.sock`, монтируется в контейнер ansible-controller.
### Ansible-controller
- Образ собирается и запускается через Podman.
- В образе установлен **Podman** (вместо Docker).
- При запуске монтируется сокет хоста: `-v $(PODMAN_SOCKET):/run/podman/podman.sock`.
- Переменная окружения: `CONTAINER_HOST=unix:///run/podman/podman.sock`.
### Kubernetes
- Вместо **Kind** используется **Minikube** с драйвером `podman`.
- Кластер создаётся на хосте: `minikube start --driver=podman`.
- Скрипт: `scripts/create_minikube_cluster.py` (читает пресет из `molecule/presets/k8s/*.yml`).
- В пресетах K8s: `minikube_profile`, `minikube_addons`, `minikube_cpus`, `minikube_memory` (вместо `kind_clusters`).
## Локальные образы (без доступа к registry)
Во всех пресетах при использовании Podman **используются только локальные образы**. Выгрузка из registry отключена.
1. Соберите все образы локально один раз:
```bash
make buildall
```
2. Либо один образ для нужного пресета:
```bash
make buildall-image IMAGE=ubuntu22
make buildall-image IMAGE=debian11
```
3. После этого Molecule при `create` проверяет наличие образов локально и не выполняет `podman pull`. Если какого-то образа нет — выведет сообщение с указанием выполнить `make buildall`.
## Быстрый старт
```bash
# 1. Собрать локальные образы (без registry)
make buildall
# 2. Сеть labnet для compose (если нужен controller)
podman network create labnet 2>/dev/null || true
# 3. Запуск ansible-controller
make controller run
# 4. Тест ролей (контейнеры создаются через Podman из локальных образов)
make role test minimal
# Minikube (на хосте)
make k8s create k8s-minimal
make k8s status
kubectl get nodes
```
## Переменные
- **PODMAN_SOCKET** — путь к сокету Podman на хосте (по умолчанию `/run/podman/podman.sock` для rootful).
## CI/CD
Секция CI/CD (**cicd/**) в этой ветке **не менялась** — рассчитана на окружения с Docker. Для Podman в пайплайнах нужно отдельно устанавливать Podman и вызывать `podman` / `podman compose` в jobах.

View File

@@ -0,0 +1,332 @@
# DevOpsLab: пошаговое руководство для новичков
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
Это руководство описывает по шагам: создание роли, объединение ролей в плейбук, линт, тестирование на контейнерах (подах) с разным количеством и разными ОС, а также формирование инвентори для деплоя на реальные серверы. Подходит и для **Docker**, и для **Podman** (отличия указаны в конце).
---
## Что нужно установить
- **Make** (обычно уже есть в Linux/macOS).
- **Podman** (ветка podman) или **Docker** (ветка main) — для контейнеров.
- **Ansible** не обязателен на хосте: тесты и деплой можно запускать через контейнер из Makefile.
Клонируйте репозиторий и перейдите в каталог проекта. Все команды ниже выполняются из корня проекта.
---
## Шаг 1. Создать новую роль
Роль — это набор задач (tasks), шаблонов и переменных для одной цели (например, установка nginx или настройка пользователей).
**Команда:**
```bash
make role create
```
Скрипт спросит имя роли (латиницей, например `nginx` или `myapp`). Будет создана структура:
- `roles/<имя_роли>/tasks/main.yml` — основные задачи
- `roles/<имя_роли>/handlers/main.yml`
- `roles/<имя_роли>/defaults/main.yml` — переменные по умолчанию
- `roles/<имя_роли>/meta/main.yml`
- и др.
**Что сделать после создания:**
1. Открыть `roles/<имя_роли>/tasks/main.yml` и добавить свои задачи (модули `package`, `copy`, `template`, `service` и т.д.).
2. При необходимости задать переменные в `roles/<имя_роли>/defaults/main.yml`.
Роль автоматически попадёт в общий плейбук развёртывания после следующего шага (обновления плейбуков).
---
## Шаг 2. Объединить роли в один плейбук
Все роли, которые должны выполняться на серверах, собираются в один плейбук: **`roles/deploy.yml`**.
**Вариант А — обновить плейбук автоматически (все роли из `roles/`):**
```bash
make update-playbooks
```
Скрипт перезапишет `roles/deploy.yml`: для каждой роли в каталоге `roles/` будет добавлен свой play (hosts: all, одна роль в play).
**Вариант Б — править вручную:**
Откройте `roles/deploy.yml`. Каждая роль описывается своим блоком:
```yaml
- name: Установка роли repo
hosts: all
become: true
roles:
- repo
- name: Установка роли devops
hosts: all
become: true
roles:
- devops
```
- Чтобы **включить** роль — добавьте такой блок или раскомментируйте существующий.
- Чтобы **выключить** роль — закомментируйте блок (перед каждой строкой поставьте `#`).
- Порядок блоков задаёт порядок применения ролей.
Итог: в `roles/deploy.yml` перечислены все роли, которые будут и тестироваться в контейнерах, и деплоиться на реальные серверы (см. шаги 4 и 6).
---
## Шаг 3. Запуск линт-проверок
Линт проверяет синтаксис и типичные ошибки в ролях (и в плейбуках, которые их вызывают).
**Проверить все роли:**
```bash
make role lint
```
**Проверить одну роль:**
```bash
make role lint <имя_роли>
# Пример:
make role lint repo
make role lint devops
```
При ошибках будут указаны файл и строка. Исправьте замечания и запустите линт снова. Без ошибок линт завершится без падения.
---
## Шаг 4. Тестирование ролей на контейнерах (подах)
Тесты поднимают контейнеры с разными ОС, применяют к ним плейбук (в т.ч. ваши роли) и проверяют результат. Контейнеры в этом шаге — это и есть «поды» (тестовые хосты).
### 4.1. Подготовка образов (чтобы не качать из registry)
**Если используете Podman (ветка podman):**
Образы должны быть собраны **локально**. Один раз выполните:
```bash
make buildall
```
Собираются все образы (Ubuntu, Debian, CentOS и т.д.). Долго, но делается один раз. Для одного образа, например для минимального теста:
```bash
make buildall-image IMAGE=ubuntu22
make buildall-image IMAGE=debian12
```
**Если используете Docker (ветка main):**
```bash
make docker build
```
(при необходимости сначала `make docker setup-builder`).
### 4.2. Запуск тестов
**С пресетом по умолчанию (обычно 2 хоста):**
```bash
make role test
```
**С конкретным пресетом:**
```bash
make role test minimal
make role test default
make role test all-images
```
Что происходит: создаются контейнеры по выбранному пресету, к ним применяется плейбук (converge), затем они удаляются. Результат виден в выводе команды.
---
## Шаг 5. Менять количество подов и ОС (пресеты)
Количество «подов» (контейнеров) и их ОС задаются **пресетами** — файлами в `molecule/presets/` и `molecule/presets/examples/`.
### 5.1. Посмотреть доступные пресеты
```bash
make presets list
```
Будет выведен список пресетов и краткое описание (в т.ч. количество хостов).
### 5.2. Что задаёт пресет
В пресете задаётся:
- **hosts** — список хостов (контейнеров): имя, семейство ОС (`family`), группы.
- **images** — соответствие `family` и образа (например `ubuntu22: "inecs/ansible-lab:ubuntu22-latest"`).
- Общие настройки (сеть, systemd и т.д.).
От количества элементов в **hosts** и от выбранных **family** зависит, сколько подов поднимется и какие ОС будут использоваться.
### 5.3. Примеры пресетов по количеству и ОС
| Пресет | Описание | Кол-во хостов |
|-------------|------------------------------------|----------------|
| `minimal` | Один хост (быстрый тест) | 1 |
| `default` | Два хоста (например Ubuntu + Debian) | 2 |
| `all-images`| Максимум образов/ОС | много |
Запуск:
```bash
make role test minimal
make role test default
make role test all-images
```
### 5.4. Создать свой пресет (свои поды и ОС)
1. Скопируйте существующий пресет, например:
```bash
cp molecule/presets/default.yml molecule/presets/my-preset.yml
```
2. Откройте `molecule/presets/my-preset.yml`.
3. В секции **hosts** укажите свои хосты. Формат одного хоста:
```yaml
hosts:
- name: web1
family: ubuntu22
groups: [web, test]
- name: db1
family: centos9
groups: [db, test]
- name: lb1
family: debian12
groups: [lb, test]
```
- **name** — уникальное имя контейнера (пода).
- **family** — ключ из секции **images** (ubuntu20, ubuntu22, ubuntu24, debian9debian12, centos7centos9, alma, rocky, rhel, redos, astra, alt9, alt10 и т.д.).
- **groups** — группы для инвентори (можно использовать в плейбуках через `hosts: web` или `hosts: db`).
4. Сохраните файл. Запуск теста с вашим пресетом:
```bash
make role test my-preset
```
Количество подов = количество элементов в списке **hosts**. Разные ОС = разные **family** при наличии соответствующих образов в **images** (и собранных локально при Podman через `make buildall`).
---
## Шаг 6. Инвентори и деплой на реальные серверы
Когда роли и плейбук готовы и протестированы в контейнерах, их можно применять к реальным серверам. Для этого нужен **инвентори** и команды деплоя.
### 6.1. Где лежит инвентори
Файл инвентори по умолчанию:
- **`inventory/hosts.ini`**
Именно его используют команды `make role deploy` и `make role dryrun` (см. ниже).
### 6.2. Как сформировать инвентори
Откройте `inventory/hosts.ini`. Формат — обычный ini-инвентори Ansible.
**Пример минимального инвентори:**
```ini
# Группа веб-серверов
[web_servers]
web1 ansible_host=192.168.1.10 ansible_user=deploy
web2 ansible_host=192.168.1.11 ansible_user=deploy
# Группа БД
[db_servers]
db1 ansible_host=192.168.1.20 ansible_user=deploy
# Общие переменные для всех хостов
[all:vars]
ansible_ssh_private_key_file=~/.ssh/id_rsa
ansible_ssh_common_args='-o StrictHostKeyChecking=no'
```
- **Группы** — `[web_servers]`, `[db_servers]`. Имена можно менять и добавлять свои.
- **Хосты** — каждая строка: имя хоста + переменные. Обязательно укажите **ansible_host** (IP или hostname) и **ansible_user** (пользователь для SSH).
- **all:vars** — переменные для всех хостов (ключ SSH, опции подключения и т.д.).
Чтобы применять плейбук только к части серверов, в плейбуке можно использовать группы (например `hosts: web_servers`) или ограничивать запуск через `--limit` (см. ниже).
### 6.3. Проверка без изменений (dry-run)
Перед реальным деплоем полезно проверить, что плейбук выполнится без ошибок и что изменения именно те, что нужны:
```bash
make role dryrun <имя_роли>
# Пример:
make role dryrun repo
```
Команда запускает плейбук в режиме **check** (без реальных изменений) для указанной роли. Убедитесь, что в `inventory/hosts.ini` указаны ваши серверы и что с них есть SSH-доступ.
### 6.4. Реальный деплой плейбука на серверы
Когда инвентори заполнен и dry-run устраивает:
```bash
make role deploy
```
Будет выполнен плейбук **roles/deploy.yml** на всех хостах из **inventory/hosts.ini** (с подтверждением перед применением). При необходимости можно запускать Ansible вручную, например:
- Только на одной группе:
```bash
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --limit web_servers
```
- Только проверка (аналог dry-run для всего плейбука):
```bash
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --check --diff
```
(Если Ansible запускается через контейнер в Makefile, пути и вызов могут отличаться; логика та же: тот же инвентори и тот же плейбук.)
### 6.5. Кратко по шагам деплоя
1. Заполнить **inventory/hosts.ini** (группы, хосты, ansible_host, ansible_user, ключ SSH).
2. Проверить доступ: `ansible -i inventory/hosts.ini all -m ping` (если Ansible установлен локально).
3. Запустить **make role dryrun &lt;роль&gt;** для проверки.
4. Запустить **make role deploy** для применения плейбука к реальным серверам.
---
## Универсальность: Docker и Podman
Один и тот же сценарий (роли, плейбук, пресеты, инвентори) работает и с Docker, и с Podman. Отличия только в подготовке образов и в том, как вызываются контейнеры внутри Makefile.
| Действие | Podman (ветка podman) | Docker (ветка main) |
|-----------------------|---------------------------|----------------------------|
| Сборка образов | `make buildall` | `make docker build` |
| Один образ | `make buildall-image IMAGE=ubuntu22` | `make docker build-image IMAGE=ubuntu22` |
| Запуск тестов | `make role test [preset]` | то же |
| Линт | `make role lint` | то же |
| Деплой / инвентори | `make role deploy`, `inventory/hosts.ini` | то же |
- **Пресеты, роли, deploy.yml, inventory** — одни и те же.
- **Линт, тесты, деплой** — одни и те же команды `make role ...`.
- Разница только в том, как и откуда берутся образы (локальная сборка через `buildall` у Podman или сборка/пулл через `docker build` у Docker).
K8s в этом руководстве не рассматривается; см. отдельную документацию по Kubernetes при необходимости.

248
docs/run-yml-guide.md Normal file
View File

@@ -0,0 +1,248 @@
# Руководство по файлу run.yml
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
## 📋 Описание
Файл `molecule/default/run.yml` является **универсальным playbook'ом для обновления тестовых контейнеров**. Этот файл отвечает за подготовку окружения и установку необходимых утилит внутри контейнеров при запуске тестов.
## 🎯 Назначение
### Основные функции:
1. **Обновление пакетов** в контейнерах при запуске тестов
2. **Установка common tools** для корректной работы тестов
3. **Подготовка окружения** для тестирования ролей
4. **Импорт roles/deploy.yml** для запуска ролей
## 🏗️ Структура файла
### 1. Подготовка окружения для тестирования
```yaml
- name: Подготовка окружения для тестирования
hosts: all
become: true
tasks:
# Задачи подготовки...
```
**Что делает:**
- Обновляет кеш пакетов для всех поддерживаемых ОС
- Устанавливает необходимые утилиты
- Настраивает пользователя для тестирования
- Создает рабочие директории
### 2. Импорт deploy.yml
```yaml
- import_playbook: ../../roles/deploy.yml
```
**Что делает:**
- Импортирует `roles/deploy.yml` для запуска ролей
- Разделяет логику: `run.yml` - подготовка, `deploy.yml` - роли
- Обеспечивает единую точку управления ролями
## 🐧 Поддерживаемые ОС
### Debian/Ubuntu
- **Менеджер пакетов:** `apt`
- **Обновление:** `apt update`
- **Утилиты:** `curl`, `jq`, `ca-certificates`, `iproute2`, `iputils-ping`, `procps`, `net-tools`, `sudo`, `vim`, `wget`, `unzip`, `git`
### RHEL/CentOS/AlmaLinux/Rocky
- **Менеджер пакетов:** `yum`
- **Обновление:** `yum update_cache`
- **Утилиты:** `curl`, `jq`, `ca-certificates`, `iproute`, `iputils`, `procps-ng`, `net-tools`, `sudo`, `vim`, `wget`, `unzip`, `git`
### Alt Linux
- **Менеджер пакетов:** `apt` (специальная версия)
- **Обновление:** `apt update`
- **Утилиты:** `curl`, `jq`, `ca-certificates`, `iproute2`, `iputils`, `procps`, `net-tools`, `sudo`, `vim`, `wget`, `unzip`, `git`
## 🏷️ Теги (Tags)
### setup
- Обновление пакетов
- Установка утилит
- Настройка пользователей
- Создание директорий
### update
- Обновление кеша пакетов
- Обновление списка пакетов
### tools
- Установка common tools
- Установка системных утилит
### python
- Установка Python 3
- Установка pip
- Установка venv
### user
- Создание тестового пользователя
- Настройка домашней директории
### sudo
- Настройка sudo для тестового пользователя
- Конфигурация прав доступа
### directory
- Создание рабочих директорий
- Настройка прав доступа
### roles
- Запуск тестирования ролей
- Выполнение функциональных тестов
### test
- Тестирование функциональности
- Проверка работоспособности
## 🚀 Использование
### Запуск полного тестирования
```bash
make role test
```
### Запуск только подготовки окружения
```bash
make role test --tags setup
```
### Запуск только обновления пакетов
```bash
make role test --tags update
```
### Запуск только установки утилит
```bash
make role test --tags tools
```
### Запуск только тестирования ролей
```bash
make role test --tags roles
```
## 🔧 Настройка
### Переменные окружения
```bash
# Настройка тестового пользователя
export TEST_USER=testuser
# Настройка рабочей директории
export TEST_DIR=/tmp/ansible-test
# Настройка прав доступа
export TEST_MODE=0755
```
### Кастомизация утилит
Для добавления дополнительных утилит отредактируйте соответствующие секции:
```yaml
# Для Debian/Ubuntu
- name: Install common tools (Debian/Ubuntu)
apt:
name:
- curl
- jq
- your-custom-tool # Добавьте сюда
state: present
```
## 🐛 Troubleshooting
### Проблема: Ошибка обновления пакетов
**Решение:** Проверьте доступность репозиториев и интернет-соединение
### Проблема: Не удается установить утилиты
**Решение:** Проверьте названия пакетов для конкретной ОС
### Проблема: Ошибка создания пользователя
**Решение:** Проверьте права доступа и существование пользователя
### Проблема: Ошибка настройки sudo
**Решение:** Проверьте синтаксис файла sudoers
## 📊 Мониторинг
### Логи выполнения
```bash
# Просмотр логов тестирования
make role test 2>&1 | tee test.log
# Фильтрация по тегам
grep "TASK \[.*\]" test.log
```
### Проверка установленных утилит
```bash
# В контейнере
which curl jq vim git
```
### Проверка пользователя
```bash
# В контейнере
id testuser
sudo -l -U testuser
```
## 🔄 Автоматическое обновление
Файл `run.yml` автоматически обновляется при добавлении новых ролей:
```bash
# Автоматическое обновление
make update-playbooks
```
**Что происходит:**
1. Обнаруживаются все роли в директории `roles/`
2. Обновляется секция "Тестирование всех ролей"
3. Добавляются новые роли в список
## 📝 Примеры использования
### Тестирование конкретной роли
```bash
# Тестирование только роли ping
make role test minimal ping
```
### Тестирование с конкретным preset'ом
```bash
# Тестирование с preset'ом performance
make role test performance
```
### Отладка проблем
```bash
# Запуск с подробным выводом
make role test --verbose
```
## 🎯 Лучшие практики
1. **Всегда используйте теги** для разделения задач
2. **Проверяйте совместимость** утилит с ОС
3. **Тестируйте на разных образах** перед коммитом
4. **Используйте idempotent задачи** для стабильности
5. **Документируйте изменения** в комментариях
## 🔗 Связанные файлы
- `molecule/default/molecule.yml` - конфигурация Molecule
- `roles/deploy.yml` - playbook для продакшн развертывания
- `inventory/hosts.ini` - инвентори для тестирования
- `Makefile` - команды для запуска тестов

View File

@@ -1,11 +1,11 @@
# Руководство по файлу site.yml
# Руководство по файлу run.yml
**Автор:** Сергей Антропов
**Сайт:** https://devops.org.ru
## 📋 Описание
Файл `molecule/default/site.yml` является **универсальным playbook'ом для тестирования Ansible ролей** в контейнерах. Этот файл отвечает за подготовку окружения и установку необходимых утилит внутри контейнеров при запуске тестов.
Файл `molecule/default/run.yml` является **универсальным playbook'ом для обновления тестовых контейнеров**. Этот файл отвечает за подготовку окружения и установку необходимых утилит внутри контейнеров при запуске тестов.
## 🎯 Назначение
@@ -42,7 +42,7 @@
**Что делает:**
- Импортирует `roles/deploy.yml` для запуска ролей
- Разделяет логику: `site.yml` - подготовка, `deploy.yml` - роли
- Разделяет логику: `run.yml` - подготовка, `deploy.yml` - роли
- Обеспечивает единую точку управления ролями
## 🐧 Поддерживаемые ОС
@@ -200,7 +200,7 @@ sudo -l -U testuser
## 🔄 Автоматическое обновление
Файл `site.yml` автоматически обновляется при добавлении новых ролей:
Файл `run.yml` автоматически обновляется при добавлении новых ролей:
```bash
# Автоматическое обновление

View File

@@ -136,7 +136,7 @@ make vault decrypt
├── files/
│ ├── requirements.yml
│ └── playbooks/
│ └── site.yml
│ └── run.yml
├── vault/
│ └── secrets.yml
└── Makefile

View File

@@ -6,7 +6,7 @@
## Описание
Это руководство описывает работу с зашифрованными секретами в Ansible Vault для проекта AnsibleTemplate.
Это руководство описывает работу с зашифрованными секретами в Ansible Vault для проекта DevOpsLab.
## Безопасность

View File

@@ -0,0 +1,19 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: grafana-ingress
namespace: monitoring
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: grafana.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: monitoring-grafana
port:
number: 80

View File

@@ -1,4 +1,7 @@
---
# =============================================================================
# CONVERGE - Сборка и запуск тестовых сценариев
# =============================================================================
- hosts: localhost
gather_facts: false
vars:
@@ -6,70 +9,231 @@
preset_name: "{{ lookup('env', 'MOLECULE_PRESET') | default('default') }}"
preset_file: "/workspace/molecule/presets/{{ preset_name }}.yml"
# перечисли файлы/глобы, которые нужно временно расшифровать
vault_targets:
- /workspace/vault/secrets.yml
- /workspace/files/playbooks/group_vars/*/vault.yml
- /workspace/files/playbooks/host_vars/*/vault.yml
- /workspace/roles/**/vars/vault.yml
tasks:
- name: Display filtered hosts
debug:
msg: |
================================================================================
Начало работы converge.yml
================================================================================
# =============================================================================
# НАСТРОЙКА - Загрузка конфигурации и подготовка
# =============================================================================
- name: Configuration setup
debug:
msg: |
================================================================================
НАСТРОЙКА - Загрузка пресетов конфигурации и подготовка
================================================================================
Preset: {{ preset_name }}
================================================================================
- name: Load preset configuration
include_vars: "{{ preset_file }}"
when: preset_file is file
ignore_errors: true
# - name: Install collections
# community.docker.docker_container_exec:
# container: ansible-controller
# command: bash -lc "ansible-galaxy collection install -r /workspace/requirements.yml --force --no-deps --upgrade >/dev/null 2>&1 || true"
- name: Preflight vault — normalize state (encrypt if plaintext, then decrypt)
community.docker.docker_container_exec:
container: ansible-controller
command: >
bash -lc '
set -euo pipefail; shopt -s nullglob globstar;
for p in {{ vault_targets | map('quote') | join(' ') }}; do
for f in $p; do
[ -f "$f" ] || continue;
if head -n1 "$f" | grep -q "^\$ANSIBLE_VAULT;"; then
echo "[vault] already encrypted: $f";
else
echo "[vault] plaintext -> encrypt: $f";
ansible-vault encrypt --encrypt-vault-id default --vault-password-file /workspace/vault/.vault "$f";
fi
echo "[vault] decrypt for run: $f";
ansible-vault decrypt --vault-password-file /workspace/vault/.vault "$f";
done
done
'
- name: Run lab playbook
community.docker.docker_container_exec:
container: ansible-controller
command: >
bash -lc "
ANSIBLE_ROLES_PATH=/workspace/roles
ansible-playbook -i {{ lookup('env','MOLECULE_EPHEMERAL_DIRECTORY') }}/inventory/hosts.ini /workspace/molecule/default/site.yml
"
# =============================================================================
# ПОДГОТОВКА КОНТЕЙНЕРОВ (бывший run.yml)
# =============================================================================
- name: Подготовка окружения для тестирования
hosts: all
become: true
tasks:
# Сброс цветовых кодов ANSI для корректного отображения
- name: Reset ANSI color codes
debug:
msg: "\033[0m"
changed_when: false
tags:
- setup
- color-reset
- name: Post-run — re-encrypt secrets
community.docker.docker_container_exec:
container: ansible-controller
command: >
bash -lc '
set -euo pipefail; shopt -s nullglob globstar;
for p in {{ vault_targets | map('quote') | join(' ') }}; do
for f in $p; do
[ -f "$f" ] || continue;
if head -n1 "$f" | grep -q "^\$ANSIBLE_VAULT;"; then
echo "[vault] ok (encrypted): $f";
else
echo "[vault] encrypt back: $f";
ansible-vault encrypt --encrypt-vault-id default --vault-password-file /workspace/vault/.vault "$f" || true;
fi
done
done
'
ignore_errors: true
- name: Display filtered hosts
debug:
msg: |
================================================================================
ПОДГОТОВКА КОНТЕЙНЕРОВ
================================================================================
# Создание tmp директории для Ansible
- name: Create Ansible tmp directory
file:
path: /tmp/.ansible-tmp
state: directory
mode: '0755'
owner: root
group: root
tags:
- setup
- tmp
# Обновление кеша пакетов для Debian/Ubuntu
- name: Update package cache (Debian/Ubuntu)
apt:
update_cache: true
cache_valid_time: 3600
when: ansible_os_family == 'Debian'
changed_when: false
tags:
- setup
- update
# Обновление кеша пакетов для RHEL/CentOS/AlmaLinux/Rocky
- name: Update package cache (RHEL/CentOS/AlmaLinux/Rocky)
yum:
update_cache: true
when: ansible_os_family == 'RedHat'
changed_when: false
tags:
- setup
- update
# Обновление кеша пакетов для Alt Linux
- name: Update package cache (Alt Linux)
command: apt-get update
when: ansible_os_family == 'Altlinux'
changed_when: false
failed_when: false
tags:
- setup
- update
# Обновление кеша пакетов для Astra Linux
- name: Update package cache (Astra Linux)
command: apt-get update
when: ansible_os_family == 'Astra Linux'
changed_when: false
failed_when: false
tags:
- setup
- update
# Установка common tools для всех ОС
- name: Install common tools (Debian/Ubuntu)
apt:
name:
- curl
- jq
- ca-certificates
- iproute2
- iputils-ping
- procps
- net-tools
- vim
- wget
- unzip
- git
- sudo
state: present
update_cache: false
when: ansible_os_family == 'Debian'
no_log: true
tags:
- setup
- tools
- name: Install common tools (RHEL/CentOS/AlmaLinux/Rocky)
yum:
name:
- curl
- jq
- ca-certificates
- iproute
- iputils
- procps-ng
- net-tools
- vim
- wget
- unzip
- git
- sudo
state: present
when: ansible_os_family == 'RedHat'
no_log: true
tags:
- setup
- tools
- name: Install common tools (Alt Linux)
command: apt-get install -y curl jq ca-certificates iproute2 iputils procps net-tools vim wget unzip git sudo
when: ansible_os_family == 'Altlinux'
changed_when: false
failed_when: false
no_log: true
tags:
- setup
- tools
- name: Install common tools (Astra Linux)
command: apt-get install -y curl jq ca-certificates iproute2 iputils procps net-tools vim wget unzip git sudo
when: ansible_os_family == 'Astra Linux'
changed_when: false
failed_when: false
no_log: true
tags:
- setup
- tools
# Установка Python для Ansible (если не установлен)
- name: Install Python (Debian/Ubuntu)
apt:
name:
- python3
- python3-pip
- python3-venv
state: present
when: ansible_os_family == 'Debian'
no_log: true
tags:
- setup
- python
- name: Install Python (RHEL/CentOS/AlmaLinux/Rocky)
yum:
name:
- python3
- python3-pip
state: present
when: ansible_os_family == 'RedHat'
no_log: true
tags:
- setup
- python
- name: Install Python (Alt Linux)
command: apt-get install -y python3 python3-pip
when: ansible_os_family == 'Altlinux'
changed_when: false
failed_when: false
no_log: true
tags:
- setup
- python
- name: Install Python (Astra Linux)
command: apt-get install -y python3 python3-pip
when: ansible_os_family == 'Astra Linux'
changed_when: false
failed_when: false
no_log: true
tags:
- setup
- python
- name: Display filtered hosts
debug:
msg: |
================================================================================
ПОДГОТОВКА КОНТЕЙНЕРОВ ЗАВЕРШЕНА
================================================================================
- name: Display filtered hosts
debug:
msg: |
================================================================================
РАБОТА ФАЙЛА CONVERGE.YML ЗАВЕРШЕНА
================================================================================

View File

@@ -1,24 +1,38 @@
---
# =============================================================================
# CREATE - Создание тестовых инстансов
# =============================================================================
- hosts: localhost
gather_facts: false
vars:
# Получаем preset из переменной окружения или используем default
preset_name: "{{ lookup('env', 'MOLECULE_PRESET') | default('default') }}"
preset_file: "/workspace/molecule/presets/{{ preset_name }}.yml"
# Проверяем сначала в папке k8s, затем в основной папке presets
preset_file: "{{ '/workspace/molecule/presets/k8s/' + preset_name + '.yml' if (preset_name in ['k8s-minimal', 'kubernetes', 'k8s-full'] or preset_name.startswith('k8s-')) else '/workspace/molecule/presets/' + preset_name + '.yml' }}"
# Fallback значения если preset файл не найден
# Fallback значения если preset файл не найден (Podman использует ту же сеть)
docker_network: labnet
podman_network: "{{ docker_network }}"
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
images:
alt: "inecs/ansible-lab:alt-linux-latest"
alt9: "inecs/ansible-lab:alt9-latest"
alt10: "inecs/ansible-lab:alt10-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
astra-arm64: "inecs/ansible-lab:astra-linux-arm64-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos: "inecs/ansible-lab:centos-latest"
centos7: "inecs/ansible-lab:centos7-latest"
centos8: "inecs/ansible-lab:centos8-latest"
centos9: "inecs/ansible-lab:centos9-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"
ubuntu20: "inecs/ansible-lab:ubuntu20-latest"
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
ubuntu24: "inecs/ansible-lab:ubuntu24-latest"
debian9: "inecs/ansible-lab:debian9-latest"
debian10: "inecs/ansible-lab:debian10-latest"
debian11: "inecs/ansible-lab:debian11-latest"
debian12: "inecs/ansible-lab:debian12-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
@@ -30,20 +44,15 @@
- name: u1
family: debian
groups: [test]
kind_clusters: []
tasks:
# - name: Install required collections
# command: ansible-galaxy collection install -r /workspace/requirements.yml
# delegate_to: localhost
# ignore_errors: true
# register: collections_install
# changed_when: false
# run_once: true
# become: true
# vars:
# ansible_python_interpreter: /usr/bin/python3
# environment:
# ANSIBLE_COLLECTIONS_PATH: /usr/share/ansible/collections
- name: Display running create.yml
debug:
msg: |
================================================================================
Запуск create.yml
================================================================================
# Определяем архитектуру системы для корректной загрузки образов
- name: Detect system architecture
@@ -80,49 +89,68 @@
set_fact:
hosts: "{{ filtered_hosts | default(hosts) }}"
- name: Display filtered hosts
# =============================================================================
# СЕТЕВОЕ ПОДКЛЮЧЕНИЕ (Podman)
# =============================================================================
- name: Network setup
debug:
msg: "Platform {{ ansible_architecture }}: {{ hosts | length }} hosts will be deployed"
msg: |
================================================================================
НАСТРОЙКА СЕТИ (Podman)
================================================================================
Network: {{ podman_network | default(docker_network) }}
================================================================================
- name: Ensure network exists
community.docker.docker_network:
name: "{{ docker_network }}"
containers.podman.podman_network:
name: "{{ podman_network | default(docker_network) }}"
state: present
# SYSTEMD nodes
- name: Pull systemd images with correct platform
command: "docker pull --platform {{ ansible_architecture }} {{ images[item.family] }}"
# =============================================================================
# SYSTEMD NODES - Создание контейнеров с systemd
# =============================================================================
- name: Systemd nodes setup
debug:
msg: |
================================================================================
SYSTEMD NODES - Создание контейнеров с systemd
================================================================================
Count: {{ hosts | selectattr('type','undefined') | list | length }}
================================================================================
# Только локальные образы (registry запрещён). Сборка: make buildall
- name: Проверка наличия локальных образов (Podman)
command: "podman image exists {{ images[item.family] }}"
loop: "{{ hosts | selectattr('type','undefined') | list }}"
loop_control: { label: "{{ item.name }}" }
when: item.family is defined and images[item.family] is defined
register: pull_result
ignore_errors: yes
register: image_check
failed_when: false
changed_when: false
- name: Display pull results
debug:
msg: "Pulled {{ item.item.name }}: {{ 'OK' if (item.rc is defined and item.rc == 0) else 'SKIPPED (not available for this platform)' }}"
loop: "{{ pull_result.results | default([]) }}"
loop_control:
label: "{{ item.item.name }}"
- name: Остановка при отсутствии локальных образов
fail:
msg: |
Локальные образы не найдены (доступ к registry запрещён).
Выполните: make buildall
Отсутствуют образы: {{ image_check.results | default([]) | selectattr('rc', 'ne', 0) | map(attribute='item') | map(attribute='family') | list | join(', ') }}
when: image_check.results is defined and (image_check.results | selectattr('rc', 'ne', 0) | list | length > 0)
- name: Start systemd nodes
community.docker.docker_container:
containers.podman.podman_container:
name: "{{ item.name }}"
image: "{{ images[item.family] }}"
networks:
- name: "{{ docker_network }}"
network: "{{ podman_network | default(docker_network) }}"
privileged: "{{ systemd_defaults.privileged }}"
command: "{{ systemd_defaults.command }}"
volumes: "{{ systemd_defaults.volumes | default([]) + (item.volumes | default([])) }}"
command: "{{ '/bin/bash -c \"while true; do sleep 30; done\"' if item.family in ['alt10', 'alt9'] else systemd_defaults.command }}"
volume: "{{ systemd_defaults.volumes | default([]) + (item.volumes | default([])) + ['/workspace/vault:/workspace/vault:ro', '/workspace/files:/workspace/files:ro', '/workspace/roles:/workspace/roles:ro'] }}"
tmpfs: "{{ systemd_defaults.tmpfs | default([]) }}"
capabilities: "{{ systemd_defaults.capabilities | default([]) }}"
published_ports: "{{ item.publish | default([]) }}"
cap_add: "{{ systemd_defaults.capabilities | default([]) }}"
ports: "{{ item.publish | default([]) }}"
env: "{{ item.env | default({}) }}"
# Специальные настройки для Astra Linux и RedOS (для совместимости с amd64 базовыми образами)
security_opts: "{{ ['seccomp=unconfined', 'apparmor=unconfined'] if item.family in ['astra', 'redos'] else [] }}"
platform: "{{ 'linux/amd64' if item.family in ['astra', 'redos'] else omit }}"
security_opt: "{{ ['seccomp=unconfined', 'apparmor=unconfined'] if item.family in ['astra', 'redos'] else [] }}"
state: started
restart_policy: unless-stopped
restart_policy: "unless-stopped"
loop: "{{ hosts | selectattr('type','undefined') | list }}"
loop_control: { label: "{{ item.name }}" }
when: item.family is defined and images[item.family] is defined
@@ -130,54 +158,47 @@
# Ожидание стабилизации контейнеров
- name: Wait for containers to be ready
pause:
seconds: 5
seconds: 10
when: hosts | length > 0
# Создание tmp директории в контейнерах
- name: Create Ansible tmp directory in containers
community.docker.docker_container_exec:
container: "{{ item.name }}"
command: "mkdir -p /tmp/.ansible-tmp && chmod 755 /tmp/.ansible-tmp"
# Проверка готовности контейнеров (Podman)
- name: Wait for containers to be running
command: "podman inspect --format '{{ '{{' }}.State.Running{{ '}}' }}' {{ item.name }}"
register: container_info
loop: "{{ hosts | selectattr('type','undefined') | list }}"
loop_control: { label: "{{ item.name }}" }
when: item.family is defined and images[item.family] is defined
ignore_errors: true
retries: 3
delay: 2
retries: 10
delay: 5
until: container_info.stdout == 'true'
# DinD nodes
- name: Start DinD nodes (docker:27-dind)
community.docker.docker_container:
name: "{{ item.name }}"
image: "docker:27-dind"
networks:
- name: "{{ docker_network }}"
privileged: true
env:
DOCKER_TLS_CERTDIR: ""
published_ports: "{{ item.publish | default([]) }}"
volumes: "{{ (item.volumes | default([])) + [item.name + '-docker:/var/lib/docker'] }}"
state: started
restart_policy: unless-stopped
loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list }}"
loop_control: { label: "{{ item.name }}" }
# DOoD nodes (mount docker.sock)
- name: Start DOoD nodes (systemd + docker.sock mount)
community.docker.docker_container:
# =============================================================================
# POoD NODES - Создание контейнеров Podman-out-of-Podman (сокет Podman)
# =============================================================================
- name: POoD nodes setup
debug:
msg: |
================================================================================
POoD NODES - Контейнеры с монтированием сокета Podman
================================================================================
Count: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dood') | list | length }}
================================================================================
- name: Start POoD nodes (systemd + podman.sock mount)
containers.podman.podman_container:
name: "{{ item.name }}"
image: "{{ images[item.family] }}"
networks:
- name: "{{ docker_network }}"
network: "{{ podman_network | default(docker_network) }}"
privileged: "{{ systemd_defaults.privileged }}"
command: "{{ systemd_defaults.command }}"
volumes: "{{ (systemd_defaults.volumes | default([])) + ['/var/run/docker.sock:/var/run/docker.sock'] + (item.volumes | default([])) }}"
volume: "{{ (systemd_defaults.volumes | default([])) + ['/run/podman/podman.sock:/run/podman/podman.sock'] + (item.volumes | default([])) + ['/workspace/vault:/workspace/vault:ro', '/workspace/files:/workspace/files:ro', '/workspace/roles:/workspace/roles:ro'] }}"
tmpfs: "{{ systemd_defaults.tmpfs | default([]) }}"
capabilities: "{{ systemd_defaults.capabilities | default([]) }}"
published_ports: "{{ item.publish | default([]) }}"
env: "{{ item.env | default({}) }}"
cap_add: "{{ systemd_defaults.capabilities | default([]) }}"
ports: "{{ item.publish | default([]) }}"
env: "{{ (item.env | default({})) | combine({'CONTAINER_HOST': 'unix:///run/podman/podman.sock'}) }}"
state: started
restart_policy: unless-stopped
restart_policy: "unless-stopped"
loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dood') | list }}"
loop_control: { label: "{{ item.name }}" }
when: item.family is defined and images[item.family] is defined
@@ -197,12 +218,23 @@
item_name: "{{ item.0.name }}"
item_group: "{{ item.1 }}"
# Render inventory
# =============================================================================
# ИНВЕНТАРЬ - Генерация inventory файла
# =============================================================================
- name: Inventory generation
debug:
msg: |
================================================================================
ИНВЕНТАРЬ - Генерация inventory файла
================================================================================
File: {{ generated_inventory }}
================================================================================
- name: Render inventory ini
set_fact:
inv_content: |
[all:vars]
ansible_connection=community.docker.docker
ansible_connection=containers.podman.podman
ansible_remote_tmp=/tmp/.ansible-tmp
{% for group, members in (groups_map | dictsort) %}
@@ -264,7 +296,7 @@
{% endif %}
{# Глобальный fallback для остальных хостов #}
[unmatched_hosts:vars]
[all:vars]
ansible_python_interpreter=auto_silent
- name: Write inventory file
@@ -274,11 +306,23 @@
mode: "0644"
- name: Display inventory summary
shell: |
echo "Inventory Summary:"
echo "- Total hosts: {{ hosts | length }}"
echo "- Groups: {{ groups_map.keys() | list | join(', ') }}"
echo "- Systemd nodes: {{ hosts | selectattr('type','undefined') | list | length }}"
echo "- DinD nodes: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list | length }}"
echo "- DOoD nodes: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dood') | list | length }}"
register: inventory_summary_output
changed_when: false
- name: Show inventory summary
debug:
msg: "{{ inventory_summary_output.stdout_lines }}"
- name: End of create.yml
debug:
msg: |
📋 Inventory Summary:
- Total hosts: {{ hosts | length }}
- Groups: {{ groups_map.keys() | list | join(', ') }}
- Systemd nodes: {{ hosts | selectattr('type','undefined') | list | length }}
- DinD nodes: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list | length }}
- DOoD nodes: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dood') | list | length }}
================================================================================
Окончание работы create.yml
================================================================================

View File

@@ -1,10 +1,14 @@
---
# =============================================================================
# DESTROY - Удаление тестовых инстансов
# =============================================================================
- hosts: localhost
gather_facts: false
vars:
# Получаем preset из переменной окружения или используем default
preset_name: "{{ lookup('env', 'MOLECULE_PRESET') | default('default') }}"
preset_file: "/workspace/molecule/presets/{{ preset_name }}.yml"
# Проверяем сначала в папке k8s, затем в основной папке presets
preset_file: "{{ '/workspace/molecule/presets/k8s/' + preset_name + '.yml' if (preset_name in ['k8s-minimal', 'kubernetes', 'k8s-full'] or preset_name.startswith('k8s-')) else '/workspace/molecule/presets/' + preset_name + '.yml' }}"
# Fallback значения если preset файл не найден
docker_network: labnet
@@ -12,72 +16,94 @@
- name: u1
family: debian
groups: [test]
kind_clusters: []
tasks:
- name: Display filtered hosts
debug:
msg: |
================================================================================
НАЧАЛО РАБОТЫ ФАЙЛА DESTROY.YML
================================================================================
# =============================================================================
# НАСТРОЙКА - Загрузка конфигурации
# =============================================================================
- name: Configuration setup
debug:
msg: |
================================================================================
НАСТРОЙКА - Загрузка конфигурации
================================================================================
Preset: {{ preset_name }}
================================================================================
- name: Load preset configuration
include_vars: "{{ preset_file }}"
when: preset_file is file
ignore_errors: true
- name: Stop and remove containers
community.docker.docker_container:
# =============================================================================
# УДАЛЕНИЕ КОНТЕЙНЕРОВ - Остановка и удаление контейнеров
# =============================================================================
- name: Container removal
debug:
msg: |
================================================================================
УДАЛЕНИЕ КОНТЕЙНЕРОВ - Остановка и удаление контейнеров
================================================================================
Count: {{ hosts | length }} containers
================================================================================
- name: Stop and remove containers (Podman)
containers.podman.podman_container:
name: "{{ item.name }}"
state: absent
force_kill: true
cleanup: true
force_delete: 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
podman ps -a --filter "name={{ item.name }}" --format "{{ '{{' }}.ID{{ '}}' }}" | xargs -r podman rm -f 2>/dev/null || true
loop: "{{ hosts }}"
loop_control: { label: "{{ item.name }}" }
ignore_errors: true
- name: Remove DinD volumes
community.docker.docker_volume:
name: "{{ item.name }}-docker"
state: absent
loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list }}"
loop_control: { label: "{{ item.name }}" }
ignore_errors: true
- name: Remove custom volumes
community.docker.docker_volume:
name: "{{ item.volumes | default([]) | select('match', '^[^:]+$') | list }}"
state: absent
loop: "{{ hosts }}"
loop_control: { label: "{{ item.name }}" }
ignore_errors: true
when: item.volumes is defined
- name: Remove network
community.docker.docker_network:
name: "{{ docker_network }}"
containers.podman.podman_network:
name: "{{ podman_network | default(docker_network) }}"
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
podman ps -a --filter "name={{ host.name }}" --format "{{ '{{' }}.ID{{ '}}' }}" | xargs -r podman 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
podman ps -a --filter "ancestor=inecs/ansible-lab" --format "{{ '{{' }}.ID{{ '}}' }}" | xargs -r podman rm -f 2>/dev/null || true
podman ps -a --filter "network=labnet" --format "{{ '{{' }}.ID{{ '}}' }}" | xargs -r podman rm -f 2>/dev/null || true
ignore_errors: true
vars:
# Используем переменную hosts из загруженного пресета
hosts: "{{ hosts }}"
- name: Display cleanup summary
debug:
msg: |
🧹 Cleanup Summary:
- Removed containers: {{ hosts | length }}
- Removed DinD volumes: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list | length }}
- Network: {{ docker_network }}
================================================================================
СТАТИСТИКА ОЧИСТКИ
================================================================================
Containers: {{ hosts | length }}
Volumes: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list | length }}
Network: {{ podman_network | default(docker_network) }}
Clusters: {{ minikube_profiles | default([]) | length }}
================================================================================
- name: Display filtered hosts
debug:
msg: |
================================================================================
РАБОТА ФАЙЛА DESTROY.YML ЗАВЕРШЕНА
================================================================================

View File

@@ -3,12 +3,15 @@
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Используем delegated: создание/удаление контейнеров в create.yml и destroy.yml через Podman
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
driver:
name: docker
name: delegated
platforms:
# Платформы будут созданы динамически через preset файлы
# Поддержка собственных образов AnsibleLab
# Поддержка собственных образов DevOpsLab с правильными тегами
- name: placeholder
image: ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy
pre_build_image: true
@@ -16,32 +19,71 @@ platforms:
- name: ansible-controller
image: inecs/ansible-lab:ansible-controller-latest
pre_build_image: true
- name: alt-linux
image: inecs/ansible-lab:alt-linux-latest
volumes:
- "${MOLECULE_EPHEMERAL_DIRECTORY}:/tmp/molecule_workspace:ro"
- "../vault:/workspace/vault:ro"
# ALT Linux
- name: alt9
image: inecs/ansible-lab:alt9-latest
pre_build_image: true
- name: alt10
image: inecs/ansible-lab:alt10-latest
pre_build_image: true
# Astra Linux
- name: astra-linux
image: inecs/ansible-lab:astra-linux-latest
pre_build_image: true
- name: astra-linux-arm64
image: inecs/ansible-lab:astra-linux-arm64-latest
pre_build_image: true
# RED OS
- name: redos
image: inecs/ansible-lab:redos-latest
pre_build_image: true
# RHEL
- name: rhel
image: inecs/ansible-lab:rhel-latest
pre_build_image: true
- name: centos
image: inecs/ansible-lab:centos-latest
# CentOS
- name: centos7
image: inecs/ansible-lab:centos7-latest
pre_build_image: true
- name: centos8
image: inecs/ansible-lab:centos8-latest
pre_build_image: true
- name: centos9
image: inecs/ansible-lab:centos9-latest
pre_build_image: true
# AlmaLinux
- name: alma
image: inecs/ansible-lab:alma-latest
pre_build_image: true
# Rocky Linux
- name: rocky
image: inecs/ansible-lab:rocky-latest
pre_build_image: true
- name: ubuntu
image: inecs/ansible-lab:ubuntu-latest
# Ubuntu
- name: ubuntu20
image: inecs/ansible-lab:ubuntu20-latest
pre_build_image: true
- name: debian
image: inecs/ansible-lab:debian-latest
- name: ubuntu22
image: inecs/ansible-lab:ubuntu22-latest
pre_build_image: true
- name: ubuntu24
image: inecs/ansible-lab:ubuntu24-latest
pre_build_image: true
# Debian
- name: debian9
image: inecs/ansible-lab:debian9-latest
pre_build_image: true
- name: debian10
image: inecs/ansible-lab:debian10-latest
pre_build_image: true
- name: debian11
image: inecs/ansible-lab:debian11-latest
pre_build_image: true
- name: debian12
image: inecs/ansible-lab:debian12-latest
pre_build_image: true
provisioner:

View File

@@ -1,216 +0,0 @@
---
# Универсальный playbook для тестирования Ansible ролей
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
#
# Этот файл отвечает за:
# 1. Обновление пакетов в контейнерах при запуске тестов
# 2. Установку common tools для корректной работы тестов
# 3. Подготовку окружения для тестирования ролей
# 4. Запуск всех ролей из директории roles/
- name: Подготовка окружения для тестирования
hosts: all
become: true
tasks:
# Создание tmp директории для Ansible
- name: Create Ansible tmp directory
file:
path: /tmp/.ansible-tmp
state: directory
mode: '0755'
owner: root
group: root
tags:
- setup
- tmp
# Обновление кеша пакетов для Debian/Ubuntu
- name: Update package cache (Debian/Ubuntu)
apt:
update_cache: true
cache_valid_time: 3600
when: ansible_os_family == 'Debian'
changed_when: false
tags:
- setup
- update
# Обновление кеша пакетов для RHEL/CentOS/AlmaLinux/Rocky
- name: Update package cache (RHEL/CentOS/AlmaLinux/Rocky)
yum:
update_cache: true
when: ansible_os_family == 'RedHat'
changed_when: false
tags:
- setup
- update
# Обновление кеша пакетов для Alt Linux
- name: Update package cache (Alt Linux)
command: apt-get update
when: ansible_os_family == 'Altlinux'
changed_when: false
failed_when: false
tags:
- setup
- update
# Обновление кеша пакетов для Astra Linux
- name: Update package cache (Astra Linux)
command: apt-get update
when: ansible_os_family == 'Astra Linux'
changed_when: false
failed_when: false
tags:
- setup
- update
# Установка common tools для всех ОС (ЗАКОММЕНТИРОВАНО)
# - name: Install common tools (Debian/Ubuntu)
# apt:
# name:
# - curl
# - jq
# - ca-certificates
# - iproute2
# - iputils-ping
# - procps
# - net-tools
# - vim
# - wget
# - unzip
# - git
# state: present
# update_cache: false
# when: ansible_os_family == 'Debian'
# tags:
# - setup
# - tools
# - name: Install common tools (RHEL/CentOS/AlmaLinux/Rocky)
# yum:
# name:
# - curl
# - jq
# - ca-certificates
# - iproute
# - iputils
# - procps-ng
# - net-tools
# - vim
# - wget
# - unzip
# - git
# state: present
# when: ansible_os_family == 'RedHat'
# tags:
# - setup
# - tools
# - name: Install common tools (Alt Linux)
# command: apt-get install -y curl jq ca-certificates iproute2 iputils procps net-tools vim wget unzip git
# when: ansible_os_family == 'Altlinux'
# changed_when: false
# failed_when: false
# tags:
# - setup
# - tools
# - name: Install common tools (Astra Linux)
# command: apt-get install -y curl jq ca-certificates iproute2 iputils procps net-tools vim wget unzip git
# when: ansible_os_family == 'Astra Linux'
# changed_when: false
# failed_when: false
# tags:
# - setup
# - tools
# Установка Python для Ansible (если не установлен)
- name: Install Python (Debian/Ubuntu)
apt:
name:
- python3
- python3-pip
- python3-venv
state: present
when: ansible_os_family == 'Debian'
tags:
- setup
- python
# Установка Python 3.8+ для RHEL/CentOS/Rocky/AlmaLinux
- name: Install Python 3.8+ (RHEL/CentOS/Rocky/AlmaLinux)
yum:
name:
- python3
- python3-pip
state: present
when: ansible_os_family == 'RedHat'
tags:
- setup
- python
- name: Install Python (RHEL/CentOS/AlmaLinux/Rocky)
yum:
name:
- python3
- python3-pip
state: present
when: ansible_os_family == 'RedHat'
tags:
- setup
- python
- name: Install Python (Alt Linux)
command: apt-get install -y python3 python3-pip
when: ansible_os_family == 'Altlinux'
changed_when: false
failed_when: false
tags:
- setup
- python
- name: Install Python (Astra Linux)
command: apt-get install -y python3 python3-pip
when: ansible_os_family == 'Astra Linux'
changed_when: false
failed_when: false
tags:
- setup
- python
# Создание пользователя для тестирования (ЗАКОММЕНТИРОВАНО)
# - name: Create test user
# user:
# name: testuser
# shell: /bin/bash
# create_home: yes
# state: present
# tags:
# - setup
# - user
# Настройка sudo для тестового пользователя (ЗАКОММЕНТИРОВАНО)
# - name: Configure sudo for test user
# lineinfile:
# path: /etc/sudoers
# line: "testuser ALL=(ALL) NOPASSWD:ALL"
# state: present
# validate: 'visudo -cf %s'
# tags:
# - setup
# - sudo
# Создание директории для тестов (ЗАКОММЕНТИРОВАНО)
# - name: Create test directory
# file:
# path: /tmp/ansible-test
# state: directory
# mode: '0755'
# owner: testuser
# group: testuser
# tags:
# - setup
# - directory
- import_playbook: ../../roles/deploy.yml

View File

@@ -1,4 +1,7 @@
---
# =============================================================================
# VERIFY - Проверка тестовых инстансов
# =============================================================================
- hosts: localhost
gather_facts: false
vars:
@@ -14,16 +17,37 @@
groups: [test]
tasks:
# =============================================================================
# НАСТРОЙКА - Загрузка конфигурации
# =============================================================================
- name: Configuration setup
debug:
msg: |
================================================================================
НАСТРОЙКА - Загрузка конфигурации
================================================================================
Preset: {{ preset_name }}
================================================================================
- name: Load preset configuration
include_vars: "{{ preset_file }}"
when: preset_file is file
ignore_errors: true
# Проверка systemd узлов
- name: Check systemd nodes status
community.docker.docker_container_exec:
container: "{{ item.name }}"
command: systemctl is-system-running
# =============================================================================
# ПРОВЕРКА SYSTEMD УЗЛОВ - Статус systemd контейнеров
# =============================================================================
- name: Systemd nodes verification
debug:
msg: |
================================================================================
ПРОВЕРКА SYSTEMD УЗЛОВ - Статус systemd контейнеров
================================================================================
Count: {{ hosts | selectattr('type','undefined') | list | length }}
================================================================================
- name: Check systemd nodes status (Podman exec)
command: "podman exec {{ item.name }} systemctl is-system-running"
loop: "{{ hosts | selectattr('type','undefined') | list }}"
loop_control: { label: "{{ item.name }}" }
register: systemd_status
@@ -35,43 +59,23 @@
loop: "{{ systemd_status.results | default([]) }}"
when: systemd_status is defined
# Проверка DinD узлов
- name: Check DinD nodes docker daemon
community.docker.docker_container_exec:
container: "{{ item.name }}"
command: docker version --format '{{.Server.Version}}'
loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list }}"
loop_control: { label: "{{ item.name }}" }
register: dind_status
ignore_errors: true
- name: Display DinD nodes status
debug:
msg: "DinD node {{ item.0.name }}: Docker {{ item.1.stdout | default('not running') }}"
loop: "{{ dind_status.results | default([]) }}"
when: dind_status is defined
# Проверка DOoD узлов
- name: Check DOoD nodes docker access
community.docker.docker_container_exec:
container: "{{ item.name }}"
command: docker ps --format '{{.Names}}'
# Проверка POoD узлов (Podman-out-of-Podman)
- name: Check POoD nodes podman access
command: "podman exec {{ item.name }} podman ps --format '{{'{{' }}.Names{{ '}}' }}'"
loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dood') | list }}"
loop_control: { label: "{{ item.name }}" }
register: dood_status
ignore_errors: true
- name: Display DOoD nodes status
- name: Display POoD nodes status
debug:
msg: "DOoD node {{ item.0.name }}: Can access {{ item.1.stdout_lines | length | default(0) }} containers"
msg: "POoD node {{ item.0.name }}: Can access {{ item.1.stdout_lines | length | default(0) }} containers"
loop: "{{ dood_status.results | default([]) }}"
when: dood_status is defined
# Проверка сетевого подключения
- name: Test network connectivity between nodes
community.docker.docker_container_exec:
container: "{{ item.0.name }}"
command: ping -c 1 {{ item.1.name }}
command: "podman exec {{ item.0.name }} ping -c 1 {{ item.1.name }}"
loop: "{{ hosts | subelements(hosts, 'name') }}"
loop_control: { label: "{{ item.0.name }} -> {{ item.1.name }}" }
when: item.0.name != item.1.name
@@ -86,9 +90,7 @@
# Проверка портов
- name: Check published ports
community.docker.docker_container_exec:
container: "{{ item.name }}"
command: netstat -tlnp
command: "podman exec {{ item.name }} netstat -tlnp 2>/dev/null || podman exec {{ item.name }} ss -tlnp"
loop: "{{ hosts | selectattr('publish','defined') | list }}"
loop_control: { label: "{{ item.name }}" }
register: port_status
@@ -113,11 +115,10 @@
- name: Display verification summary
debug:
msg: |
✅ Verification Summary:
✅ Verification Summary (Podman):
- Total hosts: {{ hosts | length }}
- Systemd nodes: {{ hosts | selectattr('type','undefined') | list | length }}
- DinD nodes: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list | length }}
- DOoD nodes: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dood') | list | length }}
- POoD nodes: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dood') | list | length }}
- Groups: {{ groups_map.keys() | list | join(', ') }}
- Network: {{ docker_network }}

106
molecule/presets/cod.yml Normal file
View File

@@ -0,0 +1,106 @@
---
# COD пресет с 6 контейнерами (Ubuntu + Debian + Alt + Astra + CentOS + RHEL)
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Описание: Пресет для тестирования ролей на различных ОС
# Использует образы Ubuntu, Debian, Alt, Astra, CentOS, RHEL (все ARM64)
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# Используем стабильные образы Ubuntu, Debian, Alt, Astra, CentOS, RHEL (все ARM64)
images:
ubuntu: "inecs/ansible-lab:ubuntu22-latest"
debian: "inecs/ansible-lab:debian12-latest"
alt: "inecs/ansible-lab:alt10-latest"
astra: "inecs/ansible-lab:astra-linux-arm64-latest" # ARM64 образ
centos: "inecs/ansible-lab:centos9-latest" # ARM64 образ
rhel: "inecs/ansible-lab:rhel-latest" # ARM64 образ
# Настройки для ARM64
# Используем нативные ARM64 образы
platform: "linux/arm64"
# Настройки Docker для ARM64
docker_options:
platform: "linux/arm64"
systemd_defaults:
privileged: true
command: "/bin/bash -c \"while true; do sleep 30; done\""
platform: "linux/arm64" # Используем ARM64
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
# Принудительная установка платформы для всех операций Docker
docker_platform: "linux/amd64"
hosts:
# =============================================================================
# UBUNTU СЕРВЕРЫ
# =============================================================================
#- name: ubuntu1
# family: ubuntu
# groups: [cod, ubuntu]
# platform: "linux/arm64" # Используем ARM64
# docker_options:
# platform: "linux/arm64"
# docker_platform: "linux/arm64"
# =============================================================================
# DEBIAN СЕРВЕРЫ
# =============================================================================
#- name: debian1
# family: debian
# groups: [cod, debian]
# platform: "linux/arm64" # Используем ARM64
# docker_options:
# platform: "linux/arm64"
# docker_platform: "linux/arm64"
# =============================================================================
# ALT СЕРВЕРЫ
# =============================================================================
- name: alt1
family: alt
groups: [cod, alt]
platform: "linux/arm64" # Используем ARM64
docker_options:
platform: "linux/arm64"
docker_platform: "linux/arm64"
# =============================================================================
# ASTRA СЕРВЕРЫ (ARM64)
# =============================================================================
- name: astra1
family: astra
groups: [cod, astra]
platform: "linux/arm64" # Используем ARM64
docker_options:
platform: "linux/arm64"
docker_platform: "linux/arm64"
# =============================================================================
# CENTOS СЕРВЕРЫ (ARM64)
# =============================================================================
#- name: centos1
# family: centos
# groups: [cod, centos]
# platform: "linux/arm64" # Используем ARM64
# docker_options:
# platform: "linux/arm64"
# docker_platform: "linux/arm64"
# =============================================================================
# RHEL СЕРВЕРЫ (ARM64)
# =============================================================================
#- name: rhel1
# family: rhel
# groups: [cod, rhel]
# platform: "linux/arm64" # Используем ARM64
# docker_options:
# platform: "linux/arm64"
# docker_platform: "linux/arm64"

View File

@@ -8,7 +8,8 @@ generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы
images:
alt: "inecs/ansible-lab:alt-linux-latest"
alt9: "inecs/ansible-lab:alt9-latest"
alt10: "inecs/ansible-lab:alt10-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos7: "inecs/ansible-lab:centos7-latest"

View File

@@ -9,7 +9,8 @@ generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы
images:
alt: "inecs/ansible-lab:alt-linux-latest"
alt9: "inecs/ansible-lab:alt9-latest"
alt10: "inecs/ansible-lab:alt10-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos7: "inecs/ansible-lab:centos7-latest"

View File

@@ -8,7 +8,8 @@ generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы
images:
alt: "inecs/ansible-lab:alt-linux-latest"
alt9: "inecs/ansible-lab:alt9-latest"
alt10: "inecs/ansible-lab:alt10-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos7: "inecs/ansible-lab:centos7-latest"

View File

@@ -8,7 +8,8 @@ generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы
images:
alt: "inecs/ansible-lab:alt-linux-latest"
alt9: "inecs/ansible-lab:alt9-latest"
alt10: "inecs/ansible-lab:alt10-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos7: "inecs/ansible-lab:centos7-latest"

View File

@@ -8,7 +8,8 @@ generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы
images:
alt: "inecs/ansible-lab:alt-linux-latest"
alt9: "inecs/ansible-lab:alt9-latest"
alt10: "inecs/ansible-lab:alt10-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos7: "inecs/ansible-lab:centos7-latest"

View File

@@ -0,0 +1,45 @@
---
#description: Минимальный пресет для быстрого тестирования с 1 хостом (Debian)
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы
images:
alt9: "inecs/ansible-lab:alt9-latest"
alt10: "inecs/ansible-lab:alt10-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos7: "inecs/ansible-lab:centos7-latest"
centos8: "inecs/ansible-lab:centos8-latest"
centos9: "inecs/ansible-lab:centos9-latest"
alma: "inecs/ansible-lab:alma-latest"
rocky: "inecs/ansible-lab:rocky-latest"
redos: "inecs/ansible-lab:redos-latest"
ubuntu20: "inecs/ansible-lab:ubuntu20-latest"
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
ubuntu24: "inecs/ansible-lab:ubuntu24-latest"
debian9: "inecs/ansible-lab:debian9-latest"
debian10: "inecs/ansible-lab:debian10-latest"
debian11: "inecs/ansible-lab:debian11-latest"
debian12: "inecs/ansible-lab:debian12-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
hosts:
# Минимальный набор - один хост
- name: u1
family: astra
groups: [test]
supported_platforms: ["linux/amd64"] # Только amd64
- name: u2
family: alt
groups: [test]

View File

@@ -8,7 +8,8 @@ generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы для разных ОС
images:
alt: "inecs/ansible-lab:alt-linux-latest"
alt9: "inecs/ansible-lab:alt9-latest"
alt10: "inecs/ansible-lab:alt10-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos7: "inecs/ansible-lab:centos7-latest"

View File

@@ -8,7 +8,8 @@ generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы
images:
alt: "inecs/ansible-lab:alt-linux-latest"
alt9: "inecs/ansible-lab:alt9-latest"
alt10: "inecs/ansible-lab:alt10-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos7: "inecs/ansible-lab:centos7-latest"

View File

@@ -8,7 +8,8 @@ generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы
images:
alt: "inecs/ansible-lab:alt-linux-latest"
alt9: "inecs/ansible-lab:alt9-latest"
alt10: "inecs/ansible-lab:alt10-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos7: "inecs/ansible-lab:centos7-latest"

View File

@@ -8,7 +8,8 @@ generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы
images:
alt: "inecs/ansible-lab:alt-linux-latest"
alt9: "inecs/ansible-lab:alt9-latest"
alt10: "inecs/ansible-lab:alt10-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos7: "inecs/ansible-lab:centos7-latest"

View File

@@ -8,7 +8,8 @@ generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы
images:
alt: "inecs/ansible-lab:alt-linux-latest"
alt9: "inecs/ansible-lab:alt9-latest"
alt10: "inecs/ansible-lab:alt10-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos7: "inecs/ansible-lab:centos7-latest"
@@ -33,6 +34,20 @@ systemd_defaults:
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
# Kind кластеры (опционально)
# kind_clusters:
# - name: lab
# workers: 2
# api_port: 6443
# addons:
# ingress_nginx: true
# metrics_server: true
# istio: true
# kiali: true
# prometheus_stack: true
# ingress_host_http_port: 8081
# ingress_host_https_port: 8443
hosts:
# Стандартный набор - 3 хоста
- name: u1

View File

@@ -8,7 +8,8 @@ generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы
images:
alt: "inecs/ansible-lab:alt-linux-latest"
alt9: "inecs/ansible-lab:alt9-latest"
alt10: "inecs/ansible-lab:alt10-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos7: "inecs/ansible-lab:centos7-latest"

View File

@@ -29,7 +29,7 @@ hosts:
- name: ubuntu20-2
family: ubuntu20
groups: [ubuntu, test, db]
publish: ["8021:80"]
publish: ["8026:80"]
# Ubuntu 22.04 LTS
- name: ubuntu22-1

93
molecule/presets/geop.yml Normal file
View File

@@ -0,0 +1,93 @@
---
# Геополитический пресет с 5 контейнерами (Ubuntu + Debian + Alt + Astra + RedOS)
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Описание: Пресет для тестирования ролей на различных ОС
# Использует образы Ubuntu, Debian, Alt, Astra и RedOS
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# Используем стабильные образы Ubuntu, Debian, Alt, Astra и RedOS (ARM64)
images:
ubuntu: "inecs/ansible-lab:ubuntu22-latest"
debian: "inecs/ansible-lab:debian12-latest"
alt: "inecs/ansible-lab:alt10-latest"
astra: "inecs/ansible-lab:astra-latest-arm64" # ARM64 образ
redos: "inecs/ansible-lab:redos-latest-arm64" # ARM64 образ
# Настройки для ARM64
# Используем нативные ARM64 образы
platform: "linux/arm64"
# Настройки Docker для ARM64
docker_options:
platform: "linux/arm64"
systemd_defaults:
privileged: true
command: "/bin/bash -c \"while true; do sleep 30; done\""
platform: "linux/arm64" # Используем ARM64
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
# Принудительная установка платформы для всех операций Docker
docker_platform: "linux/amd64"
hosts:
# =============================================================================
# UBUNTU СЕРВЕРЫ
# =============================================================================
- name: ubuntu1
family: ubuntu
groups: [geop, ubuntu]
platform: "linux/arm64" # Используем ARM64
docker_options:
platform: "linux/arm64"
docker_platform: "linux/arm64"
# =============================================================================
# DEBIAN СЕРВЕРЫ
# =============================================================================
- name: debian1
family: debian
groups: [geop, debian]
platform: "linux/arm64" # Используем ARM64
docker_options:
platform: "linux/arm64"
docker_platform: "linux/arm64"
# =============================================================================
# ALT СЕРВЕРЫ
# =============================================================================
- name: alt1
family: alt
groups: [geop, alt]
platform: "linux/arm64" # Используем ARM64
docker_options:
platform: "linux/arm64"
docker_platform: "linux/arm64"
# =============================================================================
# ASTRA СЕРВЕРЫ (ARM64)
# =============================================================================
- name: astra1
family: astra
groups: [geop, astra]
platform: "linux/arm64" # Используем ARM64
docker_options:
platform: "linux/arm64"
docker_platform: "linux/arm64"
# =============================================================================
# REDOS СЕРВЕРЫ (ARM64)
# =============================================================================
#- name: redos1
# family: redos
# groups: [geop, redos]
# platform: "linux/arm64" # Используем ARM64
# docker_options:
# platform: "linux/arm64"
# docker_platform: "linux/arm64"

View File

@@ -0,0 +1,55 @@
---
# ПРЕСЕТ: Kubernetes + Istio Full Stack (1 кластер с полным стеком)
#
# Описание: Полноценный Kubernetes кластер с полным стеком Istio
# - 1 Kind кластер с 3 workers
# - Полный Istio service mesh с Kiali
# - Prometheus + Grafana для мониторинга
# - Jaeger для трассировки
# - Все аддоны включены
#
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/k8s-istio-full.yml
#
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
docker_network: labnet
kind_clusters:
- name: istio-full
workers: 3
api_port: 6443
addons:
ingress_nginx: true
metrics_server: true
istio: true
kiali: true
prometheus_stack: true
ingress_host_http_port: 8081
ingress_host_https_port: 8443
images:
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
rhel: "quay.io/centos/centos:stream9-systemd"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
tmpfs:
- "/run"
- "/run/lock"
capabilities:
- "SYS_ADMIN"
hosts:
- name: k8s-controller
group: controllers
family: debian
publish:
- "6443:6443"
- "9090:9090" # Prometheus
- "3000:3000" # Grafana
- "16686:16686" # Jaeger
- "20001:20001" # Kiali

View File

@@ -0,0 +1,42 @@
---
#description: Минимальный Kind кластер без аддонов
# Автор: Сергей Антропов
# Сайт: 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"
centos7: "inecs/ansible-lab:centos7-latest"
centos8: "inecs/ansible-lab:centos8-latest"
centos9: "inecs/ansible-lab:centos9-latest"
alma: "inecs/ansible-lab:alma-latest"
rocky: "inecs/ansible-lab:rocky-latest"
redos: "inecs/ansible-lab:redos-latest"
ubuntu20: "inecs/ansible-lab:ubuntu20-latest"
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
ubuntu24: "inecs/ansible-lab:ubuntu24-latest"
debian9: "inecs/ansible-lab:debian9-latest"
debian10: "inecs/ansible-lab:debian10-latest"
debian11: "inecs/ansible-lab:debian11-latest"
debian12: "inecs/ansible-lab:debian12-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
# Minikube (драйвер podman) — минимальный кластер без аддонов
minikube_profile: minikube
minikube_cpus: "2"
minikube_memory: "4096"
minikube_addons: []
hosts: []

View File

@@ -0,0 +1,81 @@
---
# ПРЕСЕТ: Kubernetes Multi-Cluster (3 кластера)
#
# Описание: Несколько Kind кластеров для тестирования мульти-кластерных сценариев
# - 3 Kind кластера: dev, staging, prod
# - Различные конфигурации для каждого окружения
# - Полный стек мониторинга и service mesh
#
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/k8s-multi.yml
#
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
docker_network: labnet
kind_clusters:
- name: dev
workers: 1
api_port: 6443
addons:
ingress_nginx: true
metrics_server: true
ingress_host_http_port: 8081
ingress_host_https_port: 8443
- name: staging
workers: 2
api_port: 6444
addons:
ingress_nginx: true
metrics_server: true
istio: true
kiali: true
ingress_host_http_port: 8082
ingress_host_https_port: 8444
- name: prod
workers: 3
api_port: 6445
addons:
ingress_nginx: true
metrics_server: true
istio: true
kiali: true
prometheus_stack: true
ingress_host_http_port: 8083
ingress_host_https_port: 8445
images:
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
rhel: "quay.io/centos/centos:stream9-systemd"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
tmpfs:
- "/run"
- "/run/lock"
capabilities:
- "SYS_ADMIN"
hosts:
- name: k8s-dev-controller
group: controllers
family: debian
publish:
- "6443:6443"
- name: k8s-staging-controller
group: controllers
family: rhel
publish:
- "6444:6444"
- name: k8s-prod-controller
group: controllers
family: debian
publish:
- "6445:6445"

View File

@@ -0,0 +1,46 @@
---
# ПРЕСЕТ: Kubernetes Single Node (1 кластер)
#
# Описание: Одиночный Kind кластер для простого тестирования K8s ролей
# - 1 Kind кластер с 1 worker
# - Базовые аддоны: Ingress NGINX, Metrics Server
# - Простая конфигурация для быстрого старта
#
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/k8s-single.yml
#
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
docker_network: labnet
kind_clusters:
- name: single
workers: 1
api_port: 6443
addons:
ingress_nginx: true
metrics_server: true
ingress_host_http_port: 8081
ingress_host_https_port: 8443
images:
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
rhel: "quay.io/centos/centos:stream9-systemd"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
tmpfs:
- "/run"
- "/run/lock"
capabilities:
- "SYS_ADMIN"
hosts:
- name: k8s-controller
group: controllers
family: debian
publish:
- "6443:6443"

View File

@@ -0,0 +1,66 @@
---
#description: Пресет для тестирования с Kubernetes Kind кластером
# Автор: Сергей Антропов
# Сайт: 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"
centos7: "inecs/ansible-lab:centos7-latest"
centos8: "inecs/ansible-lab:centos8-latest"
centos9: "inecs/ansible-lab:centos9-latest"
alma: "inecs/ansible-lab:alma-latest"
rocky: "inecs/ansible-lab:rocky-latest"
redos: "inecs/ansible-lab:redos-latest"
ubuntu20: "inecs/ansible-lab:ubuntu20-latest"
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
ubuntu24: "inecs/ansible-lab:ubuntu24-latest"
debian9: "inecs/ansible-lab:debian9-latest"
debian10: "inecs/ansible-lab:debian10-latest"
debian11: "inecs/ansible-lab:debian11-latest"
debian12: "inecs/ansible-lab:debian12-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
# Kind кластеры с полным набором аддонов
kind_clusters:
- name: lab
workers: 2
api_port: 6443
addons:
ingress_nginx: true
metrics_server: true
istio: true
kiali: true
prometheus_stack: true
# Порты для доступа к аддонам извне
# Ingress HTTP: http://localhost:8081
# Ingress HTTPS: https://localhost:8443
# Prometheus: http://localhost:9090
# Grafana: http://localhost:3000 (admin/admin)
# Kiali: http://localhost:20001
# Metrics Server: http://localhost:4443
addon_ports:
ingress_http: 8081
ingress_https: 8443
prometheus: 9090
grafana: 3000
kiali: 20001
metrics_server: 4443
hosts: []
# # Стандартный набор - 2 хоста для базового тестирования (стабильные ОС)
# - name: u1
# family: ubuntu22
# groups: [test, web]

View File

@@ -8,7 +8,8 @@ generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы
images:
alt: "inecs/ansible-lab:alt-linux-latest"
alt9: "inecs/ansible-lab:alt9-latest"
alt10: "inecs/ansible-lab:alt10-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos7: "inecs/ansible-lab:centos7-latest"
@@ -34,11 +35,8 @@ systemd_defaults:
capabilities: ["SYS_ADMIN"]
hosts:
# Минимальный набор - один хост
# Минимальный набор - один хост Astra Linux для arm64
- name: u1
family: astra
groups: [test]
supported_platforms: ["linux/amd64"] # Только amd64
- name: u2
family: alt
groups: [test]
supported_platforms: ["linux/arm64", "linux/amd64"]

View File

@@ -0,0 +1,47 @@
---
#description: Стандартный пресет по умолчанию для тестирования с 2 хостами (Ubuntu + Debian)
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
docker_network: labnet
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
# systemd-ready образы
images:
alt9: "inecs/ansible-lab:alt9-latest"
alt10: "inecs/ansible-lab:alt10-latest"
astra: "inecs/ansible-lab:astra-linux-latest"
rhel: "inecs/ansible-lab:rhel-latest"
centos7: "inecs/ansible-lab:centos7-latest"
centos8: "inecs/ansible-lab:centos8-latest"
centos9: "inecs/ansible-lab:centos9-latest"
alma: "inecs/ansible-lab:alma-latest"
rocky: "inecs/ansible-lab:rocky-latest"
redos: "inecs/ansible-lab:redos-latest"
ubuntu20: "inecs/ansible-lab:ubuntu20-latest"
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
ubuntu24: "inecs/ansible-lab:ubuntu24-latest"
debian9: "inecs/ansible-lab:debian9-latest"
debian10: "inecs/ansible-lab:debian10-latest"
debian11: "inecs/ansible-lab:debian11-latest"
debian12: "inecs/ansible-lab:debian12-latest"
systemd_defaults:
privileged: true
command: "/sbin/init"
volumes:
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
tmpfs: ["/run", "/run/lock"]
capabilities: ["SYS_ADMIN"]
hosts:
# Стандартный набор - 2 хоста для базового тестирования (стабильные ОС)
- name: u1
family: ubuntu22
groups: [test]
- name: u2
family: debian12
groups: [test]
- name: u3
family: centos9
groups: [test]

View File

@@ -3,8 +3,53 @@
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: Развертывание всех ролей
- name: Установка роли repo
hosts: all
become: true
pre_tasks:
- name: Running role repo
debug:
msg: |
================================================================================
Запуск роли repo
================================================================================
roles:
- ping
# - devops
- repo
# - name: Установка роли devops
# hosts: all
# become: true
# pre_tasks:
# - name: Running role devops
# debug:
# msg: |
# ================================================================================
# Запуск роли devops
# ================================================================================
# roles:
# - devops
# - name: Установка роли docker
# hosts: all
# become: true
# pre_tasks:
# - name: Running role docker
# debug:
# msg: |
# ================================================================================
# Запуск роли docker
# ================================================================================
# roles:
# - docker
# - name: Установка роли python
# hosts: all
# become: true
# pre_tasks:
# - name: Running role python
# debug:
# msg: |
# ================================================================================
# Запуск роли python
# ================================================================================
# roles:
# - python

View File

@@ -1,122 +0,0 @@
# Быстрый старт - Роль devops
## Автор
Сергей Антропов
Сайт: https://devops.org.ru
## Что делает роль
Роль `devops` автоматически:
1. ✅ Создает пользователя `devops`
2. ✅ Генерирует безопасный пароль (30 символов)
3. ✅ Настраивает SSH доступ по ключу
4. ✅ Добавляет права sudo без пароля
5. ✅ Создает домашнюю директорию
6. ✅ Автоматически определяет ОС и настраивает группы
7. ✅ Поддерживает все ОС из dockerfiles (Ubuntu, Debian, RHEL, CentOS, Rocky, AlmaLinux, Astra Linux, ALT Linux, RedOS)
## Быстрый запуск
### 1. Базовое использование
```bash
ansible-playbook -i inventory/hosts.ini roles/deploy.yml
```
### 2. С SSH ключом из vault
```bash
ansible-playbook -i inventory/hosts.ini roles/deploy.yml \
--ask-vault-pass \
-e "devops_ssh_public_key={{ devops_ssh_keys.public_key }}"
```
### 3. Только роль devops
```bash
ansible-playbook -i inventory/hosts.ini roles/devops/playbook.yml
```
## Проверка результата
После выполнения проверьте:
```bash
# Проверка пользователя
ansible all -i inventory/hosts.ini -m shell -a "id devops"
# Проверка sudo прав
ansible all -i inventory/hosts.ini -m shell -a "sudo -l -U devops"
# Проверка SSH директории
ansible all -i inventory/hosts.ini -m shell -a "ls -la /home/devops/.ssh/"
```
## Настройка SSH ключа
1. Добавьте ваш SSH ключ в `vault/secrets.yml`:
```yaml
devops_ssh_keys:
public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC7vbqajDhA... your@email.com"
```
2. Запустите playbook с передачей ключа:
```bash
ansible-playbook -i inventory/hosts.ini roles/deploy.yml \
--ask-vault-pass \
-e "devops_ssh_public_key={{ devops_ssh_keys.public_key }}"
```
## Кастомизация
### Изменить имя пользователя
```yaml
vars:
devops_user:
name: "myuser"
home: "/home/myuser"
```
### Изменить длину пароля
```yaml
vars:
devops_password:
length: 40
```
### Добавить группы
```yaml
vars:
devops_user:
groups: ["sudo", "docker", "wheel", "adm"]
```
## Безопасность
- 🔒 Пароль генерируется автоматически и не сохраняется в логах
- 🔑 SSH доступ только по ключу (если настроен)
- 🛡️ Пользователь добавлен в sudoers с правами NOPASSWD
- 📁 SSH директория имеет правильные права доступа (700)
## Troubleshooting
### Проблема: Пользователь не создан
```bash
# Проверьте права sudo
ansible all -i inventory/hosts.ini -m shell -a "sudo whoami"
```
### Проблема: SSH не работает
```bash
# Проверьте права на SSH директорию
ansible all -i inventory/hosts.ini -m shell -a "ls -la /home/devops/.ssh/"
```
### Проблема: Sudo не работает
```bash
# Проверьте sudoers файл
ansible all -i inventory/hosts.ini -m shell -a "sudo visudo -c"
```
## Поддержка
- 📧 Email: через сайт https://devops.org.ru
- 📖 Документация: `roles/devops/README.md`
- 🧪 Тесты: `roles/devops/tests/test.yml`

View File

@@ -1,177 +1,248 @@
# Роль devops
Роль для создания пользователя devops с безопасным паролем, SSH доступом и правами sudo.
Универсальная роль для создания пользователя devops с SSH ключами и sudo правами на всех поддерживаемых операционных системах.
## Автор
Сергей Антропов
**Сергей Антропов**
Сайт: https://devops.org.ru
## Описание
Эта роль выполняет следующие функции:
1. Создание пользователя `devops`
2. Генерация безопасного пароля длиной 30 символов
3. Назначение пароля пользователю
4. Добавление пользователя в sudoers с правами выполнения команд без пароля
5. Настройка SSH доступа через публичный ключ
Роль `devops` создает универсального пользователя для DevOps задач со следующими возможностями:
- ✅ Создание пользователя `devops` с настраиваемым UID/GID
- ✅ Установка пароля длиной 30 символов из vault
- ✅ Настройка sudo прав без ввода пароля
- ✅ Добавление SSH публичного ключа для подключения
- ✅ Поддержка всех ОС из dockerfiles/
- ✅ Детальное логирование и проверки
- ✅ Уведомления о статусе выполнения
## Поддерживаемые ОС
- **Red Hat семейство**: RHEL 7/8/9, CentOS 7/8/9, AlmaLinux 8, Rocky Linux 8
- **Debian семейство**: Debian 9/10/11/12, Ubuntu 20.04/22.04/24.04
- **SUSE**: SLES 15.x
- **Alpine**: 3.15+
- **Российские ОС**: Astra Linux 1.7, RED OS 7/9, ALT Linux 9/10
## Требования
- Ansible >= 2.9
- Python >= 3.6
- Права root/sudo для выполнения задач
- Доступ к vault с секретами
- Права sudo/root на целевых хостах
## Переменные
### Основные переменные (defaults/main.yml)
### Основные переменные
```yaml
# Настройки пользователя devops
devops_user:
name: "devops"
home: "/home/devops"
shell: "/bin/bash"
groups: ["sudo", "docker"]
create_home: true
state: "present"
| Переменная | По умолчанию | Описание |
|------------|--------------|----------|
| `devops_user` | `devops` | Имя пользователя |
| `devops_group` | `devops` | Основная группа пользователя |
| `devops_home` | `/home/devops` | Домашняя директория |
| `devops_shell` | `/bin/bash` | Оболочка пользователя |
| `devops_uid` | `1001` | UID пользователя |
| `devops_gid` | `1001` | GID группы |
# Настройки пароля
devops_password:
length: 30
special_chars: true
min_special: 4
min_upper: 4
min_lower: 4
min_digits: 4
### Переменные из vault
# Настройки sudo
devops_sudo:
nopasswd: true
commands: "ALL"
| Переменная | Описание | Обязательная |
|------------|----------|--------------|
| `vault_devops_password` | Пароль пользователя (30 символов) | ✅ |
| `vault_devops_ssh_public_key` | SSH публичный ключ | ✅ |
# SSH настройки
devops_ssh:
authorized_keys_file: "/home/devops/.ssh/authorized_keys"
ssh_dir: "/home/devops/.ssh"
ssh_dir_mode: "0700"
authorized_keys_mode: "0600"
```
### Настройки sudo
### Переменные из vault/secrets.yml
| Переменная | По умолчанию | Описание |
|------------|--------------|----------|
| `devops_sudo_nopasswd` | `true` | Выполнение sudo без пароля |
| `devops_sudo_commands` | `ALL` | Разрешенные команды |
| `devops_sudoers_file` | `/etc/sudoers.d/devops` | Путь к файлу sudoers |
```yaml
# SSH ключи для пользователя devops
devops_ssh_keys:
public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC7vbqajDhA... devops@example.com"
```
### Настройки SSH
## Использование
| Переменная | По умолчанию | Описание |
|------------|--------------|----------|
| `devops_ssh_dir` | `/home/devops/.ssh` | SSH директория |
| `devops_ssh_authorized_keys` | `/home/devops/.ssh/authorized_keys` | Файл с ключами |
| `devops_ssh_dir_mode` | `0700` | Права на SSH директорию |
| `devops_ssh_keys_mode` | `0600` | Права на файлы ключей |
### Дополнительные группы
| Переменная | По умолчанию | Описание |
|------------|--------------|----------|
| `devops_additional_groups` | `['sudo', 'wheel', 'docker', 'systemd-journal']` | Дополнительные группы |
## Примеры использования
### Базовое использование
```yaml
- hosts: all
become: true
become: yes
roles:
- devops
```
### С передачей SSH ключа
```yaml
- hosts: all
become: true
vars:
devops_ssh_public_key: "{{ devops_ssh_keys.public_key }}"
roles:
- devops
vault_devops_password: "your-30-char-password-here"
vault_devops_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC..."
```
### С кастомными настройками
```yaml
- hosts: all
become: true
vars:
devops_user:
name: "mydevops"
home: "/home/mydevops"
devops_password:
length: 40
become: yes
roles:
- devops
vars:
devops_user: "admin"
devops_home: "/home/admin"
devops_uid: 2000
devops_gid: 2000
devops_additional_groups:
- "sudo"
- "docker"
- "kvm"
vault_devops_password: "your-30-char-password-here"
vault_devops_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC..."
```
## Безопасность
### С отключенными проверками
- Пароль генерируется автоматически с использованием криптографически стойкого алгоритма
- Пароль содержит минимум 4 символа каждого типа (специальные, заглавные, строчные, цифры)
- SSH ключи добавляются в authorized_keys для безопасного доступа
- Пользователь добавляется в sudoers с правами NOPASSWD для удобства использования
## Поддерживаемые ОС
- **Ubuntu** (focal, jammy)
- **Debian** (bullseye, bookworm)
- **RHEL** (8, 9)
- **CentOS** (8, 9)
- **Rocky Linux** (8, 9)
- **AlmaLinux** (8, 9)
- **Astra Linux** (1.7)
- **ALT Linux** (p9)
- **RedOS** (9)
### Автоматическое определение ОС
Роль автоматически определяет операционную систему и настраивает:
- **Группы пользователя**: `sudo` для Ubuntu/Debian, `wheel` для RHEL-семейства
- **Путь к sudoers**: `/etc/sudoers.d/devops`
- **Валидация sudoers**: `visudo -cf %s`
```yaml
- hosts: all
become: yes
roles:
- devops
vars:
devops_verify_user: false
devops_verify_ssh: false
devops_verify_sudo: false
devops_notify_on_success: false
vault_devops_password: "your-30-char-password-here"
vault_devops_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC..."
```
## Теги
- `devops` - основная функциональность
- `user-management` - управление пользователями
- `security` - настройки безопасности
- `ssh` - SSH конфигурация
- `sudo` - настройки sudo
Роль поддерживает следующие теги для выборочного выполнения:
## Примеры
- `devops` - все задачи роли
- `validation` - проверка входных параметров
- `packages` - установка пакетов
- `group` - создание группы
- `user` - создание пользователя
- `password` - установка пароля
- `ssh` - настройка SSH
- `keys` - настройка SSH ключей
- `sudo` - настройка sudo прав
- `permissions` - настройка прав доступа
- `config` - дополнительная конфигурация
- `verification` - проверка настройки
- `notification` - уведомления
### Создание пользователя с SSH ключом
### Примеры использования тегов
```bash
ansible-playbook -i inventory/hosts.ini playbook.yml \
--ask-vault-pass \
-e "devops_ssh_public_key={{ devops_ssh_keys.public_key }}"
# Только создание пользователя и группы
ansible-playbook -i inventory converge.yml --tags "user,group"
# Только настройка SSH
ansible-playbook -i inventory converge.yml --tags "ssh,keys"
# Только настройка sudo
ansible-playbook -i inventory converge.yml --tags "sudo,permissions"
# Пропустить проверки
ansible-playbook -i inventory converge.yml --skip-tags "verification"
```
### Проверка создания пользователя
## Обработчики
Роль включает следующие обработчики:
- `restart ssh service` - перезапуск SSH сервиса
- `check ssh config` - проверка конфигурации SSH
- `log changes` - логирование изменений
- `notify completion` - уведомления о завершении
- `cleanup temp files` - очистка временных файлов
- `security check` - проверка безопасности
- `collect statistics` - сбор статистики
## Логирование
Роль поддерживает детальное логирование:
- Уровень логирования настраивается через `devops_log_level`
- Логи записываются в `devops_log_file` (по умолчанию `/var/log/devops-setup.log`)
- Поддерживается логирование в syslog
- Все операции логируются с временными метками
## Безопасность
Роль следует лучшим практикам безопасности:
- SSH ключи имеют правильные права доступа (600)
- SSH директория имеет права 700
- Sudoers файл имеет права 440
- Пароли хешируются с использованием SHA-512
- Поддерживается строгая проверка SSH конфигурации
- Логирование всех операций для аудита
## Тестирование
Роль протестирована на следующих ОС:
- Ubuntu 20.04/22.04/24.04
- Debian 9/10/11/12
- CentOS 7/8/9
- RHEL 7/8/9
- AlmaLinux 8
- Rocky Linux 8
- SLES 15.x
- Alpine 3.15+
- Astra Linux 1.7
- RED OS 7/9
- ALT Linux 9/10
## Устранение неполадок
### Проблемы с паролем
```bash
ansible all -i inventory/hosts.ini -m shell -a "id devops"
# Проверка хеша пароля
ansible all -m debug -a "msg={{ 'your-password' | password_hash('sha512') }}"
```
## Troubleshooting
### Проблема с sudoers
Если возникают проблемы с sudoers, проверьте синтаксис:
### Проблемы с SSH
```bash
sudo visudo -c
```
# Проверка SSH конфигурации
sudo sshd -t
### Проблема с SSH
Проверьте права доступа к SSH директории:
```bash
# Проверка прав доступа
ls -la /home/devops/.ssh/
```
Должны быть права 700 для директории и 600 для authorized_keys.
### Проблемы с sudo
```bash
# Проверка sudoers файла
sudo visudo -c -f /etc/sudoers.d/devops
# Тест sudo прав
sudo -l -U devops
```
## Лицензия
MIT
## Поддержка
- Сайт: https://devops.org.ru
- Автор: Сергей Антропов

View File

@@ -3,80 +3,72 @@
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Настройки пользователя devops
devops_user:
name: "devops"
home: "/home/devops"
shell: "/bin/bash"
groups: []
create_home: true
state: "present"
# Основные настройки пользователя devops
devops_user: "devops"
devops_group: "devops"
devops_home: "/home/{{ devops_user }}"
devops_shell: "/bin/bash"
# Настройки пароля
devops_password:
length: 30
special_chars: true
min_special: 4
min_upper: 4
min_lower: 4
min_digits: 4
# Настройки пароля (обязательно из vault/secrets.yml)
devops_password: "{{ vault_devops_password }}"
# Настройки SSH ключа (обязательно из vault/secrets.yml)
devops_ssh_public_key: "{{ vault_devops_ssh_public_key }}"
# Настройки sudo
devops_sudo:
nopasswd: true
commands: "ALL"
devops_sudo_nopasswd: true
devops_sudo_commands: "ALL"
# SSH настройки
devops_ssh:
authorized_keys_file: "/home/devops/.ssh/authorized_keys"
ssh_dir: "/home/devops/.ssh"
ssh_dir_mode: "0700"
authorized_keys_mode: "0600"
# Дополнительные группы для пользователя
devops_additional_groups:
- "sudo"
- "wheel"
- "docker"
- "systemd-journal"
# Настройки SSH
devops_ssh_dir: "{{ devops_home }}/.ssh"
devops_ssh_authorized_keys: "{{ devops_ssh_dir }}/authorized_keys"
devops_ssh_dir_mode: "0700"
devops_ssh_keys_mode: "0600"
# Настройки безопасности
devops_umask: "0022"
devops_uid: 1001
devops_gid: 1001
# Настройки логирования
devops_log_level: "info"
devops_log_file: "/var/log/devops-setup.log"
# Настройки для разных ОС
devops_os_config:
# Ubuntu/Debian
ubuntu:
groups: ["sudo", "docker"]
sudo_file: "/etc/sudoers.d/devops"
sudo_validate: "visudo -cf %s"
debian:
groups: ["sudo", "docker"]
sudo_file: "/etc/sudoers.d/devops"
sudo_validate: "visudo -cf %s"
devops_package_manager:
redhat: "yum"
debian: "apt"
suse: "zypper"
alpine: "apk"
# RHEL/CentOS/Rocky/AlmaLinux
rhel:
groups: ["wheel", "docker"]
sudo_file: "/etc/sudoers.d/devops"
sudo_validate: "visudo -cf %s"
centos:
groups: ["wheel", "docker"]
sudo_file: "/etc/sudoers.d/devops"
sudo_validate: "visudo -cf %s"
rocky:
groups: ["wheel", "docker"]
sudo_file: "/etc/sudoers.d/devops"
sudo_validate: "visudo -cf %s"
alma:
groups: ["wheel", "docker"]
sudo_file: "/etc/sudoers.d/devops"
sudo_validate: "visudo -cf %s"
# Список пакетов для установки (если нужно)
devops_packages: []
# Astra Linux
astra:
groups: ["sudo", "docker"]
sudo_file: "/etc/sudoers.d/devops"
sudo_validate: "visudo -cf %s"
# Настройки для создания пользователя
devops_create_home: true
devops_system_user: false
devops_login_shell: true
# ALT Linux
alt:
groups: ["wheel", "docker"]
sudo_file: "/etc/sudoers.d/devops"
sudo_validate: "visudo -cf %s"
# Настройки для sudoers
devops_sudoers_file: "/etc/sudoers.d/{{ devops_user }}"
devops_sudoers_template: "devops_sudoers.j2"
# RedOS
redos:
groups: ["wheel", "docker"]
sudo_file: "/etc/sudoers.d/devops"
sudo_validate: "visudo -cf %s"
# Настройки для SSH
devops_ssh_config: "{{ devops_home }}/.ssh/config"
devops_ssh_known_hosts: "{{ devops_home }}/.ssh/known_hosts"
# Настройки для проверки
devops_verify_user: true
devops_verify_ssh: true
devops_verify_sudo: true
# Настройки для уведомлений
devops_notify_on_success: true
devops_notify_on_failure: true

View File

@@ -1,85 +0,0 @@
---
# Примеры использования роли devops
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Пример 1: Базовое использование
- name: "Базовое создание пользователя devops"
hosts: all
become: true
roles:
- devops
# Пример 2: С передачей SSH ключа из vault
- name: "Создание пользователя devops с SSH ключом"
hosts: all
become: true
vars:
devops_ssh_public_key: "{{ devops_ssh_keys.public_key }}"
roles:
- devops
# Пример 3: С кастомными настройками
- name: "Создание пользователя с кастомными настройками"
hosts: all
become: true
vars:
devops_user:
name: "mydevops"
home: "/home/mydevops"
devops_password:
length: 40
min_special: 6
min_upper: 6
min_lower: 6
min_digits: 6
devops_ssh:
ssh_dir: "/home/mydevops/.ssh"
authorized_keys_file: "/home/mydevops/.ssh/authorized_keys"
roles:
- devops
# Пример 4: Для конкретной ОС (RHEL/CentOS)
- name: "Создание пользователя для RHEL/CentOS"
hosts: rhel_servers
become: true
vars:
devops_os_config:
rhel:
groups: ["wheel", "docker", "adm"]
roles:
- devops
# Пример 5: Для Ubuntu/Debian
- name: "Создание пользователя для Ubuntu/Debian"
hosts: ubuntu_servers
become: true
vars:
devops_os_config:
ubuntu:
groups: ["sudo", "docker", "adm"]
roles:
- devops
# Пример 4: С дополнительными группами
- name: "Создание пользователя с дополнительными группами"
hosts: all
become: true
vars:
devops_user:
groups: ["sudo", "docker", "wheel", "adm", "systemd-journal"]
roles:
- devops
# Пример 5: Только для определенных хостов
- name: "Создание пользователя на серверах разработки"
hosts: dev_servers
become: true
vars:
devops_user:
name: "developer"
home: "/home/developer"
devops_sudo:
commands: "ALL, !/usr/bin/passwd root"
roles:
- devops

View File

@@ -3,23 +3,159 @@
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Обработчик для перезапуска SSH сервиса после изменения authorized_keys
- name: "Перезапуск SSH сервиса"
service:
name: ssh
- name: "🔄 Перезапуск SSH сервиса"
block:
- name: "Перезапуск SSH сервиса (systemd)"
listen: "restart ssh service"
systemd:
name: "{{ item }}"
state: restarted
enabled: yes
daemon_reload: yes
become: true
when: ansible_os_family != "RedHat"
loop: "{{ devops_services_to_enable }}"
when: ansible_service_mgr == "systemd"
- name: "Перезапуск SSH сервиса (RedHat/CentOS)"
- name: "Перезапуск SSH сервиса (service)"
service:
name: sshd
name: "{{ item }}"
state: restarted
enabled: yes
become: true
when: ansible_os_family == "RedHat"
loop: "{{ devops_services_to_enable }}"
when: ansible_service_mgr == "service"
# Обработчик для проверки sudo конфигурации
- name: "Проверка sudo конфигурации"
command: visudo -c
- name: "Перезапуск SSH сервиса (rc-service)"
service:
name: "{{ item }}"
state: restarted
enabled: yes
become: true
loop: "{{ devops_services_to_enable }}"
when: ansible_service_mgr == "rc-service"
- name: "🔍 Проверка конфигурации SSH"
block:
- name: "Проверка конфигурации SSH сервера"
listen: "check ssh config"
command: "sshd -t"
become: true
register: sshd_config_check
changed_when: false
failed_when: sshd_config_check.rc != 0
- name: "Логирование проверки SSH конфигурации"
debug:
msg: "SSH конфигурация проверена успешно"
when: false
- name: "📝 Логирование изменений"
block:
- name: "Запись в лог файл"
listen: "log changes"
lineinfile:
path: "{{ devops_log_file }}"
line: "{{ ansible_date_time.iso8601 }} - {{ ansible_hostname }} - {{ ansible_user_id }} - {{ ansible_play_name }} - {{ ansible_task_name }}"
create: yes
owner: root
group: root
mode: '0644'
become: true
when: devops_log_file is defined
- name: "Логирование в syslog"
syslogger:
facility: "local0"
priority: "info"
msg: "DevOps role: {{ ansible_task_name }} completed on {{ ansible_hostname }}"
when: false
- name: "🔔 Уведомления о завершении"
block:
- name: "Уведомление об успешном завершении"
listen: "notify completion"
debug:
msg: "✅ Роль devops успешно выполнена на {{ ansible_hostname }}"
when: devops_notify_on_success
- name: "Уведомление об ошибке"
debug:
msg: "❌ Ошибка при выполнении роли devops на {{ ansible_hostname }}"
when: devops_notify_on_failure
- name: "🧹 Очистка временных файлов"
block:
- name: "Удаление временных файлов"
listen: "cleanup temp files"
file:
path: "{{ item }}"
state: absent
become: true
loop:
- "/tmp/devops_setup_*"
- "/tmp/ansible_*"
ignore_errors: true
- name: "Логирование очистки"
debug:
msg: "Временные файлы очищены"
when: false
- name: "🔐 Проверка безопасности"
block:
- name: "Проверка прав доступа к файлам пользователя"
listen: "security check"
stat:
path: "{{ devops_home }}"
register: home_dir_check
- name: "Проверка прав доступа к SSH директории"
stat:
path: "{{ devops_ssh_dir }}"
register: ssh_dir_check
- name: "Проверка прав доступа к authorized_keys"
stat:
path: "{{ devops_ssh_authorized_keys }}"
register: ssh_keys_check
- name: "Проверка прав доступа к sudoers файлу"
stat:
path: "{{ devops_sudoers_file }}"
register: sudoers_file_check
- name: "Логирование проверки безопасности"
debug:
msg: |
Результаты проверки безопасности:
- Домашняя директория: {{ home_dir_check.stat.exists }}
- SSH директория: {{ ssh_dir_check.stat.exists }}
- SSH ключи: {{ ssh_keys_check.stat.exists }}
- Sudoers файл: {{ sudoers_file_check.stat.exists }}
- name: "📊 Сбор статистики"
block:
- name: "Сбор информации о пользователе"
listen: "collect statistics"
command: "id {{ devops_user }}"
register: user_info
changed_when: false
- name: "Сбор информации о группах пользователя"
command: "groups {{ devops_user }}"
register: user_groups
changed_when: false
- name: "Сбор информации о SSH ключах"
command: "wc -l {{ devops_ssh_authorized_keys }}"
register: ssh_keys_count
changed_when: false
ignore_errors: true
- name: "Логирование статистики"
debug:
msg: |
Статистика пользователя {{ devops_user }}:
- Информация: {{ user_info.stdout }}
- Группы: {{ user_groups.stdout }}
- SSH ключей: {{ ssh_keys_count.stdout | default('неизвестно') }}

View File

@@ -1,35 +1,67 @@
---
# Метаданные роли devops
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
galaxy_info:
author: Сергей Антропов
description: Роль для создания пользователя devops с безопасным паролем и SSH доступом
company: https://devops.org.ru
license: MIT
author: "Сергей Антропов"
description: "Универсальная роль для создания пользователя devops с SSH ключами и sudo правами"
company: "DevOpsLab"
license: "MIT"
min_ansible_version: "2.9"
platforms:
- name: Ubuntu
versions:
- focal
- jammy
- name: Debian
versions:
- bullseye
- bookworm
- name: EL
- name: "EL"
versions:
- "7"
- "8"
- "9"
- name: Rocky
- name: "Ubuntu"
versions:
- "8.0"
- "9.0"
- "focal"
- "jammy"
- "noble"
- name: "Debian"
versions:
- "stretch"
- "buster"
- "bullseye"
- "bookworm"
- name: "SLES"
versions:
- "15"
- "15SP1"
- "15SP2"
- "15SP3"
- "15SP4"
- "15SP5"
- name: "Alpine"
versions:
- "all"
- name: "Astra Linux"
versions:
- "1.7"
- "all"
- name: "EL"
versions:
- "7"
- "8"
- "9"
- name: "EL"
versions:
- "7"
- "8"
- "9"
galaxy_tags:
- devops
- usermanagement
- security
- ssh
- sudo
- "user"
- "devops"
- "ssh"
- "sudo"
- "security"
- "system"
- "administration"
- "automation"
- "universal"
- "crossplatform"
dependencies: []
collections: []

View File

@@ -1,50 +0,0 @@
---
# Пример playbook для роли devops
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: "Создание пользователя devops с безопасным паролем и SSH доступом"
hosts: all
become: true
gather_facts: true
vars:
# Переменная для SSH ключа (должна быть передана из vault)
devops_ssh_public_key: "{{ devops_ssh_keys.public_key }}"
roles:
- devops
post_tasks:
- name: "Проверка создания пользователя devops"
command: "id {{ devops_user.name }}"
register: user_check
failed_when: user_check.rc != 0
changed_when: false
- name: "Проверка SSH директории"
stat:
path: "{{ devops_ssh.ssh_dir }}"
register: ssh_dir_check
- name: "Проверка authorized_keys"
stat:
path: "{{ devops_ssh.authorized_keys_file }}"
register: auth_keys_check
when: devops_ssh_public_key is defined
- name: "Проверка sudo прав"
command: "sudo -l -U {{ devops_user.name }}"
register: sudo_check
become: true
changed_when: false
- name: "Вывод результатов проверки"
debug:
msg: |
Пользователь {{ devops_user.name }} создан: {{ user_check.rc == 0 }}
SSH директория создана: {{ ssh_dir_check.stat.exists }}
{% if devops_ssh_public_key is defined %}
authorized_keys создан: {{ auth_keys_check.stat.exists }}
{% endif %}
Sudo права настроены: {{ sudo_check.rc == 0 }}

View File

@@ -1,73 +1,312 @@
---
# Задачи для роли devops
# Основные задачи для роли devops
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Определение ОС и настройка переменных
- name: "Определение ОС и настройка переменных"
set_fact:
devops_os_family: "{{ ansible_os_family | lower }}"
devops_distribution: "{{ ansible_distribution | lower }}"
devops_os_name: "{{ ansible_distribution | lower if ansible_distribution is defined else ansible_os_family | lower }}"
when: ansible_os_family is defined
- name: "Reset ANSI color codes"
debug:
msg: "\033[0m"
changed_when: false
tags: [devops, color-reset]
# Определение групп пользователя в зависимости от ОС
- name: "Определение групп пользователя для {{ devops_os_name }}"
set_fact:
devops_user_groups: "{{ devops_os_config[devops_os_name].groups | default(devops_os_config[devops_os_family].groups | default(['sudo'])) }}"
devops_sudo_file: "{{ devops_os_config[devops_os_name].sudo_file | default(devops_os_config[devops_os_family].sudo_file | default('/etc/sudoers.d/devops')) }}"
devops_sudo_validate: "{{ devops_os_config[devops_os_name].sudo_validate | default(devops_os_config[devops_os_family].sudo_validate | default('visudo -cf %s')) }}"
when: devops_os_name is defined
- name: "🔍 Проверка входных параметров"
tags: [devops, validation]
block:
- name: "Проверка наличия пароля пользователя devops"
fail:
msg: |
❌ ОШИБКА: Пароль пользователя devops не определён.
# Генерация безопасного пароля для пользователя devops
- name: "Генерация безопасного пароля для пользователя devops"
set_fact:
devops_user_password: "{{ lookup('password', '/tmp/devops_password length=' + devops_password.length | string + ' chars=ascii_letters,digits,punctuation') }}"
no_log: true
Ожидаемая переменная: vault_devops_password
Где задавать: roles/devops/vars/main.yml (или переопределить на уровне инвентаря/группы/хоста)
# Создание пользователя devops
- name: "Создание пользователя devops"
Пример в roles/devops/vars/main.yml:
vault_devops_password: "ваш_пароль_здесь"
when:
- vault_devops_password is not defined
- vault_devops_password == ""
- vault_devops_password is none
- name: "Проверка наличия SSH публичного ключа"
fail:
msg: |
❌ ОШИБКА: SSH публичный ключ не определён.
Ожидаемая переменная: vault_devops_ssh_public_key
Где задавать: roles/devops/vars/main.yml (или переопределить на уровне инвентаря/группы/хоста)
Пример в roles/devops/vars/main.yml:
vault_devops_ssh_public_key: |
ssh-rsa AAAAB3... user@host
when:
- vault_devops_ssh_public_key is not defined
- vault_devops_ssh_public_key == ""
- vault_devops_ssh_public_key is none
- name: "✅ Проверка успешна - все необходимые секреты найдены"
debug:
msg: |
Все необходимые секреты найдены в переменных роли (vars/main.yml или инвентарь):
- Пароль пользователя: {{ 'установлен' if vault_devops_password is defined and vault_devops_password != '' else 'НЕ УСТАНОВЛЕН' }}
- SSH публичный ключ: {{ 'установлен' if vault_devops_ssh_public_key is defined and vault_devops_ssh_public_key != '' else 'НЕ УСТАНОВЛЕН' }}
when:
- vault_devops_password is defined
- vault_devops_password != ""
- vault_devops_ssh_public_key is defined
- vault_devops_ssh_public_key != ""
- name: "🔍 Проверка что пароль не пустой"
fail:
msg: "❌ ОШИБКА: Пароль пользователя devops не может быть пустым!"
when:
- vault_devops_password is defined
- vault_devops_password == ""
- name: "🔍 Проверка что SSH ключ не пустой"
fail:
msg: "❌ ОШИБКА: SSH публичный ключ не может быть пустым!"
when:
- vault_devops_ssh_public_key is defined
- vault_devops_ssh_public_key == ""
- name: "Логирование начала выполнения роли"
debug:
msg: "Начинаем настройку пользователя {{ devops_user }} на {{ ansible_distribution }} {{ ansible_distribution_version }}"
when: false
- name: "📦 Установка необходимых пакетов"
tags: [devops, packages]
block:
- name: "Обновление кеша пакетов (Debian/Ubuntu)"
apt:
update_cache: yes
cache_valid_time: 3600
when: devops_os_family == "debian"
- name: "Установка необходимых пакетов"
package:
name: "{{ devops_packages_to_install }}"
state: present
become: true
- name: "👤 Создание группы devops"
tags: [devops, group]
block:
- name: "Проверка существования группы {{ devops_group }}"
group:
name: "{{ devops_group }}"
state: present
gid: "{{ devops_gid }}"
become: true
register: group_create_result
- name: "Логирование создания группы"
debug:
msg: "Группа {{ devops_group }} создана/существует"
when: false
- name: "👥 Создание недостающих групп"
tags: [devops, groups, additional]
block:
- name: "Создание группы wheel (если не существует)"
group:
name: wheel
state: present
become: true
when: "'wheel' in devops_final_additional_groups"
ignore_errors: true
- name: "Создание группы sudo (если не существует)"
group:
name: sudo
state: present
become: true
when: "'sudo' in devops_final_additional_groups"
ignore_errors: true
- name: "Создание группы systemd-journal (если не существует)"
group:
name: systemd-journal
state: present
become: true
when: "'systemd-journal' in devops_final_additional_groups"
ignore_errors: true
- name: "Создание группы docker (если не существует)"
group:
name: docker
state: present
become: true
when: "'docker' in devops_final_additional_groups"
ignore_errors: true
- name: "👤 Создание пользователя devops"
tags: [devops, user, password]
block:
- name: "Проверка существования пользователя {{ devops_user }}"
user:
name: "{{ devops_user.name }}"
home: "{{ devops_user.home }}"
shell: "{{ devops_user.shell }}"
groups: "{{ devops_user_groups }}"
create_home: "{{ devops_user.create_home }}"
state: "{{ devops_user.state }}"
password: "{{ devops_user_password | password_hash('sha512') }}"
name: "{{ devops_user }}"
group: "{{ devops_group }}"
uid: "{{ devops_uid }}"
home: "{{ devops_home }}"
shell: "{{ devops_shell }}"
state: present
create_home: "{{ devops_create_home }}"
system: "{{ devops_system_user }}"
groups: "{{ devops_final_additional_groups }}"
append: yes
become: true
register: user_create_result
# Создание SSH директории для пользователя devops
- name: "Создание SSH директории для пользователя devops"
- name: "Установка пароля для пользователя {{ devops_user }}"
user:
name: "{{ devops_user }}"
password: "{{ devops_password | password_hash('sha512') }}"
update_password: always
become: true
no_log: true
register: password_set_result
- name: "Логирование создания пользователя"
debug:
msg: "Пользователь {{ devops_user }} создан/обновлен с паролем"
when: false
- name: "🔑 Настройка SSH ключей"
tags: [devops, ssh, keys]
block:
- name: "Создание директории .ssh для пользователя {{ devops_user }}"
file:
path: "{{ devops_ssh.ssh_dir }}"
path: "{{ devops_ssh_dir }}"
state: directory
owner: "{{ devops_user.name }}"
group: "{{ devops_user.name }}"
mode: "{{ devops_ssh.ssh_dir_mode }}"
owner: "{{ devops_user }}"
group: "{{ devops_group }}"
mode: "{{ devops_ssh_dir_mode }}"
become: true
# Добавление SSH ключа в authorized_keys
- name: "Добавление SSH ключа в authorized_keys"
- name: "Добавление SSH публичного ключа в authorized_keys"
authorized_key:
user: "{{ devops_user.name }}"
user: "{{ devops_user }}"
key: "{{ devops_ssh_public_key }}"
state: present
manage_dir: false
manage_dir: no
become: true
when: devops_ssh_public_key is defined
register: ssh_key_result
when: devops_ssh_public_key != ""
# Настройка sudo для пользователя devops (без пароля)
- name: "Настройка sudo для пользователя devops без пароля"
lineinfile:
path: "{{ devops_sudo_file }}"
line: "{{ devops_user.name }} ALL=(ALL) NOPASSWD: {{ devops_sudo.commands }}"
create: true
mode: '0440'
validate: "{{ devops_sudo_validate }}"
- name: "Установка правильных прав на authorized_keys"
file:
path: "{{ devops_ssh_authorized_keys }}"
owner: "{{ devops_user }}"
group: "{{ devops_group }}"
mode: "{{ devops_ssh_keys_mode }}"
become: true
when: devops_ssh_public_key != ""
# Логирование успешного создания пользователя
- name: "Логирование создания пользователя devops"
- name: "Логирование настройки SSH"
debug:
msg: "Пользователь {{ devops_user.name }} успешно создан с безопасным паролем и SSH доступом на {{ devops_os_name | default('неизвестная') }} ОС"
msg: "SSH ключ для пользователя {{ devops_user }} настроен"
when: false
- name: "🔐 Настройка sudo прав"
tags: [devops, sudo, permissions]
block:
- name: "Создание файла sudoers для пользователя {{ devops_user }}"
template:
src: "{{ devops_sudoers_template }}"
dest: "{{ devops_sudoers_file }}"
owner: root
group: root
mode: '0440'
backup: yes
become: true
register: sudoers_result
- name: "Проверка синтаксиса sudoers файла"
command: "visudo -c -f {{ devops_sudoers_file }}"
become: true
register: sudoers_check
changed_when: false
failed_when: sudoers_check.rc != 0
- name: "Логирование настройки sudo"
debug:
msg: "Sudo права для пользователя {{ devops_user }} настроены"
when: false
- name: "🔧 Настройка дополнительных параметров"
tags: [devops, config, additional]
block:
- name: "Установка umask для пользователя {{ devops_user }}"
lineinfile:
path: "{{ devops_home }}/.bashrc"
line: "umask {{ devops_umask }}"
owner: "{{ devops_user }}"
group: "{{ devops_group }}"
mode: '0644'
create: yes
backup: yes
become: true
- name: "Создание SSH конфигурации для пользователя {{ devops_user }}"
template:
src: "devops_ssh_config.j2"
dest: "{{ devops_ssh_config }}"
owner: "{{ devops_user }}"
group: "{{ devops_group }}"
mode: "0600"
backup: yes
become: true
- name: "Логирование дополнительных настроек"
debug:
msg: "Дополнительные настройки для пользователя {{ devops_user }} применены"
when: false
- name: "✅ Проверка настройки пользователя devops"
when: devops_verify_user
tags: [devops, verification, check]
block:
- name: "Проверка существования пользователя {{ devops_user }}"
command: "id {{ devops_user }}"
register: user_check
changed_when: false
failed_when: user_check.rc != 0
- name: "Проверка SSH ключа пользователя {{ devops_user }}"
stat:
path: "{{ devops_ssh_authorized_keys }}"
register: ssh_key_check
- name: "Проверка sudo прав пользователя {{ devops_user }}"
command: "sudo -l -U {{ devops_user }}"
become: true
register: sudo_check
changed_when: false
failed_when: sudo_check.rc != 0
- name: "Логирование результатов проверки"
debug:
msg: |
Результаты проверки пользователя {{ devops_user }}:
- Пользователь существует: {{ user_check.rc == 0 }}
- SSH ключ настроен: {{ ssh_key_check.stat.exists }}
- Sudo права настроены: {{ sudo_check.rc == 0 }}
- name: "📝 Уведомления о завершении"
tags: [devops, notification, success]
block:
- name: "Уведомление об успешном завершении"
debug:
msg: "✅ Пользователь {{ devops_user }} успешно настроен на {{ ansible_hostname }}"
when: devops_notify_on_success
- name: "Уведомление о настройке SSH"
debug:
msg: "🔑 SSH ключ для пользователя {{ devops_user }} настроен"
when: devops_notify_on_success and devops_verify_ssh
- name: "Уведомление о настройке sudo"
debug:
msg: "🔐 Sudo права для пользователя {{ devops_user }} настроены"
when: devops_notify_on_success and devops_verify_sudo

View File

@@ -0,0 +1,79 @@
# SSH конфигурация для пользователя {{ devops_user }}
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Создан: {{ ansible_date_time.iso8601 }}
# Основные настройки SSH клиента
Host *
# Настройки безопасности
StrictHostKeyChecking ask
UserKnownHostsFile ~/.ssh/known_hosts
IdentitiesOnly yes
# Настройки подключения
ServerAliveInterval 60
ServerAliveCountMax 3
TCPKeepAlive yes
# Настройки сжатия
Compression yes
CompressionLevel 6
# Настройки шифрования
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
# Настройки MAC
MACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha2-256,hmac-sha2-512
# Настройки KEX
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521
# Настройки аутентификации
PreferredAuthentications publickey,password
PubkeyAuthentication yes
PasswordAuthentication yes
# Настройки портов
Port 22
# Настройки таймаутов
ConnectTimeout 30
ConnectionAttempts 3
# Настройки логирования
LogLevel INFO
# Настройки для X11 forwarding (если нужно)
# ForwardX11 yes
# ForwardX11Trusted yes
# Настройки для агента SSH
ForwardAgent yes
# Настройки для туннелирования
# LocalForward 8080 localhost:80
# RemoteForward 9090 localhost:9090
# Специфичные настройки для разных хостов
# Host production
# HostName prod.example.com
# User {{ devops_user }}
# Port 2222
# IdentityFile ~/.ssh/id_rsa_prod
# StrictHostKeyChecking yes
# UserKnownHostsFile ~/.ssh/known_hosts_prod
# Host staging
# HostName staging.example.com
# User {{ devops_user }}
# Port 22
# IdentityFile ~/.ssh/id_rsa_staging
# StrictHostKeyChecking no
# Host development
# HostName dev.example.com
# User {{ devops_user }}
# Port 22
# IdentityFile ~/.ssh/id_rsa_dev
# StrictHostKeyChecking no
# UserKnownHostsFile /dev/null

View File

@@ -0,0 +1,21 @@
# Sudoers файл для пользователя {{ devops_user }}
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Создан: {{ ansible_date_time.iso8601 }}
# Разрешить пользователю {{ devops_user }} выполнять все команды без ввода пароля
{{ devops_user }} ALL=(ALL) NOPASSWD:ALL
# Дополнительные настройки безопасности
# Разрешить выполнение команд только от определенных терминалов (опционально)
# {{ devops_user }} ALL=(ALL) NOPASSWD:ALL, !/usr/bin/passwd, !/usr/bin/su
# Логирование всех команд sudo (опционально)
# Defaults logfile=/var/log/sudo.log
# Defaults log_input, log_output
# Настройки таймаута для sudo сессий (опционально)
# Defaults timestamp_timeout=15
# Разрешить выполнение команд без подтверждения для определенных команд
# {{ devops_user }} ALL=(ALL) NOPASSWD: /bin/systemctl, /usr/bin/docker, /usr/bin/kubectl

View File

@@ -1,90 +0,0 @@
---
# Тесты для роли devops
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
- name: "Тестирование роли devops"
hosts: all
become: true
gather_facts: true
vars:
devops_ssh_public_key: "{{ devops_ssh_keys.public_key }}"
roles:
- devops
post_tasks:
# Тест 1: Проверка существования пользователя
- name: "Проверка существования пользователя devops"
command: "id {{ devops_user.name }}"
register: user_exists
failed_when: user_exists.rc != 0
changed_when: false
# Тест 2: Проверка домашней директории
- name: "Проверка домашней директории"
stat:
path: "{{ devops_user.home }}"
register: home_dir
failed_when: not home_dir.stat.exists
# Тест 3: Проверка SSH директории
- name: "Проверка SSH директории"
stat:
path: "{{ devops_ssh.ssh_dir }}"
register: ssh_dir
failed_when: not ssh_dir.stat.exists
# Тест 4: Проверка authorized_keys (если SSH ключ передан)
- name: "Проверка authorized_keys"
stat:
path: "{{ devops_ssh.authorized_keys_file }}"
register: auth_keys
failed_when: devops_ssh_public_key is defined and not auth_keys.stat.exists
when: devops_ssh_public_key is defined
# Тест 5: Проверка sudo прав
- name: "Проверка sudo прав"
command: "sudo -l -U {{ devops_user.name }}"
register: sudo_rights
become: true
failed_when: sudo_rights.rc != 0
changed_when: false
# Тест 6: Проверка групп пользователя
- name: "Проверка групп пользователя"
command: "groups {{ devops_user.name }}"
register: user_groups
failed_when: user_groups.rc != 0
changed_when: false
# Тест 7: Проверка прав на SSH директорию
- name: "Проверка прав на SSH директорию"
stat:
path: "{{ devops_ssh.ssh_dir }}"
register: ssh_dir_perms
failed_when: ssh_dir_perms.stat.mode != "0" + devops_ssh.ssh_dir_mode
# Тест 8: Проверка shell пользователя
- name: "Проверка shell пользователя"
command: "getent passwd {{ devops_user.name }}"
register: user_shell
failed_when: user_shell.rc != 0
changed_when: false
# Вывод результатов тестов
- name: "Результаты тестов"
debug:
msg: |
✅ Пользователь {{ devops_user.name }} создан
✅ Домашняя директория {{ devops_user.home }} создана
✅ SSH директория {{ devops_ssh.ssh_dir }} создана
{% if devops_ssh_public_key is defined %}
✅ authorized_keys настроен
{% endif %}
✅ Sudo права настроены
✅ Группы пользователя: {{ user_groups.stdout }}
✅ Shell пользователя: {{ user_shell.stdout.split(':')[-1] }}
ОС: {{ devops_os_name | default('неизвестная') }}
✅ Группы для ОС: {{ devops_user_groups | default('не определены') }}

View File

@@ -1,25 +1,386 @@
---
# Переменные для роли devops
# Автор: Сергей Антропов
# Сайт: https://devops.org.ru
# Список пакетов, необходимых для роли
devops_required_packages:
- openssh-server
- sudo
- passwd
# Настройки безопасности для SSH
devops_ssh_security:
permit_root_login: "no"
password_authentication: "yes"
pubkey_authentication: "yes"
authorized_keys_file: ".ssh/authorized_keys"
# Настройки sudo для безопасности
devops_sudo_security:
requiretty: false
visiblepw: false
always_set_home: true
env_reset: true
env_keep: "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
$ANSIBLE_VAULT;1.1;AES256
30393164313831366361633763646433613761663339323630623464646262323739346263643965
3836316437636537656631656239323532336632386634660a303662373864313034313131366364
30623732373861323839653763393637383935333633646634393762613536386136633162656231
3462323037353437370a623838343533633633643961303761383265373062633161636562386138
33393465626363633538376161393065303766396438356138633763353962613435323030656561
66663634633536626338343763333861613562303866646365663365333738663139303230386531
65653235626537623732653431306539376433396434373530643035666564333131303737383362
38393133656137646238633538366337383961363839383162653731613232643638396134613433
37663739646663363832313465613335396432643265313964396235316631626135393231306465
62336433623630613139653530383836333566373038353035353161623162343235633034636430
62366436353965363032313630353432656434326362303938326362643134386136616431636433
39363135656561623335303936326637373066316434356534383338313739663633643938653739
61366432656262343838646139373632666438666164623830643333393563336435643762326461
62313639613633373837646538303061386632626330333739643864316166363463383235336166
39363938613434663131323466643063646431663463323636353035353630343563623233376630
63636636386565343630613438663165326237616137316333303834396337613261633765316566
36613532336234356138366330666433353764646266633564326634386263336235646335363561
63386635326664343837396539396530306230633130616664613666373530613236356631303432
39323162653135633161343331626539613866323030653030633832373536333834373365613765
36343964313539383430333761663132613530376135336561396532626330646262373462663661
31363962643161313534303566613764336633653138636631323766656361363336353062623532
36316534636136643362393432346239346463643061356438363934323937643961376232386439
63316466363234313338303830613532353238356331343134646365353637373462626662373834
65626266303966626465373365356334613039376334623764366566343964376562386336373031
66653030646531653265666138643936653033343663323365656538623764373237373638663233
30623039623866653761393264323930613866343861323934373834343032646531666439336334
32383932323464313332616139363032623061633663336130636531613036643631653032303237
64643564373533393630643364663733386662393165636635363331353033333963623130633931
61626338353937376266666165333433396639666630626166656231633062353933366639393563
31326465626531363539393861383430633530386536356336396664383637386366363731346561
33363330366635666330666265306230373462323136333935336335346238613734326464303036
64303764396265306132663735333732643337623430353539313539336339346664353461653566
35353639363938333835653961613861383334663263643532396333383738306162386663363632
61343833643139653537333665663963363565646432333939366332646364326261306237643631
33396235336134633833343561383662353133623431316663376162613463336633393963356132
62636561623838626133336563393063376662313935646464663730636536346337613565313965
30386135643132633130383330643866303436663033306362613863343939646337343733376638
35626562363664383063666333653463626162353661376462636633343534653461333738303636
66663764643465363765626336623163326161306462316561373964633461353066636631616130
64333536646362626533346462633833333761633366613362623666333639383438333431343934
39333766376563646334663638363561343766373763353761663664623931393437343864306638
38623561343064633830653533373365336136333130356434323731376563373835623461626432
30363562613235303634383766623836303361626131323734363333653435353436363137333639
35623631343838333936316466323666353863316461353063326264613763653537323765663131
37306231643138353834623065623735386133333531663762303436366531363639303131393263
36666661373965636339633162343537663236666463656236353838363837666533376232636564
36383532663865323162613962313639643265386231623231353934656261666235313132313966
66626637356632396135306630653463633436363731643031623864613833353137653762383538
37646631373231626539323333663234613563393332336465333266353763313432616337653933
39633234663137623037336639303133353764656438663438393964643135666236643333303238
64313732376430626535663534363138363434313264666663366338383837363734363739333866
31383734326166663466326137336364613964326239653134346532376636363230353964373132
36666135303935366436343131653666616233663033656634306162346166653763353038376264
38323066376333633332616636613662323335386537653162343439303466363234306232623535
31316635616132336366333462336161366262376663376164333231633538323463323539626664
30303334363762353636363837366163643237373763343137373463623832373538373738656630
63323564616434313930623462356462323566663932386439323866313437313937306230643437
65643331343838363466333061303632363131363661656232643364303339333731373932633638
63643232613232663132373062333530316433323938396336363164623761653835633666363938
31393636663566663031613061613736386364363130623265313434383931323465633533316638
65303839373737663339636362623462373533373633386362306238373130666462623534373862
63376631316637356464633438643863323735363434396131396165303733373165623331386238
66343532313235616364323564393931376439666237333466373964383634616338653634333062
64623239633630626235643765336565396662336265376538663161636464646365386162663937
37373531623463623830393436616266613330363731616234373338323732333737633563376436
34636436383632623333613230333434613731393966633738623635376630616434663661663936
33346632353137663238643731363766316462616362343161316637646161373262346533666461
32353836633437613732333038343837333637323131336363376439646535363933376133313738
39626138663338653636616634356437646139633766653730633437333765626365303564653865
35666432623331653832383064623232656462343837663934626363653734643162653061663162
64303034356530376661616562646239663061613939663666366165363733626635623938336163
34383033326531323164656132383161623439343236356236363362303961653837616261363337
64623138656434356166646238356463306531656661306566376565303533316635353337353263
32383137616163666362613137366162383338663439373334393235323562393862666162373463
37343461303430303838326435316233366364613662373437333039313835343033383837323339
33656231306666393131396235363761353933643639306532623338356131366233333237613732
61326161396137626438633833626435643365303534643963636566366631336131306536643931
62646439613465336436633539633461633833633661353637643634643765653638306338626336
64373862333134323561323337656562353634336331373563666433636539396431333238323330
63323636623061393666623433353937346537393966623438343061383638323631393333333863
37306366366236663565633133303766643035346165643635363962326536393531633236326565
37646638303139636435663133376336333230336239326666323664386630613230666666333137
65376339633763326136353031313034333835363538306532623339643163303436653730656636
38333735353037373064613962663236643461376336613934646463356165626661346662336266
61306262363835623062613561393431643133613462643334396336363238633731396538643034
62633632373962646162623337373561356163393936333635636233636166643339613165346231
39323031316363656539613732373833353334356265376662383538656532333639303435623763
36666363313064623734633564613734353034393366376166653463636335623431663962376436
36373866623631363737623939396563636336636334393763333163333066643331326563333532
35326436646139346430633264396638303766663237396630383439343266363164316435613637
32323838636632626461373439306437326432383864386561336338633866643639313230663737
65616365316162336661396234323735343766303031396236613363633864356531333531353235
33373865366332336432353130386333313335313239333339396232356436643034353830323036
61613362376265643131613636393831393932653965383261303733653734396536343630333436
64613834616236623534393665383164373934303163663163313231653937306436363865386637
65666136326161626238313334373237363731333532346364346464633265643730666530636534
34623031346439373033346434666466646137623765396435363561363263666566393433303636
38323736303466383739373336646664343563333561623938346337303331343132323166373338
37396536356530633263303666356439326562393535646139323666343632366636353365343230
37626130396238313132633065633864373739626433333832336130613661313838353239303239
39633435313966646665313065643230623231626266326536383664616463353664653562333236
34373965326639363730386262643931666138653530396565656665363239656537356361616562
32343435636466653634383365343364373030633731323265383438646339393466396236613638
63643466323061656264323065323533653265336261396435343036383136343436346231663933
32303437343264363866663639653331303731653163613636616333323462346261376364343565
35336431393632636464353463613464393633373335366232646262353532616165613334663737
63623962636637626133643532363230343263613937623430363462633038616665333262636230
37346336356262653132663330646339353964353637653865633566386233623536336234336265
63326563336265343131396466313430323937653039376136643238323037346538633139386231
39653236306365363665343333326331643464393934656663303166373737623637636339653337
30383961643865386434346433626633653737306134653436666461623031623962366165663133
62343764623230363466636162633532303733363534373037323932373830663464643735343636
61343563333130663039643138363463336538313434616332356431376235383037623036373562
64666430613138343039383262393965666130383136336634343166323361646438326635303639
64373434303236633130626566373135613536633532386534343361333664356562366365666539
65653865393862376365633135333733643939663466376137396432363337326634323638643462
61376361643739316337373039383030376663343136393430333939346139326333613562333036
35383330616266323463653838323666356461633132626164633761656639396131336561666634
65303432666634643931616161366461343663336239376463316634393863383839313661303832
63386630646633646430316436333934306530626533363634636431303832386436633331613237
62653638393265613734633130313631306638646435663563393964623932613731303739616666
65393138396532656163643533313239323561643861313333623831336163626462643835666538
65393833663366356435346132323763383938376236393838316161353135323263373332386537
33336638313334303864633662336566353764373062636638626133336362656130343266313934
34303734363837306333643834373732386439613232326265343261353330386266396263643534
63316162356333313335343764633633643966303966636661346530393965643935396665346335
36366231653466323761643534373532666532666663333034353337383637393831623439623035
30613236643732653832333666366637343130333938386563616661613936333438643433626631
61383363353030386465613435643137393638626433323734346465373938643366343532366565
64383164356233343231373138353832393132636661613634646537363465353233333264303835
33386530393361396434333530343232393866663664356262663832623930613435363464313430
32313533376366623935323035356164353530396131376534646339633262626137376163316563
62653535626438383231363735633033653062343135333638326165393834353064656138323631
63303162346335333666393662626336303033353965643832373735623431633662336334363265
37656338613062343839326265393630343338383563623464396363663164313832663130336336
34633832336463663761353436643334323832396633323035623332623434326665343564633965
38643231386464386330643632363238643832303061633434356639373663313063396630363339
66386337376165303939333237396261393364646334313833383333323431653739326133363537
33613165376364396331333239623163306435373333373438303564643838633562353238333132
39646330666531633362356333633865623334366430653861653566636466323336326362623561
30666465646237646238346130353231333563336239346363653331616261653363346363393332
39616235386632313234323465616262643763646236333133643938663766636437313435653939
63663966643035616664316666613235613166666137396134636136346264313165323736656361
64626335313233343638623439343335613633373566363233306163383264376166316237363331
64353263613332663364663932653635383234303933356337363335356234326533376264323636
31366238313961363134373133626130666433653866383063613865363761306261393164343533
64303438393730653462383432343531303639313764653235396237633236363763346565313866
39363334643533333938383862626535613562666335633237333435643764623966636364643637
31333261663063333234643835323632376636333064333531396333356537306662316330366365
63363263623039643964303162343362353363386162626638373734666537643765356238613365
39633033396632653935653361353036393562323065303233366562613134353765393739663634
62366661366336666438633631653263363634306239343261383062333230363036366337386635
30663036333036376133653739633935636330353665353935333530383962643037393963313533
64336539333635323937656236323765306339383961353633383737353061346332363237366432
61396237396632323962633862343066656137636336333638646534386534396332663366643065
66336139373663613963663035306462333633613233616166303431386561373732383830626363
32383863666665666437386464353338646139623964663762336337306433623933313830333861
37356530643535666263323333303534336132366631343734383463643065393638666364626266
61323762343862393536663235396231303462663963323962373837633038643236316237373831
66343532383261326666653939303834613562343265333339333234373936626234636632363232
35356339343863376663666134363563336438616466323531306532306134316132626534333936
61373266623561363230313562306563383032366164663166303833623462336432623039366466
38336334663463646466386639336638613731393264663638393164333531303462346334643333
32323963356339373334646639313030383139346666343932666238613131353464356539366566
38373266323331333235373366623930623061333463616566346539353031343761393966373263
34366136393232646366616666333833663733316136396331383462666637313930646537623936
35383535353734316161373562356366326430663436373037376165613034373239343563626465
39393537613964646132626263393938643233363833613830386666373334663634366130343061
31636330653865313764326437313738383831363636666161366462663433616633666365623335
64613663333630653834363934663661356535303436663362643566306436663865613039623731
63313162653735313339393437353032333630333939353734383136663334316537316235373734
33323333323734663161653331303530323631656230663738616265373535323239363331656336
31643336616336386136323334636332396333343839306465333634333165653532323065636335
64666432326466626333356136653661313731646663393461613365366338343934623464313834
39373436396564353135623264613538333230653734326562343066343936353762636630626233
31623436656565306363353539306161353936373735613734663335313034666666333066636466
39353533626663376330303735333466386334313966616365626633366337336230623962383336
39303362393736336438396662656631396661363066666538613533346163353563316461633636
65303661373934616235653762383761616663346361363162663630663662323932646464306132
33656361303633383238386437643237366230383163346365336565353930303265356436666635
30626638653634343333636337376166373961633562623737323436363364306664663031613936
32613363353734633633323565313165616130643066333037356661663130663736373231393538
64356130633838343630623433323262363738613836633131383462653265613964333035303436
32616436333331653135396661373936636232336666623237643363346430366162326332343536
32656232666462663336306461646261393266613537313263306430656536346161653137643437
34383939623339653036613131326463333437623433303534656331396364333364323731323934
33396630653463653135663032386666363137643137323034306438643837616461306439663466
33373432623339346635646565616263346234663163326138636535386437333033393261613937
36353836303638303363306333343930626336383964356363366636383663366135333335346664
35343635346235626261376665366262646538363937353964373835646131653464363563666563
63303565303734376639326134376230303135393065623432336337656538306262333038373066
39393535626465656530333634316565336131323266633436393661646661353937396438363066
32313362333037343363303561313261636132313438643137343161316130383965376165303866
65626461656533626665356662643364343466623739376164626364373433313730346265363561
34373837356136396336616132323234313862663862626532356531396339613663373466643839
65653963373231353135316664363636353464333762646433666333613933616532356532323462
34656262313766326434663838633836636236326636663633363762393533333233313631366265
66643639643437633639396264303634623134393032383932316530323339323438643032303534
36666630636438393066613365643365393136663135633633393837306232653536366536626438
63656531643561333265373465656661306661626431336137376131623338383035636162346663
66333938396436316231613063386264623534623665636239613936343731363461326534306330
34616335363266393636383865326364653765653962623033336266336232626561633863633061
33336631643866663036366131633662323834326135646533306663356232356631653332366438
61343935363033396666356331323735316434626131343566333435623530373261343639346433
32313437646231396561313031623937623730386533376166386432303331313731323032373733
36663533316266303037303733323233323066643339616338656230396665363865323063643233
37623966616162333164326266373834393733343938356232643730643234353832306636386361
31383262303166326663656539313237623036633730323764363634313864343362643865343731
33326264383831623831376135376239333239616239623961366365383831333236623564663231
32323166336466313034323638353264656466313832336137633737316633343630643135616335
36306530346364353239346332643966323932343964663335343561373864646139353863376461
66626335393539323630646632636332333935353738336662303361646366626333626632366339
62353139323731623738303166313461303165616164336238303038306638356332313937623862
61373462393839343964383438653262653930666539393262376363646530623530396234363930
32646138366364623433643762656466353339663764323666303663326666326237663737376434
34663532623864373466666530393565646464613936613938346462333139656536393539643535
66353062326136323037343962343961623166343161366562383238626164386463353965643738
38336264303863616635313166383733616130323962303833643635623430393761386433356332
37643830336461383662306637363530366166353231323832653866383033303537663936316362
64663230383634363731383638343139643537666266366661326135353862663031643631623236
39343533623234323633643438316332336565386435616463663337383436353965646136353464
65363365663338663963663536326161393764396631343633613366616131626634623538373534
31613363633863653964633837316635313364326137363938313365323939323338396163373031
30396434383435366133363635383861393030323636366363613839343163663332386236633036
39666234613836623032616330376339636532326566636262353963663933353033393661636236
64663033636265663065646535373862393665306231656162646662313564653435633436383738
38323563383766356537656265346663396439383331626433393261393533363634353737383736
63333136373334616465616630626461373031663037363833626532646231663438656265663561
62303234633662613739353931626665356465373234383365346461633630313433326432636239
34653530393737646539356330363734636431626137316334393464656333306463653939616530
31633236326530333735646665643862356634646637373664646262613833323533346665366563
39316262396639613237346161313839323432626235303636343363646266663066623136376661
36356330333735396238363862353637303534643064633763306336326164326132333262626164
66313039326435303964633233313864336263633961343236316336333935353466626464656664
32343536663563623337383238626365666462653132373138643835656330653666333566643639
61636266643932383937346465356265376334366432386366336362333032343639623461346333
32313763643330643230313863623330393735626366623830613565333530376338336138386661
61663764336536663639343435343131356636313366613161643939663062663036363966383166
66363434626462653563356334393261656363383735323263653966363334366237373231663937
62356638313634343763326637636566613831353336373238343964306266383536636564373464
30656161653561626534343230386535663666393365303532383539346436373130663766663530
31303731323738316437356633343831633963353838653130366663626139653837666335643439
61396632363032663065376465353730626165653664366333633164356630663736396534623636
32653133303435366631323039613366393463636438323162363232316465663062316163633262
33363631643263383762333138643762376634343131336431383965303136643130346233343335
64376437306236386435376362383334323237663834383361396366336535666233346634336638
32343830633430633265313533613930373161393734623632636437633265393366623839333936
33366537393563313135656366653136313934613761383932393864316439376465633430633232
61663765306238396561663330313762616164333461323435376639613665636337616335303762
38653931326336356631333132363532303734646330316336626162323736656231663632623730
36636261373839363565346363356633396265646565343333343535393834613334313962323737
36666465653262643636633434663062306537623363336364323838656233646135643865326531
63633466373830336361383265616362646234363832316161326339396263373438656536323434
63363130313264653234626333383531343661343331356436653663343566373761636461653063
61663336643330303964613934643638646533313536663165663039376231373439316539356530
30366465336336653661303763623338376465366663313263353662376332663334633233353436
30336432393139666630386138316362386235323364666465643635393165623764616535346335
63613662323766363965326136613035353538336564303662376135393036636264366364393463
33363161653438613938306465646638393933366164336532623361353432653039343232303966
64636238616136613665656164636238316339343263636633306339386632353332626537343532
63323065313565333966303737373736336333343937336163333464343361613139373232646136
64313235663831313463313931623235636435336636653163316437313866643939393739656238
30333364613566626366633066613632383061623363343535396435656636623466663631656138
34343662346137613137633136326635343230373262303564653830306633366532623839333566
39636263616365623938343430383432323130316432646132616436393366363435386139633966
66333866633531303338656333613565313564393762353132323765356231356532653731323231
65353536323861386563386338346338346338646333373864366330623361383663343262643261
37633166343230363464663262376230643634636138633162396263386332326264323065383364
61633931633137613862333763316233393538343635353565623335386630666631636662616237
61336165376231306431393766363966306332303964396166396630373063666131626434363638
65323735616163393731383765393635393331663766636239633364643364333561303931616432
63663036343431373065626366333266373838636663393562393436313164633263393163373362
33303139333931326134323938633239366162336230636335383763386539646239356161313433
62386238323265333638643366366231633831623532613065343065373063336662613438366531
65396564343366346564366334663034306431363338353366366431356561393865396463306637
62386331343739626438656132343763656365353964373536323466636561396330626536336461
32353363663832336364383566306138643837373137643036633761653830653232366332623835
61613265653537643738393463323438613162353464333961653732623439333965376437633730
36636435343965646132376238303937323238336232306238366636373730616261333036326438
31646364343764653864386264346530313061316162353166653564383834353338383534656161
31636661336564313430623962316635663862333935323930626338323762626531643865396366
36663537383361306238383435653164346331633935333738376439353566303236636237373063
65353837656261613464323535393533353233323337646330316132363732303435363835643765
30636131646432306333653063326332376435343831636634633432653462306662393165346339
38633465626237346661373164626339396339636266306136373862353037316136396237636661
62333663353036383131623762616239363066316464663237633433343633323032336638663034
63363265613930353131613637323734623133623961366337613061323463386261613433653137
34313166636637313336366461383763356161363565383661633563313464306537393731633464
34353631396164396332313738363436623631636635643166303564363033366337626661313538
34633266616363303762373833316166356632356662353765313964383832313336323365663536
37663064646162646334376632656132663736643865353936613166623235623761613665393863
39633462623862323133363333643862373432363166316362656261346130626537313264383363
35343665336133373334336664356263336661316162343639666265396231376136313163636635
66336636643130383430656662653139633137373035323630333665626633306535623735656234
34633330353464306364616134373530643661363936646439313366383432376330656665383638
61613936323765356239316235323961613935313761346534363765396635636238363839626364
33373936353439663135363535633666373331343634333736376133383536656361376634393464
33343064383736613962313563353137306236343436653734656563653732636463393031616533
62633139666635373130336361663564383833333665303738666632663633393236383937343639
31323539363535613431656437636539323565366535613336396333343835623338663234353233
39313332313263353131656138663962373963323637346136373130336239616631393136303731
37303064653231636335306230383635663938623438306637366331326261373230313233666464
35386364633662623865643830383563303165653734303563633664643331656337616661323038
34656436646363346132373034363235346665643561616361393664393230613361313366656661
36363662313931393438373339383663626434343233643735316231623035373963326561313331
30653236363636663239393432663232626563626134336361663763653231336237366630326363
36633466626537646331343764343139663666623230636561656265396232613633386431633531
35363934396464386435343233356163376263386465616235333832316134303432383466633336
35363962323632633936313863346635613432666136626561353839623430333539363637663366
34343865653738313331363635386562383866646463643433353863303764326537326533633463
39663434326464313738393839366661323966373563333633636665356532313534643235663038
33636634396432363334626362653135623332613762333032363865653333643732616664303136
34336166323665373835633538373231376365366230623635353663333930303465343563343337
61663563366662623362303533376437393032306138363733653435373761376362333837363733
31366434613966383063376463646137653734306334393961636133393537356236383039663331
36663266393532663763303662353262373834356666303763383736666632313063666661373436
33623530376161313733386430656533626661653065363033663232396262346461396264623066
66326636366239303864646536303835383730376631623432363132376134663465656335353639
66613363353463616632373665393765373433613363306330333535393431626463626466666437
39303534366134373663373739373863646532643465623336643839623137363632323462646232
61636564643766323239376564623735306633343035613831656365653630396463366261313733
30656230373335653037353965663166303932363336613662633161633630643531353036633164
62653233326235396665316133336231386665316438613536343331353836326665386633366431
31326431613034353765306134366135316661306638366530323439616130643833316234383738
64336236626461373663383061376163316261626337626339656331393336326364343863646562
35363166643631396561393337623365653838643964323037346130346431323566663530653832
62623261666434336331306138346437363838323130343961363735393837343861333561363664
30353138393561383864396435376166303330626261653334396334356435356530326235633838
33666665643062353738393633313662383336326636633261333131636139376562623034363365
38343534333563306564616466313130356334663631313836353437353166316338363439386338
31373437353264666331623338323666323461376433653165373163656662623333393138666130
66626264323638613230373534356234666336323734383039393666353836306535653135663761
37333566313432623736636334646161373463656461333462363537383833363066366630636365
61633863326264666632663765333432333065393738333133326235356634646432313237366361
63663939663637663236653365616234343566656334313633313366303231363830313866316633
33343766393731663833636661363563663465613231393530643065383564663531376563633661
65656664346565363064346432323236393365356439666564663866316637356239353631396465
33313934356435363430333836333963386665653431333034653363383838343262373231323931
66346464356430663733363538383732356331343533616531383135333864636162323932346631
39656530636539623062373934333262323032363066626634323233323736363436333666303032
30633462646233616333393431393138393632653735303137356237326335663061363734363862
63633364633866643232643935373633663136323535333033666364613462643136323936343438
32386236326433653439313236373236366131333730643361363136656135306665323564646536
61396434393131353438326337316139396637663338663862333464373364646336353539663662
64383533396535653861396534633837323561333766346362656261643539353137316462646361
39363435363634653538643135656464373731316364313636633137613137366539643730383361
61376661666164616635376635343566653962393730383661653630363134333665623761613364
37366666356633383462613538633531343965333631613066326432623263316366633466313864
37613030383136623766373836353333363264313136386235383339306137323830663038303661
65333537393633366564616337366363306466356332333631363063303836396431356234323435
34353234386330336639363537623038643232353062376237316338393838373064636636363238
37356336376264383063613865613033386239356637316137633466313962383532373266346235
37356462636563343231326366373737616261393937353739396436303536646264303530363935
33306335643634366133393530666233393933623132636161386439343234636562623632376364
63613531343237346361383730383363353232303333323430613838346662333836373635376232
63373031313431373232346261376561663031356432303331303161396464626136613434653539
32636265353762636362666366393232643762343763303261343334363765353265633335393934
35363932626662303533343436303466623331346130626462633139303861343962356537323033
64626237396638363637373936353137663038393732633636316432316431613434323862646562
30363364373730343766326166346635373461353636393933393663336431363339383638386632
36323131656436643536363736306130316131346131343934613338366565356161366639313264
61633935666337373632363663336165333832373331613230333536636638646535343766613235
34313638396537366264653666306265323932363739376238346361346531663030393430316463
34323264373931316464363037323766333731363334393038613135393534383635616231313532
61613430386231343366343966613166616565326564633735353364346662653234646665663166
34346562626466626263653339376261356162643666666238356264613534363266366562363162
32363564373236656630353832353236343062623766663461656362376235346533376531343333
34373834383962326362643339666562663334323437633734333333353364633631356437313264
64626539323733613033333933363762346363376636356365393435653565353265383034366462
64633234393939383864363935313061633835643331323839353037663937376639646334633163
34323761373563383665336563663937343363396563623338383866623135643265643366353932
63323861636163376462333837663139353535613938646133613537646163626266363231396632
39316136373433316261656564306531353363666563343134373430616139656131343235393161
61353833366638336139373963623231613062326139336565313632363432373432313261626266
64626161326161373338383333323030643539313266313131383833363966386138326131303937
30303262346261333963336562333933363763643131333730363732333838376332393833663831
61646335343938376562666436633362633635353161326461396433343333393566356233346231
37303838303462336233336664633531353064386633323364626236613339363333616165653136
63393563393932313361343538623730353331303661306336383237336137356233303837306630
65386234383664303566343735383237363438363537373865643861373235366133613336386236
35306339623932386338616635656531306337633739316461303532326637353261633364306463
30663934636538393365376563333766663438356430393938383062346631666633356634616435
38636165663765346362633635643765363164306362323565316462323865373930643061353732
65386532636234656662643939346661353635376236303063333465383931366462633134353661
3966

Some files were not shown because too many files have changed in this diff Show More