Compare commits
80 Commits
deebf78047
...
a879ea53a7
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a879ea53a7 | ||
|
|
b41c110c16 | ||
|
|
304a5e4ebf | ||
|
|
7592cf73e9 | ||
|
|
377a1eda2b | ||
|
|
fba9f43f5c | ||
|
|
a2a91cf826 | ||
|
|
e132e12e30 | ||
|
|
692fe8c6c0 | ||
|
|
a435778683 | ||
|
|
6101e03d96 | ||
|
|
4067194ed7 | ||
|
|
5e201fc06c | ||
|
|
c0a3a06675 | ||
|
|
e638f7cc94 | ||
|
|
098d8b672f | ||
|
|
d698f25aa7 | ||
|
|
9f6ec970a4 | ||
|
|
9c37bb4ea1 | ||
|
|
312b54fd92 | ||
|
|
16ab3ed6c3 | ||
|
|
7924691d34 | ||
|
|
1fc454e767 | ||
|
|
1238084c7b | ||
|
|
34e0cbd570 | ||
|
|
b315bc6b14 | ||
|
|
7232bd6756 | ||
|
|
1ec9121a21 | ||
|
|
c7dec1e733 | ||
|
|
30b69ce0ec | ||
|
|
5093d38c06 | ||
|
|
c6dd7bc0b8 | ||
|
|
8fd52810a2 | ||
|
|
787ab06e25 | ||
|
|
bfed0d1ea8 | ||
|
|
4c804eeaf0 | ||
|
|
5c2b63848c | ||
|
|
e98bfa9c1f | ||
|
|
9ce30e0d67 | ||
|
|
94560ffaaa | ||
|
|
1a4e52aab2 | ||
|
|
c702a43f6a | ||
|
|
14a09f723e | ||
|
|
1bed3740b1 | ||
|
|
2144c81b70 | ||
|
|
fadca7c322 | ||
|
|
547d6b0ffa | ||
|
|
b8d942e426 | ||
|
|
8bf5272555 | ||
|
|
6a8998c0ec | ||
|
|
020c4f8087 | ||
|
|
1a8e7d6af2 | ||
|
|
ef384475c3 | ||
|
|
30aa6a722f | ||
|
|
24d229b026 | ||
|
|
b42ceff086 | ||
|
|
b8faaafd1f | ||
|
|
3b2533c8ee | ||
|
|
d8fa474522 | ||
|
|
8b98050861 | ||
|
|
8b9310a665 | ||
|
|
85327e381f | ||
|
|
e389cad393 | ||
|
|
3caa0078e1 | ||
|
|
2652d8376f | ||
|
|
7f6d9c9268 | ||
|
|
bf02745769 | ||
|
|
1b323827f6 | ||
|
|
85bb63dd82 | ||
|
|
89d39921f6 | ||
|
|
c2db58c356 | ||
|
|
8f5a9c955c | ||
|
|
91e7554d71 | ||
|
|
cef8290341 | ||
|
|
646d1bbd00 | ||
|
|
ee0e5b98a3 | ||
|
|
696e08aa35 | ||
|
|
60ee5e90a5 | ||
| c99df83bad | |||
| 0b981ca61e |
44
.github/workflows/ansible-test.yml
vendored
Normal file
44
.github/workflows/ansible-test.yml
vendored
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
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
|
||||||
9
.gitignore
vendored
9
.gitignore
vendored
@@ -1,6 +1,12 @@
|
|||||||
# ---> Ansible
|
# ---> Ansible
|
||||||
*.retry
|
*.retry
|
||||||
|
|
||||||
|
# ---> Vault (секретные файлы)
|
||||||
|
vault/.vault
|
||||||
|
vault/secrets/*.yml
|
||||||
|
# Зашифрованные vault файлы (если не нужно коммитить)
|
||||||
|
# vault/*.yml
|
||||||
|
|
||||||
# ---> Python
|
# ---> Python
|
||||||
# Byte-compiled / optimized / DLL files
|
# Byte-compiled / optimized / DLL files
|
||||||
__pycache__/
|
__pycache__/
|
||||||
@@ -171,3 +177,6 @@ cython_debug/
|
|||||||
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
||||||
.idea/
|
.idea/
|
||||||
|
|
||||||
|
# Cursor IDE
|
||||||
|
.cursor/
|
||||||
|
|
||||||
|
|||||||
@@ -1,89 +0,0 @@
|
|||||||
stages:
|
|
||||||
- lint
|
|
||||||
- test
|
|
||||||
- deploy
|
|
||||||
- notify
|
|
||||||
|
|
||||||
services:
|
|
||||||
- name: docker:dind
|
|
||||||
command: ["--tls=false"]
|
|
||||||
|
|
||||||
variables:
|
|
||||||
DOCKER_IMAGE: "hub.cism-ms.ru/ansible/ansible:latest"
|
|
||||||
DOCKER_TLS_CERTDIR: ""
|
|
||||||
ANSIBLE_FORCE_COLOR: "true"
|
|
||||||
|
|
||||||
before_script:
|
|
||||||
- echo "$CI_REGISTRY_PASSWORD" | docker login hub.cism-ms.ru -u "$CI_REGISTRY_USER" --password-stdin
|
|
||||||
- docker pull $DOCKER_IMAGE
|
|
||||||
- echo "Fixing directory permissions..."
|
|
||||||
- chmod o-w $CI_PROJECT_DIR
|
|
||||||
|
|
||||||
lint:
|
|
||||||
stage: lint
|
|
||||||
script:
|
|
||||||
- echo "Начинаем стейдж Lint"
|
|
||||||
- echo "Распаковываем секреты..."
|
|
||||||
- ansible-vault decrypt vars/secrets.yml --vault-password-file ./vault-password.txt
|
|
||||||
- echo "Запускаем ansible-lint..."
|
|
||||||
- ansible-lint roles/*
|
|
||||||
- echo "Упаковываем секреты..."
|
|
||||||
- ansible-vault encrypt vars/secrets.yml --encrypt-vault-id default --vault-password-file ./vault-password.txt
|
|
||||||
allow_failure: false
|
|
||||||
rules:
|
|
||||||
- if: $CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "master"
|
|
||||||
|
|
||||||
test:
|
|
||||||
stage: test
|
|
||||||
script:
|
|
||||||
- echo "Распаковываем секреты..."
|
|
||||||
- ansible-vault decrypt --vault-password-file ./vault-password.txt vars/secrets.yml
|
|
||||||
- echo "Запускаем тесты через Молекулу..."
|
|
||||||
- molecule test --parallel --destroy=always
|
|
||||||
- echo "Упаковываем секреты..."
|
|
||||||
- ansible-vault encrypt vars/secrets.yml --encrypt-vault-id default --vault-password-file ./vault-password.txt
|
|
||||||
allow_failure: false
|
|
||||||
rules:
|
|
||||||
- if: $CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "master"
|
|
||||||
|
|
||||||
deploy:
|
|
||||||
stage: deploy
|
|
||||||
script:
|
|
||||||
- echo "Настраиваем SSH-ключ для доступа к серверам..."
|
|
||||||
# Создаем директорию .ssh и настраиваем права доступа
|
|
||||||
- mkdir -p ~/.ssh
|
|
||||||
- chmod 700 ~/.ssh
|
|
||||||
# Записываем SSH-ключ в файл ~/.ssh/id_rsa
|
|
||||||
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa
|
|
||||||
- chmod 600 ~/.ssh/id_rsa
|
|
||||||
# Запускаем основной пайплайн
|
|
||||||
- echo "Распаковываем секреты..."
|
|
||||||
- ansible-vault decrypt --vault-password-file ./vault-password.txt vars/secrets.yml
|
|
||||||
- echo "Все ок. Деплоим в прод..."
|
|
||||||
- ansible-playbook roles/deploy.yaml
|
|
||||||
- echo "Упаковываем секреты..."
|
|
||||||
- ansible-vault encrypt vars/secrets.yml --encrypt-vault-id default --vault-password-file ./vault-password.txt
|
|
||||||
# Удаляем ключ
|
|
||||||
- rm -rf ~/.ssh
|
|
||||||
rules:
|
|
||||||
- if: $CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "master"
|
|
||||||
when: manual
|
|
||||||
|
|
||||||
notify:
|
|
||||||
stage: notify
|
|
||||||
script:
|
|
||||||
- |
|
|
||||||
if [ "$CI_JOB_STATUS" == "success" ]; then
|
|
||||||
MESSAGE="✅ Пайплайн успешно завершен!%0AПроект: $CI_PROJECT_NAME%0AВетка: $CI_COMMIT_REF_NAME%0AСтатус: $CI_JOB_STATUS"
|
|
||||||
else
|
|
||||||
MESSAGE="❌ Пайплайн завершен с ошибкой!%0AПроект: $CI_PROJECT_NAME%0AВетка: $CI_COMMIT_REF_NAME%0AСтатус: $CI_JOB_STATUS"
|
|
||||||
fi
|
|
||||||
# curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage" \
|
|
||||||
# -d "chat_id=$TELEGRAM_CHAT_ID" \
|
|
||||||
# -d "text=$MESSAGE"
|
|
||||||
rules:
|
|
||||||
- if: $CI_JOB_STATUS # Отправлять уведомление только после завершения пайплайна
|
|
||||||
|
|
||||||
after_script:
|
|
||||||
- echo "Работа пайплайна завершена"
|
|
||||||
|
|
||||||
40
Dockerfile
40
Dockerfile
@@ -1,40 +0,0 @@
|
|||||||
# Используем готовый образ с Ansible
|
|
||||||
FROM geerlingguy/docker-ubuntu2204-ansible:latest
|
|
||||||
|
|
||||||
# Добавляем метаданные
|
|
||||||
LABEL maintainer="Сергей Антропов <sergey@antropoff.ru>"
|
|
||||||
LABEL description="Этот Dockerfile создан для внедрения подхода IaC в Ansible."
|
|
||||||
LABEL version="0.1"
|
|
||||||
LABEL contact.website="https://devops.org.ru"
|
|
||||||
|
|
||||||
# Устанавливаем переменные окружения
|
|
||||||
ENV PYTHONUNBUFFERED=1
|
|
||||||
ENV EDITOR=nano
|
|
||||||
|
|
||||||
# Устанавливаем дополнительные зависимости Python для Molecule
|
|
||||||
RUN pip install --upgrade pip && \
|
|
||||||
pip install \
|
|
||||||
molecule \
|
|
||||||
molecule-docker \
|
|
||||||
ansible-lint \
|
|
||||||
yamllint \
|
|
||||||
docker \
|
|
||||||
&& rm -rf /root/.cache/pip
|
|
||||||
|
|
||||||
# Создаем рабочую директорию
|
|
||||||
WORKDIR /ansible
|
|
||||||
|
|
||||||
# Копируем файлы проекта
|
|
||||||
COPY . /ansible/
|
|
||||||
|
|
||||||
# Устанавливаем права на выполнение (если папка scripts существует)
|
|
||||||
RUN if [ -d /ansible/scripts ]; then chmod +x /ansible/scripts/*.sh; fi
|
|
||||||
|
|
||||||
# Устанавливаем пользователя
|
|
||||||
USER root
|
|
||||||
|
|
||||||
# Открываем порт для SSH
|
|
||||||
EXPOSE 22
|
|
||||||
|
|
||||||
# Команда по умолчанию
|
|
||||||
CMD ["/bin/bash"]
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
# Сборка контейнера с systemd для удобного тестирования ролей Ansible через Molecule
|
|
||||||
|
|
||||||
# Используем официальный образ Fedora
|
|
||||||
FROM quay.io/fedora/python-312
|
|
||||||
|
|
||||||
USER root
|
|
||||||
|
|
||||||
# Обновляем пакеты и устанавливаем systemd и необходимые пакеты
|
|
||||||
RUN dnf update -y && \
|
|
||||||
dnf install -y --nodocs --setopt=install_weak_deps=False \
|
|
||||||
systemd rsync \
|
|
||||||
git \
|
|
||||||
openssh \
|
|
||||||
gcc \
|
|
||||||
libffi-devel \
|
|
||||||
openssl-devel \
|
|
||||||
make \
|
|
||||||
sudo \
|
|
||||||
openssh-clients \
|
|
||||||
less \
|
|
||||||
ca-certificates \
|
|
||||||
curl \
|
|
||||||
gnupg2 \
|
|
||||||
nano \
|
|
||||||
sshpass \
|
|
||||||
redhat-lsb-core \
|
|
||||||
&& dnf clean all && \
|
|
||||||
rm -rf /var/cache/dnf /tmp/* /var/tmp/*
|
|
||||||
|
|
||||||
# Устанавливаем 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
|
|
||||||
|
|
||||||
# Устанавливаем Python пакеты для Ansible
|
|
||||||
RUN pip install --upgrade pip && \
|
|
||||||
pip install \
|
|
||||||
ansible \
|
|
||||||
ansible-vault \
|
|
||||||
molecule \
|
|
||||||
molecule-docker \
|
|
||||||
ansible-lint \
|
|
||||||
yamllint \
|
|
||||||
docker \
|
|
||||||
&& rm -rf /root/.cache/pip
|
|
||||||
|
|
||||||
# Настраиваем окружение для systemd
|
|
||||||
ENV container=docker
|
|
||||||
STOPSIGNAL SIGRTMIN+3
|
|
||||||
|
|
||||||
# Создаем необходимые директории для systemd
|
|
||||||
VOLUME [ "/sys/fs/cgroup" ]
|
|
||||||
|
|
||||||
# Запускаем systemd при старте контейнера
|
|
||||||
CMD ["/sbin/init"]
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
# Сборка контейнера с systemd для удобного тестирования ролей Ansible через Molecule
|
|
||||||
|
|
||||||
# Используем готовый образ с Ansible (более старый, но стабильный)
|
|
||||||
FROM geerlingguy/docker-ubuntu2004-ansible:latest
|
|
||||||
|
|
||||||
# Устанавливаем переменные окружения
|
|
||||||
ENV DEBIAN_FRONTEND=noninteractive
|
|
||||||
ENV container=docker
|
|
||||||
|
|
||||||
# Устанавливаем дополнительные пакеты для тестирования
|
|
||||||
RUN apt-get update && \
|
|
||||||
apt-get install -y --no-install-recommends \
|
|
||||||
systemd \
|
|
||||||
systemd-sysv \
|
|
||||||
rsync \
|
|
||||||
git \
|
|
||||||
ssh \
|
|
||||||
gcc \
|
|
||||||
libffi-dev \
|
|
||||||
libssl-dev \
|
|
||||||
make \
|
|
||||||
sudo \
|
|
||||||
sshpass \
|
|
||||||
openssh-client \
|
|
||||||
nano \
|
|
||||||
less \
|
|
||||||
ca-certificates \
|
|
||||||
curl \
|
|
||||||
gnupg \
|
|
||||||
lsb-release \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# Устанавливаем Python пакеты для Ansible с обновлением зависимостей
|
|
||||||
RUN pip install --upgrade pip && \
|
|
||||||
pip install --upgrade \
|
|
||||||
requests \
|
|
||||||
PyYAML \
|
|
||||||
ansible-core \
|
|
||||||
&& pip install \
|
|
||||||
ansible \
|
|
||||||
"ansible-vault<4.0.0" \
|
|
||||||
molecule \
|
|
||||||
molecule-docker \
|
|
||||||
ansible-lint \
|
|
||||||
yamllint \
|
|
||||||
docker \
|
|
||||||
&& rm -rf /root/.cache/pip
|
|
||||||
|
|
||||||
# Устанавливаем 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 в качестве init-системы
|
|
||||||
ENV container=docker
|
|
||||||
STOPSIGNAL SIGRTMIN+3
|
|
||||||
|
|
||||||
# Создаем необходимые директории для systemd
|
|
||||||
VOLUME [ "/sys/fs/cgroup" ]
|
|
||||||
|
|
||||||
# Запускаем systemd при старте контейнера
|
|
||||||
CMD ["/sbin/init"]
|
|
||||||
452
README.md
452
README.md
@@ -1,62 +1,406 @@
|
|||||||
# AnsibleTemplate
|
# AnsibleTemplate - Универсальная система тестирования Ansible ролей
|
||||||
|
|
||||||
Темплейт для создания, проверки и тестирование ролей Ansible с помощью контейнеров Docker.
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
|
**Версия:** 2.0.0
|
||||||
|
|
||||||
### С чего начать?
|
## 📋 Описание
|
||||||
|
|
||||||
На вашей машине вам необходимо сбилдить образ, где будут запускаться все роли через docker-compose.
|
AnsibleTemplate - это универсальная система для разработки, тестирования и развертывания Ansible ролей с использованием Docker, Molecule и preset конфигураций. Система поддерживает тестирование на различных ОС через Docker контейнеры.
|
||||||
|
|
||||||
Это можно сделать самостоятельно:
|
## ✨ Ключевые возможности
|
||||||
|
|
||||||
- **make docker build** - создание контейнера
|
- **Тестирование ролей** через Molecule с Docker
|
||||||
- **make docker rebuild** - пересоздание контейнера, если были внесены изменения в Dockerfile
|
- **Preset система** для быстрого выбора окружений тестирования
|
||||||
- **make docker prune** - очистить систему от лишних образов
|
- **Мультиплатформенное тестирование** (Ubuntu, Debian, CentOS, AlmaLinux, RHEL и другие)
|
||||||
- **make docker shell** - войти в контейнер Shell
|
- **Автоматическая проверка** синтаксиса Ansible ролей
|
||||||
- **make docker release** - собирает образ контейнера и пушит его в докер реджистри
|
- **Управление секретами** через Ansible Vault
|
||||||
- **make docker images** - собрать образы контейнеров с systemd, для удобного тестирования ролей
|
- **Готовые Docker образы** для разных ОС
|
||||||
- **make images** - собрать и запушить все образы (основной Ansible, CentOS, Ubuntu) в Docker Hub (inecs/ansible)
|
|
||||||
|
|
||||||
Или ввести команду:
|
## 📁 Структура проекта
|
||||||
|
|
||||||
- **make init** - которая создаст файл секретов с паролем. Сбилдит образ. И создаст новую роль.
|
|
||||||
|
|
||||||
### Работа с ролью
|
|
||||||
- **make role new** - создать новую роль из шаблона. Название роли пишется на английском, описание роли на любом языке
|
|
||||||
- **make role lint** - проверяет все роли в папке roles/* на наличие ошибок
|
|
||||||
- **make role test** - позволяет тестировать роль, указанную в molecule/default/converge.yml
|
|
||||||
сразу на двух контейнерах (RedHat и Ubuntu)
|
|
||||||
- **make role deploy** - запускает роль в продакшен. Все хосты берет из файла inventory/hosts
|
|
||||||
|
|
||||||
### Работа с файлом переменных
|
|
||||||
|
|
||||||
Все переменные защищены через **Ansible-Vault** и находятся в папке vars/secrets.yml
|
|
||||||
|
|
||||||
Для смены пароля измените его в файле **./vault-password.txt**
|
|
||||||
|
|
||||||
- **make vault create** - создать новый файл с учетом пароля в файле **./vault-password.txt**
|
|
||||||
- **make vault delete** - удалить файл с переменными
|
|
||||||
- **make vault edit** - отредактировать файл переменных
|
|
||||||
- **make vault show** - показать содержимое файла переменных
|
|
||||||
- **make vault rekey** - сменить пароль шифрования
|
|
||||||
- **make vault encrypt** - зашифровать файл секретов
|
|
||||||
- **make vault decrypt** - расшифровать файл секретов
|
|
||||||
|
|
||||||
### Работа с Git
|
|
||||||
|
|
||||||
- **make git push** - запушить изменения. С выбором ветки и вводом коммита.
|
|
||||||
- **make git pull** - получить изменения из репы
|
|
||||||
- **make git new** - создание нового брэнча имя cluster-branch_name для IaC подхода.
|
|
||||||
|
|
||||||
### Добавить свой образ контейнера для тестов
|
|
||||||
|
|
||||||
Что бы добавить или изменить докер-образы для тестирования ролей измените файл настроек молекулы
|
|
||||||
molecule/default/molecule.yml
|
|
||||||
```yaml
|
|
||||||
- name: ubuntu-instance
|
|
||||||
image: "your.docker-registry.com/your-image:latest"
|
|
||||||
privileged: true
|
|
||||||
pre_build_image: true
|
|
||||||
volumes:
|
|
||||||
- /sys/fs/cgroup:/sys/fs/cgroup:ro
|
|
||||||
```
|
```
|
||||||
Помните, что образ обязательно должен содержать python не ниже версии 3.12 и systemd для нормального тестирования ролей.
|
AnsibleTemplate/
|
||||||
|
├── molecule/ # Конфигурация Molecule
|
||||||
|
│ ├── default/ # Основная конфигурация
|
||||||
|
│ │ ├── create.yml # Создание контейнеров
|
||||||
|
│ │ ├── converge.yml # Запуск тестов
|
||||||
|
│ │ ├── destroy.yml # Удаление контейнеров
|
||||||
|
│ │ ├── site.yml # Основной playbook
|
||||||
|
│ │ └── molecule.yml # Конфигурация Molecule
|
||||||
|
│ └── presets/ # Preset конфигурации
|
||||||
|
│ ├── default.yml # Стандартный preset
|
||||||
|
│ ├── minimal.yml # Минимальный preset
|
||||||
|
│ └── examples/ # Примеры preset'ов
|
||||||
|
├── roles/ # Ansible роли
|
||||||
|
│ ├── docker/ # Роль установки Docker
|
||||||
|
│ ├── ping/ # Роль для ping проверок
|
||||||
|
│ └── deploy.yml # Playbook для развертывания
|
||||||
|
├── dockerfiles/ # Docker образы
|
||||||
|
│ └── ansible-controller/ # Ansible контроллер
|
||||||
|
├── cicd/ # CI/CD конфигурации
|
||||||
|
├── vault/ # Зашифрованные секреты
|
||||||
|
├── inventory/ # Инвентори файлы
|
||||||
|
├── scripts/ # Вспомогательные скрипты
|
||||||
|
├── docs/ # Документация
|
||||||
|
├── Makefile # Основные команды
|
||||||
|
└── requirements.yml # Ansible коллекции
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚀 Быстрый старт
|
||||||
|
|
||||||
|
### 1. Клонирование репозитория
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone <repository-url>
|
||||||
|
cd AnsibleTemplate
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Тестирование ролей
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Тестирование с default preset (2 хоста)
|
||||||
|
make role test
|
||||||
|
|
||||||
|
# Тестирование с минимальным preset (1 хост)
|
||||||
|
make role test minimal
|
||||||
|
|
||||||
|
# Тестирование с кастомным preset
|
||||||
|
make role test my-custom-preset
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Проверка синтаксиса
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка всех ролей
|
||||||
|
make role lint
|
||||||
|
|
||||||
|
# Проверка конкретной роли
|
||||||
|
make role lint docker
|
||||||
|
make role lint ping
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📚 Доступные роли
|
||||||
|
|
||||||
|
### Docker
|
||||||
|
|
||||||
|
Универсальная роль для установки Docker и Docker Compose на различных Linux-дистрибутивах.
|
||||||
|
|
||||||
|
**Поддерживаемые ОС:**
|
||||||
|
- Debian 9/10/11/12
|
||||||
|
- Ubuntu 20.04/22.04/24.04
|
||||||
|
- CentOS 7/8/9
|
||||||
|
- AlmaLinux 8/9
|
||||||
|
- Rocky Linux 8/9
|
||||||
|
- RHEL 8/9
|
||||||
|
|
||||||
|
**Пример использования:**
|
||||||
|
```yaml
|
||||||
|
- hosts: all
|
||||||
|
roles:
|
||||||
|
- role: docker
|
||||||
|
vars:
|
||||||
|
docker_users:
|
||||||
|
- ansible
|
||||||
|
- deploy
|
||||||
|
```
|
||||||
|
|
||||||
|
**Подробная документация:** [roles/docker/README.md](roles/docker/README.md)
|
||||||
|
|
||||||
|
### Ping
|
||||||
|
|
||||||
|
Роль для выполнения ping проверок подключения к сети.
|
||||||
|
|
||||||
|
**Пример использования:**
|
||||||
|
```yaml
|
||||||
|
- hosts: all
|
||||||
|
roles:
|
||||||
|
- role: ping
|
||||||
|
vars:
|
||||||
|
ping_host: google.com
|
||||||
|
ping_count: 10
|
||||||
|
```
|
||||||
|
|
||||||
|
**Подробная документация:** [roles/ping/README.md](roles/ping/README.md)
|
||||||
|
|
||||||
|
## 🧪 Preset система
|
||||||
|
|
||||||
|
Preset система позволяет быстро выбрать окружение для тестирования.
|
||||||
|
|
||||||
|
### Доступные preset'ы
|
||||||
|
|
||||||
|
| Preset | Описание | Хосты |
|
||||||
|
|--------|----------|-------|
|
||||||
|
| `default` | Стандартный preset | 2 хоста (Ubuntu + CentOS) |
|
||||||
|
| `minimal` | Минимальный preset | 1 хост (Debian) |
|
||||||
|
| `mytest` | Кастомный preset | 3 хоста |
|
||||||
|
|
||||||
|
### Создание своего preset
|
||||||
|
|
||||||
|
Создайте файл `molecule/presets/my-preset.yml`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
#description: Мой кастомный preset
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
|
||||||
|
images:
|
||||||
|
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
|
||||||
|
centos9: "inecs/ansible-lab:centos9-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: web1
|
||||||
|
family: ubuntu22
|
||||||
|
groups: [web, test]
|
||||||
|
- name: db1
|
||||||
|
family: centos9
|
||||||
|
groups: [database, test]
|
||||||
|
```
|
||||||
|
|
||||||
|
Используйте preset:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make role test my-preset
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔐 Управление секретами
|
||||||
|
|
||||||
|
### Ansible Vault
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создание секретного файла
|
||||||
|
make vault create
|
||||||
|
|
||||||
|
# Редактирование секретов
|
||||||
|
make vault edit
|
||||||
|
|
||||||
|
# Просмотр секретов
|
||||||
|
make vault show
|
||||||
|
|
||||||
|
# Шифрование файла
|
||||||
|
make vault encrypt
|
||||||
|
|
||||||
|
# Расшифровка файла
|
||||||
|
make vault decrypt
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚀 Развертывание
|
||||||
|
|
||||||
|
### Тестирование (Docker контейнеры)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Тестирование с разными preset'ами
|
||||||
|
make role test # default preset
|
||||||
|
make role test minimal # minimal preset
|
||||||
|
```
|
||||||
|
|
||||||
|
### Развертывание на реальные серверы
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Развертывание на продакшн
|
||||||
|
make role deploy
|
||||||
|
```
|
||||||
|
|
||||||
|
**Инвентори для продакшн** находится в файле `inventory/hosts.ini`:
|
||||||
|
|
||||||
|
```ini
|
||||||
|
# inventory/hosts.ini
|
||||||
|
[web_servers]
|
||||||
|
web1.example.com ansible_host=192.168.1.10
|
||||||
|
|
||||||
|
[db_servers]
|
||||||
|
db1.example.com ansible_host=192.168.1.20
|
||||||
|
|
||||||
|
[all:vars]
|
||||||
|
ansible_user=devops
|
||||||
|
ansible_ssh_private_key_file=~/.ssh/id_rsa
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 Основные команды
|
||||||
|
|
||||||
|
### Управление ролями
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Просмотр всех ролей
|
||||||
|
ls -1 roles/
|
||||||
|
|
||||||
|
# Проверка синтаксиса
|
||||||
|
make role lint # все роли
|
||||||
|
make role lint docker # конкретная роль
|
||||||
|
|
||||||
|
# Тестирование
|
||||||
|
make role test # default preset
|
||||||
|
make role test minimal # minimal preset
|
||||||
|
```
|
||||||
|
|
||||||
|
### Управление секретами
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создание секретов
|
||||||
|
make vault create
|
||||||
|
|
||||||
|
# Редактирование
|
||||||
|
make vault edit
|
||||||
|
|
||||||
|
# Просмотр
|
||||||
|
make vault show
|
||||||
|
```
|
||||||
|
|
||||||
|
### Развертывание
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Развертывание на продакшн
|
||||||
|
make role deploy
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📖 Документация
|
||||||
|
|
||||||
|
### Основная документация
|
||||||
|
|
||||||
|
- **[docs/getting-started.md](docs/getting-started.md)** - Быстрый старт
|
||||||
|
- **[docs/molecule-guide.md](docs/molecule-guide.md)** - Руководство по Molecule
|
||||||
|
- **[docs/creating-roles.md](docs/creating-roles.md)** - Создание ролей
|
||||||
|
- **[docs/cicd-setup.md](docs/cicd-setup.md)** - Настройка CI/CD
|
||||||
|
|
||||||
|
### Документация по ролям
|
||||||
|
|
||||||
|
- **[roles/docker/README.md](roles/docker/README.md)** - Документация роли Docker
|
||||||
|
- **[roles/ping/README.md](roles/ping/README.md)** - Документация роли Ping
|
||||||
|
|
||||||
|
### Docker образы
|
||||||
|
|
||||||
|
- **[dockerfiles/README.md](dockerfiles/README.md)** - Информация об образах
|
||||||
|
|
||||||
|
## 🐳 Docker образы
|
||||||
|
|
||||||
|
Проект использует готовые Docker образы для различных ОС:
|
||||||
|
|
||||||
|
- **Ubuntu** 20.04, 22.04, 24.04
|
||||||
|
- **Debian** 9, 10, 11, 12
|
||||||
|
- **CentOS** 7, 8, 9
|
||||||
|
- **AlmaLinux** 8, 9
|
||||||
|
- **Rocky Linux** 8, 9
|
||||||
|
- **RHEL** 8, 9
|
||||||
|
|
||||||
|
Все образы с поддержкой systemd для корректной работы служб.
|
||||||
|
|
||||||
|
## 🛠️ Разработка новых ролей
|
||||||
|
|
||||||
|
### Создание структуры роли
|
||||||
|
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
|
||||||
|
### Основные файлы
|
||||||
|
|
||||||
|
**tasks/main.yml:**
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
- name: Пример задачи
|
||||||
|
debug:
|
||||||
|
msg: "Роль my-role выполнена"
|
||||||
|
```
|
||||||
|
|
||||||
|
**defaults/main.yml:**
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
# Переменные по умолчанию
|
||||||
|
my_role_enabled: true
|
||||||
|
my_role_version: "1.0.0"
|
||||||
|
```
|
||||||
|
|
||||||
|
**README.md:**
|
||||||
|
```markdown
|
||||||
|
# Роль My-Role
|
||||||
|
|
||||||
|
Описание роли...
|
||||||
|
```
|
||||||
|
|
||||||
|
### Тестирование новой роли
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка синтаксиса
|
||||||
|
make role lint my-role
|
||||||
|
|
||||||
|
# Тестирование
|
||||||
|
make role test
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🏗️ CI/CD
|
||||||
|
|
||||||
|
Проект поддерживает интеграцию с различными CI/CD системами:
|
||||||
|
|
||||||
|
- **GitHub Actions** - готовые workflow'ы
|
||||||
|
- **Azure DevOps** - pipeline конфигурации
|
||||||
|
- **Jenkins** - pipeline скрипты
|
||||||
|
- **GitLab CI** - интеграция
|
||||||
|
|
||||||
|
Подробнее в [docs/cicd-setup.md](docs/cicd-setup.md)
|
||||||
|
|
||||||
|
## 📊 Требования
|
||||||
|
|
||||||
|
- **Docker** - для контейнеризации
|
||||||
|
- **Docker Compose** - для оркестрации
|
||||||
|
- **Ansible** >= 2.9
|
||||||
|
- **Molecule** >= 3.0
|
||||||
|
- **Python** >= 3.6
|
||||||
|
|
||||||
|
## 🎯 Поддерживаемые ОС
|
||||||
|
|
||||||
|
### Для тестирования (Docker)
|
||||||
|
- Ubuntu 20.04/22.04/24.04
|
||||||
|
- Debian 9/10/11/12
|
||||||
|
- CentOS 7/8/9
|
||||||
|
- AlmaLinux 8/9
|
||||||
|
- Rocky Linux 8/9
|
||||||
|
- RHEL 8/9
|
||||||
|
|
||||||
|
### Для развертывания
|
||||||
|
- Любые Linux системы с SSH доступом
|
||||||
|
|
||||||
|
## 🤝 Вклад в проект
|
||||||
|
|
||||||
|
1. Fork репозитория
|
||||||
|
2. Создайте feature branch (`git checkout -b feature/amazing-feature`)
|
||||||
|
3. Commit изменения (`git commit -m 'Add amazing feature'`)
|
||||||
|
4. Push в branch (`git push origin feature/amazing-feature`)
|
||||||
|
5. Создайте Pull Request
|
||||||
|
|
||||||
|
## 📄 Лицензия
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
## 📞 Поддержка
|
||||||
|
|
||||||
|
При возникновении проблем:
|
||||||
|
|
||||||
|
1. Проверьте наличие Docker
|
||||||
|
2. Убедитесь, что все preset файлы существуют
|
||||||
|
3. Используйте `make role lint` для проверки синтаксиса
|
||||||
|
4. Проверьте логи тестирования
|
||||||
|
|
||||||
|
## 🎉 Основные достижения
|
||||||
|
|
||||||
|
- ✅ Универсальная preset система
|
||||||
|
- ✅ Мультиплатформенное тестирование
|
||||||
|
- ✅ Автоматическая проверка синтаксиса
|
||||||
|
- ✅ Управление секретами через Ansible Vault
|
||||||
|
- ✅ Готовые Docker образы для разных ОС
|
||||||
|
- ✅ CI/CD интеграция
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
[defaults]
|
|
||||||
inventory = inventory/hosts
|
|
||||||
vault_password_file = vault-password.txt
|
|
||||||
remote_user = devops
|
|
||||||
host_key_checking = False
|
|
||||||
enable_plugins = yaml, ini
|
|
||||||
roles_path = roles/
|
|
||||||
interpreter_python = auto
|
|
||||||
51
cicd/.gitlab-ci.yml
Normal file
51
cicd/.gitlab-ci.yml
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
# GitLab CI для AnsibleTemplate
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
stages:
|
||||||
|
- test
|
||||||
|
- deploy
|
||||||
|
|
||||||
|
variables:
|
||||||
|
DOCKER_IMAGE: "quay.io/ansible/creator-ee:latest"
|
||||||
|
DOCKER_TLS_CERTDIR: ""
|
||||||
|
ANSIBLE_FORCE_COLOR: "true"
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- echo "Установка зависимостей..."
|
||||||
|
- pip install molecule[docker] ansible-lint
|
||||||
|
- ansible-galaxy collection install -r requirements.yml
|
||||||
|
|
||||||
|
# Тестирование с Molecule
|
||||||
|
test:
|
||||||
|
stage: test
|
||||||
|
image: $DOCKER_IMAGE
|
||||||
|
services:
|
||||||
|
- docker:dind
|
||||||
|
variables:
|
||||||
|
DOCKER_TLS_CERTDIR: ""
|
||||||
|
script:
|
||||||
|
- echo "Запуск тестов Molecule..."
|
||||||
|
- cd molecule/universal
|
||||||
|
- molecule test -s universal
|
||||||
|
artifacts:
|
||||||
|
reports:
|
||||||
|
junit: molecule/universal/.molecule/reports/junit.xml
|
||||||
|
paths:
|
||||||
|
- molecule/universal/.molecule/
|
||||||
|
expire_in: 1 week
|
||||||
|
only:
|
||||||
|
- merge_requests
|
||||||
|
- main
|
||||||
|
- develop
|
||||||
|
|
||||||
|
# Деплой (если нужен)
|
||||||
|
deploy:
|
||||||
|
stage: deploy
|
||||||
|
image: $DOCKER_IMAGE
|
||||||
|
script:
|
||||||
|
- echo "Деплой не настроен"
|
||||||
|
- echo "Добавьте логику деплоя в этот job"
|
||||||
|
when: manual
|
||||||
|
only:
|
||||||
|
- main
|
||||||
167
cicd/azure-devops/azure-pipelines.yml
Normal file
167
cicd/azure-devops/azure-pipelines.yml
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
# Azure DevOps Pipeline для AnsibleLab
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
- main
|
||||||
|
- develop
|
||||||
|
|
||||||
|
pool:
|
||||||
|
vmImage: 'ubuntu-latest'
|
||||||
|
|
||||||
|
variables:
|
||||||
|
ANSIBLE_FORCE_COLOR: 'true'
|
||||||
|
DOCKER_TLS_CERTDIR: ''
|
||||||
|
|
||||||
|
stages:
|
||||||
|
# Стадия 1: Lint проверка
|
||||||
|
- stage: Lint
|
||||||
|
displayName: '🔍 Lint Check'
|
||||||
|
jobs:
|
||||||
|
- job: LintJob
|
||||||
|
displayName: 'Run Lint'
|
||||||
|
steps:
|
||||||
|
- task: UsePythonVersion@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: '3.11'
|
||||||
|
displayName: 'Use Python 3.11'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
pip install --upgrade pip
|
||||||
|
pip install ansible ansible-lint
|
||||||
|
ansible-galaxy collection install -r requirements.yml
|
||||||
|
displayName: 'Install Dependencies'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
echo "🔍 Проверка синтаксиса ролей..."
|
||||||
|
make role lint
|
||||||
|
displayName: 'Run Ansible Lint'
|
||||||
|
|
||||||
|
- task: PublishBuildArtifacts@1
|
||||||
|
inputs:
|
||||||
|
pathToPublish: '.ansible-lint'
|
||||||
|
artifactName: 'lint-results'
|
||||||
|
condition: always()
|
||||||
|
|
||||||
|
# Стадия 2: Тестирование
|
||||||
|
- stage: Test
|
||||||
|
displayName: '🧪 Role Testing'
|
||||||
|
dependsOn: Lint
|
||||||
|
condition: succeeded()
|
||||||
|
jobs:
|
||||||
|
- job: TestJob
|
||||||
|
displayName: 'Run Tests'
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
minimal:
|
||||||
|
preset: minimal
|
||||||
|
default:
|
||||||
|
preset: default
|
||||||
|
performance:
|
||||||
|
preset: performance
|
||||||
|
steps:
|
||||||
|
- task: UsePythonVersion@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: '3.11'
|
||||||
|
displayName: 'Use Python 3.11'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y docker.io make
|
||||||
|
sudo systemctl start docker
|
||||||
|
sudo usermod -aG docker $USER
|
||||||
|
displayName: 'Install System Dependencies'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
pip install --upgrade pip
|
||||||
|
pip install ansible ansible-lint
|
||||||
|
ansible-galaxy collection install -r requirements.yml
|
||||||
|
displayName: 'Install Python Dependencies'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
make docker setup-builder
|
||||||
|
make docker build
|
||||||
|
displayName: 'Setup Docker and Build Images'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
echo "🧪 Тестирование с preset: $(preset)"
|
||||||
|
make role test $(preset)
|
||||||
|
displayName: 'Run Molecule Tests'
|
||||||
|
env:
|
||||||
|
PRESET: $(preset)
|
||||||
|
|
||||||
|
- task: PublishTestResults@2
|
||||||
|
inputs:
|
||||||
|
testResultsFiles: 'molecule/default/.molecule/reports/junit.xml'
|
||||||
|
testRunTitle: 'Molecule Test Results - $(preset)'
|
||||||
|
condition: always()
|
||||||
|
|
||||||
|
- task: PublishBuildArtifacts@1
|
||||||
|
inputs:
|
||||||
|
pathToPublish: 'molecule/default/.molecule'
|
||||||
|
artifactName: 'test-results-$(preset)'
|
||||||
|
condition: always()
|
||||||
|
|
||||||
|
# Стадия 3: Деплой (только для main ветки)
|
||||||
|
- stage: Deploy
|
||||||
|
displayName: '🚀 Deploy Check'
|
||||||
|
dependsOn: [Lint, Test]
|
||||||
|
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
|
||||||
|
jobs:
|
||||||
|
- job: DeployJob
|
||||||
|
displayName: 'Check Deployment'
|
||||||
|
steps:
|
||||||
|
- task: UsePythonVersion@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: '3.11'
|
||||||
|
displayName: 'Use Python 3.11'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
pip install --upgrade pip
|
||||||
|
pip install ansible ansible-lint
|
||||||
|
ansible-galaxy collection install -r requirements.yml
|
||||||
|
displayName: 'Install Dependencies'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
mkdir -p inventory
|
||||||
|
cat > inventory/hosts.ini << EOF
|
||||||
|
[test_servers]
|
||||||
|
localhost ansible_connection=local
|
||||||
|
|
||||||
|
[all:vars]
|
||||||
|
ansible_python_interpreter=python3
|
||||||
|
EOF
|
||||||
|
displayName: 'Create Inventory File'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
echo "🚀 Проверка развертывания (dry-run)..."
|
||||||
|
make role deploy
|
||||||
|
displayName: 'Run Deployment Check'
|
||||||
|
|
||||||
|
- task: PublishBuildArtifacts@1
|
||||||
|
inputs:
|
||||||
|
pathToPublish: 'deployment.log'
|
||||||
|
artifactName: 'deployment-results'
|
||||||
|
condition: always()
|
||||||
|
|
||||||
|
# Уведомления
|
||||||
|
- stage: Notify
|
||||||
|
displayName: '📢 Notifications'
|
||||||
|
dependsOn: [Lint, Test, Deploy]
|
||||||
|
condition: always()
|
||||||
|
jobs:
|
||||||
|
- job: NotifyJob
|
||||||
|
displayName: 'Send Notifications'
|
||||||
|
steps:
|
||||||
|
- script: |
|
||||||
|
echo "🔍 Lint: $(Lint.result)"
|
||||||
|
echo "🧪 Test: $(Test.result)"
|
||||||
|
echo "🚀 Deploy: $(Deploy.result)"
|
||||||
|
|
||||||
|
if [ "$(Lint.result)" = "Succeeded" ] && [ "$(Test.result)" = "Succeeded" ]; then
|
||||||
|
echo "✅ Все проверки пройдены успешно!"
|
||||||
|
else
|
||||||
|
echo "❌ Проверки не пройдены!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
displayName: 'Check Results and Notify'
|
||||||
172
cicd/github/workflows.yml
Normal file
172
cicd/github/workflows.yml
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
# GitHub Actions Workflow для AnsibleLab
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
name: AnsibleLab CI/CD Pipeline
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main, develop ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ main ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
# Стадия 1: Lint проверка
|
||||||
|
lint:
|
||||||
|
name: 🔍 Lint Check
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v4
|
||||||
|
with:
|
||||||
|
python-version: '3.11'
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
pip install --upgrade pip
|
||||||
|
pip install ansible ansible-lint
|
||||||
|
ansible-galaxy collection install -r requirements.yml
|
||||||
|
|
||||||
|
- name: Run Ansible Lint
|
||||||
|
run: |
|
||||||
|
echo "🔍 Проверка синтаксиса ролей..."
|
||||||
|
make role lint
|
||||||
|
|
||||||
|
- name: Upload lint results
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
if: always()
|
||||||
|
with:
|
||||||
|
name: lint-results
|
||||||
|
path: |
|
||||||
|
.ansible-lint
|
||||||
|
lint-report.txt
|
||||||
|
|
||||||
|
# Стадия 2: Тестирование
|
||||||
|
test:
|
||||||
|
name: 🧪 Role Testing
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: lint
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
preset: [minimal, default, performance]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v4
|
||||||
|
with:
|
||||||
|
python-version: '3.11'
|
||||||
|
|
||||||
|
- name: Install system dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y docker.io make
|
||||||
|
sudo systemctl start docker
|
||||||
|
sudo usermod -aG docker $USER
|
||||||
|
|
||||||
|
- name: Install Python dependencies
|
||||||
|
run: |
|
||||||
|
pip install --upgrade pip
|
||||||
|
pip install ansible ansible-lint
|
||||||
|
ansible-galaxy collection install -r requirements.yml
|
||||||
|
|
||||||
|
- name: Setup Docker builder
|
||||||
|
run: |
|
||||||
|
make docker setup-builder
|
||||||
|
|
||||||
|
- name: Build Docker images
|
||||||
|
run: |
|
||||||
|
make docker build
|
||||||
|
|
||||||
|
- name: Run Molecule tests
|
||||||
|
run: |
|
||||||
|
echo "🧪 Тестирование с preset: ${{ matrix.preset }}"
|
||||||
|
make role test ${{ matrix.preset }}
|
||||||
|
|
||||||
|
- name: Upload test results
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
if: always()
|
||||||
|
with:
|
||||||
|
name: test-results-${{ matrix.preset }}
|
||||||
|
path: |
|
||||||
|
molecule/default/.molecule/
|
||||||
|
test-report-${{ matrix.preset }}.txt
|
||||||
|
|
||||||
|
# Стадия 3: Деплой (только для main ветки)
|
||||||
|
deploy:
|
||||||
|
name: 🚀 Deploy Check
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [lint, test]
|
||||||
|
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Python
|
||||||
|
uses: actions/setup-python@v4
|
||||||
|
with:
|
||||||
|
python-version: '3.11'
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
pip install --upgrade pip
|
||||||
|
pip install ansible ansible-lint
|
||||||
|
ansible-galaxy collection install -r requirements.yml
|
||||||
|
|
||||||
|
- name: Create inventory file
|
||||||
|
run: |
|
||||||
|
mkdir -p inventory
|
||||||
|
cat > inventory/hosts.ini << EOF
|
||||||
|
[test_servers]
|
||||||
|
localhost ansible_connection=local
|
||||||
|
|
||||||
|
[all:vars]
|
||||||
|
ansible_python_interpreter=python3
|
||||||
|
EOF
|
||||||
|
|
||||||
|
- name: Run deployment check
|
||||||
|
run: |
|
||||||
|
echo "🚀 Проверка развертывания (dry-run)..."
|
||||||
|
make role deploy
|
||||||
|
|
||||||
|
- name: Upload deployment results
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
if: always()
|
||||||
|
with:
|
||||||
|
name: deployment-results
|
||||||
|
path: |
|
||||||
|
deployment.log
|
||||||
|
deployment-report.txt
|
||||||
|
|
||||||
|
# Уведомления
|
||||||
|
notify:
|
||||||
|
name: 📢 Notifications
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [lint, test, deploy]
|
||||||
|
if: always()
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Notify on success
|
||||||
|
if: needs.lint.result == 'success' && needs.test.result == 'success'
|
||||||
|
run: |
|
||||||
|
echo "✅ Все проверки пройдены успешно!"
|
||||||
|
echo "🔍 Lint: ${{ needs.lint.result }}"
|
||||||
|
echo "🧪 Test: ${{ needs.test.result }}"
|
||||||
|
echo "🚀 Deploy: ${{ needs.deploy.result }}"
|
||||||
|
|
||||||
|
- name: Notify on failure
|
||||||
|
if: needs.lint.result == 'failure' || needs.test.result == 'failure'
|
||||||
|
run: |
|
||||||
|
echo "❌ Проверки не пройдены!"
|
||||||
|
echo "🔍 Lint: ${{ needs.lint.result }}"
|
||||||
|
echo "🧪 Test: ${{ needs.test.result }}"
|
||||||
|
echo "🚀 Deploy: ${{ needs.deploy.result }}"
|
||||||
|
exit 1
|
||||||
153
cicd/gitlab/.gitlab-ci.yml
Normal file
153
cicd/gitlab/.gitlab-ci.yml
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
# GitLab CI Pipeline для AnsibleLab
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
stages:
|
||||||
|
- lint
|
||||||
|
- test
|
||||||
|
- deploy
|
||||||
|
|
||||||
|
variables:
|
||||||
|
ANSIBLE_FORCE_COLOR: "true"
|
||||||
|
DOCKER_TLS_CERTDIR: ""
|
||||||
|
|
||||||
|
# Стадия 1: Lint проверка
|
||||||
|
lint:
|
||||||
|
stage: lint
|
||||||
|
image: python:3.11
|
||||||
|
before_script:
|
||||||
|
- pip install --upgrade pip
|
||||||
|
- pip install ansible ansible-lint
|
||||||
|
- ansible-galaxy collection install -r requirements.yml
|
||||||
|
script:
|
||||||
|
- echo "🔍 Проверка синтаксиса ролей..."
|
||||||
|
- make role lint
|
||||||
|
artifacts:
|
||||||
|
reports:
|
||||||
|
junit: .ansible-lint
|
||||||
|
paths:
|
||||||
|
- .ansible-lint
|
||||||
|
expire_in: 1 week
|
||||||
|
|
||||||
|
# Стадия 2: Тестирование
|
||||||
|
test_minimal:
|
||||||
|
stage: test
|
||||||
|
image: docker:latest
|
||||||
|
services:
|
||||||
|
- docker:dind
|
||||||
|
variables:
|
||||||
|
DOCKER_TLS_CERTDIR: ""
|
||||||
|
before_script:
|
||||||
|
- apk add --no-cache make python3 py3-pip
|
||||||
|
- pip install --upgrade pip
|
||||||
|
- pip install ansible ansible-lint
|
||||||
|
- ansible-galaxy collection install -r requirements.yml
|
||||||
|
- make docker setup-builder
|
||||||
|
- make docker build
|
||||||
|
script:
|
||||||
|
- echo "🧪 Тестирование с preset: minimal"
|
||||||
|
- make role test minimal
|
||||||
|
artifacts:
|
||||||
|
reports:
|
||||||
|
junit: molecule/default/.molecule/reports/junit.xml
|
||||||
|
paths:
|
||||||
|
- molecule/default/.molecule/
|
||||||
|
expire_in: 1 week
|
||||||
|
|
||||||
|
test_default:
|
||||||
|
stage: test
|
||||||
|
image: docker:latest
|
||||||
|
services:
|
||||||
|
- docker:dind
|
||||||
|
variables:
|
||||||
|
DOCKER_TLS_CERTDIR: ""
|
||||||
|
before_script:
|
||||||
|
- apk add --no-cache make python3 py3-pip
|
||||||
|
- pip install --upgrade pip
|
||||||
|
- pip install ansible ansible-lint
|
||||||
|
- ansible-galaxy collection install -r requirements.yml
|
||||||
|
- make docker setup-builder
|
||||||
|
- make docker build
|
||||||
|
script:
|
||||||
|
- echo "🧪 Тестирование с preset: default"
|
||||||
|
- make role test default
|
||||||
|
artifacts:
|
||||||
|
reports:
|
||||||
|
junit: molecule/default/.molecule/reports/junit.xml
|
||||||
|
paths:
|
||||||
|
- molecule/default/.molecule/
|
||||||
|
expire_in: 1 week
|
||||||
|
|
||||||
|
test_performance:
|
||||||
|
stage: test
|
||||||
|
image: docker:latest
|
||||||
|
services:
|
||||||
|
- docker:dind
|
||||||
|
variables:
|
||||||
|
DOCKER_TLS_CERTDIR: ""
|
||||||
|
before_script:
|
||||||
|
- apk add --no-cache make python3 py3-pip
|
||||||
|
- pip install --upgrade pip
|
||||||
|
- pip install ansible ansible-lint
|
||||||
|
- ansible-galaxy collection install -r requirements.yml
|
||||||
|
- make docker setup-builder
|
||||||
|
- make docker build
|
||||||
|
script:
|
||||||
|
- echo "🧪 Тестирование с preset: performance"
|
||||||
|
- make role test performance
|
||||||
|
artifacts:
|
||||||
|
reports:
|
||||||
|
junit: molecule/default/.molecule/reports/junit.xml
|
||||||
|
paths:
|
||||||
|
- molecule/default/.molecule/
|
||||||
|
expire_in: 1 week
|
||||||
|
|
||||||
|
# Стадия 3: Деплой (только для main ветки)
|
||||||
|
deploy:
|
||||||
|
stage: deploy
|
||||||
|
image: python:3.11
|
||||||
|
only:
|
||||||
|
- main
|
||||||
|
before_script:
|
||||||
|
- pip install --upgrade pip
|
||||||
|
- pip install ansible ansible-lint
|
||||||
|
- ansible-galaxy collection install -r requirements.yml
|
||||||
|
script:
|
||||||
|
- echo "🚀 Проверка развертывания (dry-run)..."
|
||||||
|
- mkdir -p inventory
|
||||||
|
- |
|
||||||
|
cat > inventory/hosts.ini << EOF
|
||||||
|
[test_servers]
|
||||||
|
localhost ansible_connection=local
|
||||||
|
|
||||||
|
[all:vars]
|
||||||
|
ansible_python_interpreter=python3
|
||||||
|
EOF
|
||||||
|
- make role deploy
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- deployment.log
|
||||||
|
expire_in: 1 week
|
||||||
|
|
||||||
|
# Уведомления
|
||||||
|
notify_success:
|
||||||
|
stage: deploy
|
||||||
|
image: python:3.11
|
||||||
|
only:
|
||||||
|
- main
|
||||||
|
when: on_success
|
||||||
|
script:
|
||||||
|
- echo "✅ Все проверки пройдены успешно!"
|
||||||
|
- echo "🔍 Lint: Success"
|
||||||
|
- echo "🧪 Test: Success"
|
||||||
|
- echo "🚀 Deploy: Success"
|
||||||
|
|
||||||
|
notify_failure:
|
||||||
|
stage: deploy
|
||||||
|
image: python:3.11
|
||||||
|
when: on_failure
|
||||||
|
script:
|
||||||
|
- echo "❌ Проверки не пройдены!"
|
||||||
|
- echo "🔍 Lint: Failed"
|
||||||
|
- echo "🧪 Test: Failed"
|
||||||
|
- echo "🚀 Deploy: Failed"
|
||||||
138
cicd/jenkins/Jenkinsfile
vendored
Normal file
138
cicd/jenkins/Jenkinsfile
vendored
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
// Jenkins Pipeline для AnsibleLab
|
||||||
|
// Автор: Сергей Антропов
|
||||||
|
// Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
|
||||||
|
environment {
|
||||||
|
ANSIBLE_FORCE_COLOR = 'true'
|
||||||
|
DOCKER_TLS_CERTDIR = ''
|
||||||
|
}
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage('Checkout') {
|
||||||
|
steps {
|
||||||
|
checkout scm
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Стадия 1: Lint проверка
|
||||||
|
stage('🔍 Lint Check') {
|
||||||
|
steps {
|
||||||
|
sh '''
|
||||||
|
echo "🔍 Проверка синтаксиса ролей..."
|
||||||
|
pip install --upgrade pip
|
||||||
|
pip install ansible ansible-lint
|
||||||
|
ansible-galaxy collection install -r requirements.yml
|
||||||
|
make role lint
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
archiveArtifacts artifacts: '.ansible-lint', allowEmptyArchive: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Стадия 2: Тестирование
|
||||||
|
stage('🧪 Role Testing') {
|
||||||
|
parallel {
|
||||||
|
stage('Test Minimal') {
|
||||||
|
steps {
|
||||||
|
sh '''
|
||||||
|
echo "🧪 Тестирование с preset: minimal"
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y docker.io make
|
||||||
|
sudo systemctl start docker
|
||||||
|
sudo usermod -aG docker $USER
|
||||||
|
make docker setup-builder
|
||||||
|
make docker build
|
||||||
|
make role test minimal
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Test Default') {
|
||||||
|
steps {
|
||||||
|
sh '''
|
||||||
|
echo "🧪 Тестирование с preset: default"
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y docker.io make
|
||||||
|
sudo systemctl start docker
|
||||||
|
sudo usermod -aG docker $USER
|
||||||
|
make docker setup-builder
|
||||||
|
make docker build
|
||||||
|
make role test default
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Test Performance') {
|
||||||
|
steps {
|
||||||
|
sh '''
|
||||||
|
echo "🧪 Тестирование с preset: performance"
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y docker.io make
|
||||||
|
sudo systemctl start docker
|
||||||
|
sudo usermod -aG docker $USER
|
||||||
|
make docker setup-builder
|
||||||
|
make docker build
|
||||||
|
make role test performance
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Стадия 3: Деплой (только для main ветки)
|
||||||
|
stage('🚀 Deploy Check') {
|
||||||
|
when {
|
||||||
|
branch 'main'
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
sh '''
|
||||||
|
echo "🚀 Проверка развертывания (dry-run)..."
|
||||||
|
pip install --upgrade pip
|
||||||
|
pip install ansible ansible-lint
|
||||||
|
ansible-galaxy collection install -r requirements.yml
|
||||||
|
|
||||||
|
mkdir -p inventory
|
||||||
|
cat > inventory/hosts.ini << EOF
|
||||||
|
[test_servers]
|
||||||
|
localhost ansible_connection=local
|
||||||
|
|
||||||
|
[all:vars]
|
||||||
|
ansible_python_interpreter=python3
|
||||||
|
EOF
|
||||||
|
|
||||||
|
make role deploy
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
archiveArtifacts artifacts: 'deployment.log', allowEmptyArchive: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
archiveArtifacts artifacts: 'molecule/default/.molecule/**/*', allowEmptyArchive: true
|
||||||
|
publishTestResults testResultsPattern: 'molecule/default/.molecule/reports/junit.xml'
|
||||||
|
}
|
||||||
|
|
||||||
|
success {
|
||||||
|
echo '✅ Все проверки пройдены успешно!'
|
||||||
|
echo '🔍 Lint: Success'
|
||||||
|
echo '🧪 Test: Success'
|
||||||
|
echo '🚀 Deploy: Success'
|
||||||
|
}
|
||||||
|
|
||||||
|
failure {
|
||||||
|
echo '❌ Проверки не пройдены!'
|
||||||
|
echo '🔍 Lint: Failed'
|
||||||
|
echo '🧪 Test: Failed'
|
||||||
|
echo '🚀 Deploy: Failed'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
- name: Deploy roles
|
|
||||||
hosts: all
|
|
||||||
become: true
|
|
||||||
become_user: root
|
|
||||||
become_method: ansible.builtin.sudo
|
|
||||||
gather_facts: true
|
|
||||||
vars_files:
|
|
||||||
- ../../vars/secrets.yml
|
|
||||||
roles:
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
- name: Пример таски
|
|
||||||
debug:
|
|
||||||
msg: "Привет! Я запустился на Debian/Ubuntu!"
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
---
|
|
||||||
- name: "Определяем ОС"
|
|
||||||
set_fact:
|
|
||||||
os_family: "{{ ansible_facts['os_family'] }}"
|
|
||||||
|
|
||||||
- name: "Подключаем таски для RedHat совместимых"
|
|
||||||
include_tasks: "redhat/main.yaml"
|
|
||||||
when: os_family == "RedHat"
|
|
||||||
|
|
||||||
- name: "Подключаем таски для Debian/Ubuntu совместимых"
|
|
||||||
include_tasks: "debian/main.yaml"
|
|
||||||
when: os_family == "Debian"
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
- name: Пример таски
|
|
||||||
debug:
|
|
||||||
msg: "Привет! Я запустился на RedHat/CentOS/Fedora!"
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
services:
|
|
||||||
ansible:
|
|
||||||
image: inecs/ansible:latest
|
|
||||||
container_name: ansible
|
|
||||||
volumes:
|
|
||||||
- .:/ansible
|
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
|
||||||
environment:
|
|
||||||
- ANSIBLE_VAULT_PASSWORD_FILE=./vault-password.txt
|
|
||||||
tty: true
|
|
||||||
privileged: true
|
|
||||||
working_dir: /ansible
|
|
||||||
682
dockerfiles/README.md
Normal file
682
dockerfiles/README.md
Normal file
@@ -0,0 +1,682 @@
|
|||||||
|
# Docker образы для универсальной системы тестирования AnsibleLab
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
|
**Версия:** 2.0.0
|
||||||
|
|
||||||
|
## 🐳 Обзор
|
||||||
|
|
||||||
|
Эта директория содержит Docker образы для различных операционных систем и компонентов, используемых в универсальной системе тестирования Ansible ролей. Все образы поддерживают multi-arch сборку (amd64, arm64, riscv64, ppc64le, s390x, 386, arm/v7, arm/v6) и автоматически публикуются в Docker Hub.
|
||||||
|
|
||||||
|
## 📁 Структура
|
||||||
|
|
||||||
|
```
|
||||||
|
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 # Документация
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚀 Доступные образы
|
||||||
|
|
||||||
|
### 1. ansible-controller
|
||||||
|
|
||||||
|
**Базовый образ:** `ubuntu:22.04`
|
||||||
|
**Тег:** `inecs/ansible-lab:ansible-controller-latest`
|
||||||
|
**Описание:** Ansible контроллер с предустановленными коллекциями и инструментами
|
||||||
|
|
||||||
|
#### Компоненты:
|
||||||
|
- **Ansible Core** с последними коллекциями
|
||||||
|
- **Docker CLI** для работы с контейнерами
|
||||||
|
- **kubectl** для управления Kubernetes
|
||||||
|
- **Helm** для управления пакетами Kubernetes
|
||||||
|
- **Kind** для локального Kubernetes
|
||||||
|
- **yq** для работы с YAML
|
||||||
|
- **jq** для работы с JSON
|
||||||
|
|
||||||
|
#### Предустановленные коллекции:
|
||||||
|
```yaml
|
||||||
|
collections:
|
||||||
|
- name: community.docker
|
||||||
|
version: ">=3.0.0"
|
||||||
|
- name: community.general
|
||||||
|
version: ">=7.0.0"
|
||||||
|
- name: ansible.posix
|
||||||
|
version: ">=1.5.4"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Предустановленные роли:
|
||||||
|
- `geerlingguy.docker` - управление Docker
|
||||||
|
- `geerlingguy.kubernetes` - управление Kubernetes
|
||||||
|
|
||||||
|
#### Переменные окружения:
|
||||||
|
```bash
|
||||||
|
DOCKER_HOST=unix:///var/run/docker.sock
|
||||||
|
ANSIBLE_FORCE_COLOR=1
|
||||||
|
ANSIBLE_STDOUT_CALLBACK=yaml
|
||||||
|
ANSIBLE_CALLBACKS_ENABLED=profile_tasks
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Использование:
|
||||||
|
```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
|
||||||
|
|
||||||
|
# Выполнение Ansible команд
|
||||||
|
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 site.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. ubuntu
|
||||||
|
|
||||||
|
**Базовый образ:** `ubuntu:22.04`
|
||||||
|
**Тег:** `inecs/ansible-lab:ubuntu-latest`
|
||||||
|
**Описание:** Ubuntu 22.04 LTS с systemd и Docker
|
||||||
|
|
||||||
|
#### Компоненты:
|
||||||
|
- **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
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Использование:
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. debian
|
||||||
|
|
||||||
|
**Базовый образ:** `debian:bookworm`
|
||||||
|
**Тег:** `inecs/ansible-lab:debian-latest`
|
||||||
|
**Описание:** Debian 12 (Bookworm) с systemd и Docker
|
||||||
|
|
||||||
|
#### Компоненты:
|
||||||
|
- **Debian 12** (Bookworm)
|
||||||
|
- **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
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Использование:
|
||||||
|
```bash
|
||||||
|
# Запуск Debian контейнера
|
||||||
|
docker run -d --privileged \
|
||||||
|
--name debian-test \
|
||||||
|
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
|
||||||
|
--tmpfs /run --tmpfs /run/lock \
|
||||||
|
--cap-add SYS_ADMIN \
|
||||||
|
inecs/ansible-lab:debian-latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. rhel
|
||||||
|
|
||||||
|
**Базовый образ:** `registry.access.redhat.com/ubi8/ubi`
|
||||||
|
**Тег:** `inecs/ansible-lab:rhel-latest`
|
||||||
|
**Описание:** Red Hat Enterprise Linux 8 с systemd и Docker
|
||||||
|
|
||||||
|
#### Компоненты:
|
||||||
|
- **RHEL 8** (Universal Base Image)
|
||||||
|
- **systemd** для управления сервисами
|
||||||
|
- **Docker CE** с Docker Compose
|
||||||
|
- **Python 3** с pip
|
||||||
|
- **Пользователь 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
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Настройки systemd:
|
||||||
|
```bash
|
||||||
|
systemctl set-default multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Использование:
|
||||||
|
```bash
|
||||||
|
# Запуск RHEL контейнера
|
||||||
|
docker run -d --privileged \
|
||||||
|
--name rhel-test \
|
||||||
|
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
|
||||||
|
--tmpfs /run --tmpfs /run/lock \
|
||||||
|
--cap-add SYS_ADMIN \
|
||||||
|
inecs/ansible-lab:rhel-latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. centos
|
||||||
|
|
||||||
|
**Базовый образ:** `quay.io/centos/centos:stream9`
|
||||||
|
**Тег:** `inecs/ansible-lab:centos-latest`
|
||||||
|
**Описание:** CentOS Stream 9 с systemd и Docker
|
||||||
|
|
||||||
|
#### Компоненты:
|
||||||
|
- **CentOS Stream 9**
|
||||||
|
- **systemd** для управления сервисами
|
||||||
|
- **Docker CE** с Docker Compose
|
||||||
|
- **Python 3** с pip
|
||||||
|
- **Пользователь 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
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Настройки systemd:
|
||||||
|
```bash
|
||||||
|
systemctl set-default multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Использование:
|
||||||
|
```bash
|
||||||
|
# Запуск 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:centos-latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. alma
|
||||||
|
|
||||||
|
**Базовый образ:** `almalinux:8`
|
||||||
|
**Тег:** `inecs/ansible-lab:alma-latest`
|
||||||
|
**Описание:** AlmaLinux 8 с systemd и Docker
|
||||||
|
|
||||||
|
#### Компоненты:
|
||||||
|
- **AlmaLinux 8**
|
||||||
|
- **systemd** для управления сервисами
|
||||||
|
- **Docker CE** с Docker Compose
|
||||||
|
- **Python 3** с pip
|
||||||
|
- **Пользователь 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
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Настройки systemd:
|
||||||
|
```bash
|
||||||
|
systemctl set-default multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Использование:
|
||||||
|
```bash
|
||||||
|
# Запуск AlmaLinux контейнера
|
||||||
|
docker run -d --privileged \
|
||||||
|
--name alma-test \
|
||||||
|
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
|
||||||
|
--tmpfs /run --tmpfs /run/lock \
|
||||||
|
--cap-add SYS_ADMIN \
|
||||||
|
inecs/ansible-lab:alma-latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7. rocky
|
||||||
|
|
||||||
|
**Базовый образ:** `rockylinux:8`
|
||||||
|
**Тег:** `inecs/ansible-lab:rocky-latest`
|
||||||
|
**Описание:** Rocky Linux 8 с systemd и Docker
|
||||||
|
|
||||||
|
#### Компоненты:
|
||||||
|
- **Rocky Linux 8**
|
||||||
|
- **systemd** для управления сервисами
|
||||||
|
- **Docker CE** с Docker Compose
|
||||||
|
- **Python 3** с pip
|
||||||
|
- **Пользователь 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
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Настройки systemd:
|
||||||
|
```bash
|
||||||
|
systemctl set-default multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Использование:
|
||||||
|
```bash
|
||||||
|
# Запуск Rocky Linux контейнера
|
||||||
|
docker run -d --privileged \
|
||||||
|
--name rocky-test \
|
||||||
|
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
|
||||||
|
--tmpfs /run --tmpfs /run/lock \
|
||||||
|
--cap-add SYS_ADMIN \
|
||||||
|
inecs/ansible-lab:rocky-latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8. alt-linux
|
||||||
|
|
||||||
|
**Базовый образ:** `altlinux/p9`
|
||||||
|
**Тег:** `inecs/ansible-lab:alt-linux-latest`
|
||||||
|
**Описание:** ALT Linux 9 с systemd и Docker
|
||||||
|
|
||||||
|
#### Компоненты:
|
||||||
|
- **ALT Linux 9** (Platform 9)
|
||||||
|
- **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
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Использование:
|
||||||
|
```bash
|
||||||
|
# Запуск ALT Linux контейнера
|
||||||
|
docker run -d --privileged \
|
||||||
|
--name alt-linux-test \
|
||||||
|
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
|
||||||
|
--tmpfs /run --tmpfs /run/lock \
|
||||||
|
--cap-add SYS_ADMIN \
|
||||||
|
inecs/ansible-lab:alt-linux-latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### 9. astra-linux
|
||||||
|
|
||||||
|
**Базовый образ:** `astralinux/astra-1.7`
|
||||||
|
**Тег:** `inecs/ansible-lab:astra-linux-latest`
|
||||||
|
**Описание:** Astra Linux 1.7 с systemd и Docker
|
||||||
|
|
||||||
|
#### Компоненты:
|
||||||
|
- **Astra Linux 1.7**
|
||||||
|
- **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
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Использование:
|
||||||
|
```bash
|
||||||
|
# Запуск Astra Linux контейнера
|
||||||
|
docker run -d --privileged \
|
||||||
|
--name astra-linux-test \
|
||||||
|
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
|
||||||
|
--tmpfs /run --tmpfs /run/lock \
|
||||||
|
--cap-add SYS_ADMIN \
|
||||||
|
inecs/ansible-lab:astra-linux-latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### 10. redos
|
||||||
|
|
||||||
|
**Базовый образ:** `redos/redos:9`
|
||||||
|
**Тег:** `inecs/ansible-lab:redos-latest`
|
||||||
|
**Описание:** RED OS 9 с systemd и Docker
|
||||||
|
|
||||||
|
#### Компоненты:
|
||||||
|
- **RED OS 9**
|
||||||
|
- **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
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Использование:
|
||||||
|
```bash
|
||||||
|
# Запуск RED OS контейнера
|
||||||
|
docker run -d --privileged \
|
||||||
|
--name redos-test \
|
||||||
|
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
|
||||||
|
--tmpfs /run --tmpfs /run/lock \
|
||||||
|
--cap-add SYS_ADMIN \
|
||||||
|
inecs/ansible-lab:redos-latest
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 Управление образами
|
||||||
|
|
||||||
|
### Сборка всех образов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Сборка всех образов (multi-arch)
|
||||||
|
make docker build
|
||||||
|
|
||||||
|
# Сборка конкретного образа
|
||||||
|
make docker build-image IMAGE=ubuntu
|
||||||
|
|
||||||
|
# Полная пересборка с очисткой кеша
|
||||||
|
make docker rebuild
|
||||||
|
```
|
||||||
|
|
||||||
|
### Отправка в Docker Hub
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Отправка всех образов
|
||||||
|
make docker push
|
||||||
|
|
||||||
|
# Загрузка всех образов
|
||||||
|
make docker pull
|
||||||
|
```
|
||||||
|
|
||||||
|
### Очистка образов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Очистка локальных образов
|
||||||
|
make docker clean
|
||||||
|
|
||||||
|
# Полная очистка Docker
|
||||||
|
make docker purge
|
||||||
|
```
|
||||||
|
|
||||||
|
### Информация об образах
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Информация о собранных образах
|
||||||
|
make docker info
|
||||||
|
|
||||||
|
# Диагностика проблем
|
||||||
|
make docker diagnose
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🏗️ Multi-Arch поддержка
|
||||||
|
|
||||||
|
### Поддерживаемые архитектуры
|
||||||
|
|
||||||
|
| Архитектура | Описание | Статус |
|
||||||
|
|-------------|----------|--------|
|
||||||
|
| `linux/amd64` | Intel/AMD 64-bit | ✅ Поддерживается |
|
||||||
|
| `linux/arm64` | ARM 64-bit | ✅ Поддерживается |
|
||||||
|
| `linux/riscv64` | RISC-V 64-bit | ✅ Поддерживается |
|
||||||
|
| `linux/ppc64le` | PowerPC 64-bit LE | ✅ Поддерживается |
|
||||||
|
| `linux/s390x` | IBM Z 64-bit | ✅ Поддерживается |
|
||||||
|
| `linux/386` | Intel 32-bit | ✅ Поддерживается |
|
||||||
|
| `linux/arm/v7` | ARM 32-bit v7 | ✅ Поддерживается |
|
||||||
|
| `linux/arm/v6` | ARM 32-bit v6 | ✅ Поддерживается |
|
||||||
|
|
||||||
|
### Настройка builder'а
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Настройка multi-arch builder
|
||||||
|
make docker setup-builder
|
||||||
|
|
||||||
|
# Проверка builder'а
|
||||||
|
make docker diagnose
|
||||||
|
|
||||||
|
# Сброс builder'а при проблемах
|
||||||
|
make docker reset-builder
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚀 Использование в preset'ах
|
||||||
|
|
||||||
|
### Пример preset'а с собственными образами
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# molecule/presets/custom-images.yml
|
||||||
|
---
|
||||||
|
#description: Preset с собственными образами AnsibleLab
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
|
||||||
|
# Собственные образы
|
||||||
|
images:
|
||||||
|
ubuntu: "inecs/ansible-lab:ubuntu-latest"
|
||||||
|
debian: "inecs/ansible-lab:debian-latest"
|
||||||
|
rhel: "inecs/ansible-lab:rhel-latest"
|
||||||
|
centos: "inecs/ansible-lab:centos-latest"
|
||||||
|
alma: "inecs/ansible-lab:alma-latest"
|
||||||
|
rocky: "inecs/ansible-lab:rocky-latest"
|
||||||
|
alt: "inecs/ansible-lab:alt-linux-latest"
|
||||||
|
astra: "inecs/ansible-lab:astra-linux-latest"
|
||||||
|
redos: "inecs/ansible-lab:redos-latest"
|
||||||
|
|
||||||
|
systemd_defaults:
|
||||||
|
privileged: true
|
||||||
|
command: "/sbin/init"
|
||||||
|
volumes:
|
||||||
|
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
||||||
|
tmpfs: ["/run", "/run/lock"]
|
||||||
|
capabilities: ["SYS_ADMIN"]
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
- name: ubuntu1
|
||||||
|
family: ubuntu
|
||||||
|
groups: [web, frontend]
|
||||||
|
- name: debian1
|
||||||
|
family: debian
|
||||||
|
groups: [web, frontend]
|
||||||
|
- name: rhel1
|
||||||
|
family: rhel
|
||||||
|
groups: [database, backend]
|
||||||
|
- name: centos1
|
||||||
|
family: centos
|
||||||
|
groups: [database, backend]
|
||||||
|
- name: alma1
|
||||||
|
family: alma
|
||||||
|
groups: [monitoring]
|
||||||
|
- name: rocky1
|
||||||
|
family: rocky
|
||||||
|
groups: [monitoring]
|
||||||
|
- name: alt1
|
||||||
|
family: alt
|
||||||
|
groups: [security]
|
||||||
|
- name: astra1
|
||||||
|
family: astra
|
||||||
|
groups: [security]
|
||||||
|
- name: redos1
|
||||||
|
family: redos
|
||||||
|
groups: [security]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Тестирование с собственными образами
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Тестирование с собственными образами
|
||||||
|
make custom-images test full
|
||||||
|
|
||||||
|
# Проверка наличия образов
|
||||||
|
make custom-images check
|
||||||
|
|
||||||
|
# Сборка всех образов
|
||||||
|
make custom-images build
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 Мониторинг и диагностика
|
||||||
|
|
||||||
|
### Проверка образов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка размера образов
|
||||||
|
docker images | grep inecs/ansible-lab
|
||||||
|
|
||||||
|
# Проверка архитектур
|
||||||
|
docker manifest inspect inecs/ansible-lab:ubuntu-latest
|
||||||
|
|
||||||
|
# Проверка содержимого образа
|
||||||
|
docker run --rm inecs/ansible-lab:ubuntu-latest cat /etc/os-release
|
||||||
|
```
|
||||||
|
|
||||||
|
### Логи сборки
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Подробные логи сборки
|
||||||
|
make docker build 2>&1 | tee build.log
|
||||||
|
|
||||||
|
# Логи конкретного образа
|
||||||
|
make docker build-image IMAGE=ubuntu 2>&1 | tee ubuntu-build.log
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🐛 Troubleshooting
|
||||||
|
|
||||||
|
### Проблемы с сборкой
|
||||||
|
|
||||||
|
1. **Builder не создается:**
|
||||||
|
```bash
|
||||||
|
make docker diagnose
|
||||||
|
make docker reset-builder
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Образы не собираются:**
|
||||||
|
```bash
|
||||||
|
make docker clean
|
||||||
|
make docker setup-builder
|
||||||
|
make docker build
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Проблемы с multi-arch:**
|
||||||
|
```bash
|
||||||
|
make docker clean-builder
|
||||||
|
make docker setup-builder
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проблемы с образами
|
||||||
|
|
||||||
|
1. **Образы не запускаются:**
|
||||||
|
```bash
|
||||||
|
# Проверка systemd
|
||||||
|
docker run --rm --privileged inecs/ansible-lab:ubuntu-latest systemctl status
|
||||||
|
|
||||||
|
# Проверка Docker
|
||||||
|
docker run --rm --privileged inecs/ansible-lab:ubuntu-latest docker --version
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Проблемы с правами:**
|
||||||
|
```bash
|
||||||
|
# Проверка пользователя ansible
|
||||||
|
docker run --rm inecs/ansible-lab:ubuntu-latest id ansible
|
||||||
|
|
||||||
|
# Проверка sudo прав
|
||||||
|
docker run --rm inecs/ansible-lab:ubuntu-latest sudo -l
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📈 Производительность
|
||||||
|
|
||||||
|
### Оптимизация сборки
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Использование кеша Docker
|
||||||
|
make docker build
|
||||||
|
|
||||||
|
# Очистка кеша при проблемах
|
||||||
|
make docker rebuild
|
||||||
|
```
|
||||||
|
|
||||||
|
### Оптимизация образов
|
||||||
|
|
||||||
|
- **Многоэтапная сборка** для уменьшения размера
|
||||||
|
- **Кеширование слоев** для ускорения сборки
|
||||||
|
- **Минимальные базовые образы** для безопасности
|
||||||
|
- **Оптимизированные зависимости** для производительности
|
||||||
|
|
||||||
|
## 🔒 Безопасность
|
||||||
|
|
||||||
|
### Безопасность образов
|
||||||
|
|
||||||
|
- **Регулярные обновления** базовых образов
|
||||||
|
- **Минимальные права** для пользователей
|
||||||
|
- **Сканирование уязвимостей** в CI/CD
|
||||||
|
- **Подписанные образы** для целостности
|
||||||
|
|
||||||
|
### Лучшие практики
|
||||||
|
|
||||||
|
1. **Используйте конкретные теги** вместо `latest`
|
||||||
|
2. **Регулярно обновляйте** базовые образы
|
||||||
|
3. **Сканируйте образы** на уязвимости
|
||||||
|
4. **Используйте multi-arch** для совместимости
|
||||||
|
|
||||||
|
## 📚 Дополнительные ресурсы
|
||||||
|
|
||||||
|
- [Docker Multi-Arch Build](https://docs.docker.com/buildx/working-with-buildx/)
|
||||||
|
- [Ansible Collections](https://docs.ansible.com/ansible/latest/collections_guide/index.html)
|
||||||
|
- [Molecule Documentation](https://molecule.readthedocs.io/)
|
||||||
|
- [Systemd in Containers](https://systemd.io/CONTAINER_INTERFACE/)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
52
dockerfiles/alma/Dockerfile
Normal file
52
dockerfiles/alma/Dockerfile
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
# AlmaLinux с systemd
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
# https://hub.docker.com/_/almalinux
|
||||||
|
|
||||||
|
FROM almalinux:8
|
||||||
|
|
||||||
|
# Обновляем систему
|
||||||
|
RUN dnf update -y && dnf upgrade -y
|
||||||
|
|
||||||
|
# Устанавливаем systemd и необходимые пакеты
|
||||||
|
RUN dnf install -y \
|
||||||
|
systemd \
|
||||||
|
systemd-sysv \
|
||||||
|
dbus \
|
||||||
|
curl \
|
||||||
|
wget \
|
||||||
|
nano \
|
||||||
|
python39 \
|
||||||
|
python39-pip \
|
||||||
|
sudo \
|
||||||
|
&& dnf clean all
|
||||||
|
|
||||||
|
# Создаем symlink для python3 -> python3.9
|
||||||
|
RUN ln -sf /usr/bin/python3.9 /usr/bin/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
|
||||||
|
# RUN 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-buildx-plugin docker-compose-plugin
|
||||||
|
|
||||||
|
# Устанавливаем 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"]
|
||||||
52
dockerfiles/alt-linux/Dockerfile
Normal file
52
dockerfiles/alt-linux/Dockerfile
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
# ALT Linux с systemd
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
# https://hub.docker.com/_/alt/tags
|
||||||
|
|
||||||
|
FROM alt:p9
|
||||||
|
|
||||||
|
# Обновляем систему
|
||||||
|
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.7
|
||||||
|
RUN curl -sS https://bootstrap.pypa.io/pip/3.7/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"]
|
||||||
93
dockerfiles/ansible-controller/Dockerfile
Normal file
93
dockerfiles/ansible-controller/Dockerfile
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
# Ansible Controller с предустановленными коллекциями
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
FROM ubuntu:22.04
|
||||||
|
|
||||||
|
# Обновляем систему
|
||||||
|
RUN apt-get update && apt-get upgrade -y && apt-get clean
|
||||||
|
|
||||||
|
# Устанавливаем Python и Ansible
|
||||||
|
RUN apt-get install -y \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
python3-venv \
|
||||||
|
python3-dev \
|
||||||
|
build-essential \
|
||||||
|
&& apt-get clean
|
||||||
|
|
||||||
|
# Устанавливаем Ansible, ansible-lint и passlib для хеширования паролей
|
||||||
|
RUN pip3 install ansible ansible-core ansible-lint passlib
|
||||||
|
|
||||||
|
# Устанавливаем дополнительные пакеты
|
||||||
|
RUN apt-get install -y \
|
||||||
|
curl \
|
||||||
|
wget \
|
||||||
|
git \
|
||||||
|
vim \
|
||||||
|
nano \
|
||||||
|
htop \
|
||||||
|
tree \
|
||||||
|
jq \
|
||||||
|
&& apt-get clean
|
||||||
|
|
||||||
|
# Устанавливаем 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 CLI
|
||||||
|
RUN apt-get install -y docker.io docker-compose
|
||||||
|
|
||||||
|
# Устанавливаем kubectl
|
||||||
|
RUN curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" \
|
||||||
|
&& chmod +x kubectl \
|
||||||
|
&& mv kubectl /usr/local/bin/
|
||||||
|
|
||||||
|
# Устанавливаем 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/
|
||||||
|
|
||||||
|
## Устанавливаем Istio CLI
|
||||||
|
#RUN curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.22.1 sh - \
|
||||||
|
# && mv istio-1.22.1/bin/istioctl /usr/local/bin/ \
|
||||||
|
# && rm -rf istio-1.22.1
|
||||||
|
|
||||||
|
# Копируем файлы зависимостей
|
||||||
|
COPY requirements.yml /tmp/requirements.yml
|
||||||
|
COPY requirements.txt /tmp/requirements.txt
|
||||||
|
|
||||||
|
# Устанавливаем Python зависимости
|
||||||
|
RUN pip3 install -r /tmp/requirements.txt
|
||||||
|
|
||||||
|
# Устанавливаем Ansible коллекции
|
||||||
|
RUN ansible-galaxy collection install -r /tmp/requirements.yml
|
||||||
|
|
||||||
|
# Создаем пользователя ansible
|
||||||
|
RUN useradd -m -s /bin/bash ansible \
|
||||||
|
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
|
||||||
|
|
||||||
|
# Создаем рабочую директорию
|
||||||
|
WORKDIR /ansible
|
||||||
|
|
||||||
|
# Устанавливаем права
|
||||||
|
RUN chown -R ansible:ansible /ansible
|
||||||
|
|
||||||
|
# Переключаемся на пользователя ansible
|
||||||
|
USER ansible
|
||||||
|
|
||||||
|
# Устанавливаем дополнительные роли
|
||||||
|
RUN ansible-galaxy install geerlingguy.docker \
|
||||||
|
&& ansible-galaxy install geerlingguy.kubernetes
|
||||||
|
|
||||||
|
# Настройки для работы с Docker
|
||||||
|
ENV DOCKER_HOST=unix:///var/run/docker.sock
|
||||||
|
ENV ANSIBLE_FORCE_COLOR=1
|
||||||
|
ENV ANSIBLE_STDOUT_CALLBACK=yaml
|
||||||
|
ENV ANSIBLE_CALLBACKS_ENABLED=profile_tasks
|
||||||
|
|
||||||
|
# Команда по умолчанию
|
||||||
|
CMD ["sleep", "infinity"]
|
||||||
22
dockerfiles/ansible-controller/docker-compose.yml
Normal file
22
dockerfiles/ansible-controller/docker-compose.yml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
version: "3.9"
|
||||||
|
|
||||||
|
services:
|
||||||
|
ansible-controller:
|
||||||
|
image: inecs/ansible-lab:ansible-controller-latest
|
||||||
|
container_name: ansible-controller
|
||||||
|
privileged: true
|
||||||
|
command: sleep infinity
|
||||||
|
environment:
|
||||||
|
DOCKER_HOST: unix:///var/run/docker.sock
|
||||||
|
ANSIBLE_VAULT_PASSWORD_FILE: /ansible/vault/.vault
|
||||||
|
volumes:
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
- .:/ansible
|
||||||
|
working_dir: /ansible
|
||||||
|
networks:
|
||||||
|
- labnet
|
||||||
|
|
||||||
|
networks:
|
||||||
|
labnet:
|
||||||
|
external: true
|
||||||
|
|
||||||
9
dockerfiles/ansible-controller/requirements.txt
Normal file
9
dockerfiles/ansible-controller/requirements.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# Python зависимости для Ansible Controller
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
# Основные зависимости для работы с паролями
|
||||||
|
passlib>=1.7.4
|
||||||
|
|
||||||
|
# Дополнительные зависимости для безопасности
|
||||||
|
bcrypt>=4.0.1
|
||||||
9
dockerfiles/ansible-controller/requirements.yml
Normal file
9
dockerfiles/ansible-controller/requirements.yml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
# Ansible Collections for Molecule Universal
|
||||||
|
collections:
|
||||||
|
- name: community.docker
|
||||||
|
version: ">=3.0.0"
|
||||||
|
- name: community.general
|
||||||
|
version: ">=7.0.0"
|
||||||
|
- name: ansible.posix
|
||||||
|
version: ">=1.5.4"
|
||||||
70
dockerfiles/astra-linux/Dockerfile
Normal file
70
dockerfiles/astra-linux/Dockerfile
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
# Astra Linux с systemd
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
# https://registry.astralinux.ru/browse/library/
|
||||||
|
# ВАЖНО: Базовый образ поддерживает только linux/amd64
|
||||||
|
# Для сборки используйте: docker buildx build --platform linux/amd64
|
||||||
|
|
||||||
|
FROM registry.astralinux.ru/library/astra/ubi17:1.7.6.uu2
|
||||||
|
|
||||||
|
# Обновляем систему
|
||||||
|
RUN apt-get update && apt-get dist-upgrade -y
|
||||||
|
|
||||||
|
# Устанавливаем systemd и необходимые пакеты
|
||||||
|
RUN apt-get install -y \
|
||||||
|
systemd \
|
||||||
|
systemd-sysv \
|
||||||
|
dbus \
|
||||||
|
curl \
|
||||||
|
wget \
|
||||||
|
nano \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
sudo \
|
||||||
|
&& 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 вручную для AstraLinux (автоопределение архитектуры)
|
||||||
|
# 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 buster 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
|
||||||
|
|
||||||
|
# Отключаем Parsec для работы в контейнере
|
||||||
|
RUN if [ -f /etc/parsec/parsec.conf ]; then \
|
||||||
|
sed -i 's/enabled=1/enabled=0/' /etc/parsec/parsec.conf || true; \
|
||||||
|
fi && \
|
||||||
|
if [ -f /lib/modules/$(uname -r)/parsec.ko ]; then \
|
||||||
|
mv /lib/modules/$(uname -r)/parsec.ko /lib/modules/$(uname -r)/parsec.ko.disabled || true; \
|
||||||
|
fi && \
|
||||||
|
systemctl disable parsec 2>/dev/null || true
|
||||||
|
|
||||||
|
# Настраиваем systemd
|
||||||
|
RUN systemctl set-default multi-user.target
|
||||||
|
|
||||||
|
# Настраиваем sudoers для root и пользователей
|
||||||
|
RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
|
||||||
|
echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test
|
||||||
|
|
||||||
|
# Создаем пользователя для Ansible
|
||||||
|
RUN useradd -m -s /bin/bash ansible \
|
||||||
|
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
|
||||||
|
|
||||||
|
# Команда по умолчанию (система запускается от root для systemd)
|
||||||
|
CMD ["/sbin/init"]
|
||||||
50
dockerfiles/centos7/Dockerfile
Normal file
50
dockerfiles/centos7/Dockerfile
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
# CentOS 7 с systemd
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
FROM centos:7
|
||||||
|
|
||||||
|
# Настраиваем vault репозитории для CentOS 7 (так как основные репозитории больше не поддерживаются)
|
||||||
|
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*.repo && \
|
||||||
|
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*.repo
|
||||||
|
|
||||||
|
# Обновляем систему
|
||||||
|
RUN yum update -y && yum upgrade -y
|
||||||
|
|
||||||
|
# Устанавливаем systemd и необходимые пакеты
|
||||||
|
RUN yum install -y \
|
||||||
|
systemd \
|
||||||
|
systemd-sysv \
|
||||||
|
dbus \
|
||||||
|
curl \
|
||||||
|
wget \
|
||||||
|
nano \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
sudo \
|
||||||
|
&& yum clean all
|
||||||
|
|
||||||
|
# Устанавливаем 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
|
||||||
|
# RUN curl -fsSL https://get.docker.com | sh
|
||||||
|
|
||||||
|
# Устанавливаем 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"]
|
||||||
50
dockerfiles/centos8/Dockerfile
Normal file
50
dockerfiles/centos8/Dockerfile
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
# CentOS 8 с systemd
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
FROM quay.io/centos/centos:8
|
||||||
|
|
||||||
|
# Настраиваем vault репозитории для CentOS 8 (так как основные репозитории больше не поддерживаются)
|
||||||
|
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*.repo && \
|
||||||
|
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*.repo
|
||||||
|
|
||||||
|
# Обновляем систему
|
||||||
|
RUN dnf update -y && dnf upgrade -y
|
||||||
|
|
||||||
|
# Устанавливаем systemd и необходимые пакеты
|
||||||
|
RUN dnf install -y --allowerasing \
|
||||||
|
systemd \
|
||||||
|
systemd-sysv \
|
||||||
|
dbus \
|
||||||
|
curl \
|
||||||
|
wget \
|
||||||
|
nano \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
sudo \
|
||||||
|
&& dnf clean all
|
||||||
|
|
||||||
|
# Устанавливаем 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
|
||||||
|
# RUN curl -fsSL https://get.docker.com | sh
|
||||||
|
|
||||||
|
# Устанавливаем 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"]
|
||||||
46
dockerfiles/centos9/Dockerfile
Normal file
46
dockerfiles/centos9/Dockerfile
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
# CentOS с systemd
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
FROM quay.io/centos/centos:stream9
|
||||||
|
|
||||||
|
# Обновляем систему
|
||||||
|
RUN dnf update -y && dnf upgrade -y
|
||||||
|
|
||||||
|
# Устанавливаем systemd и необходимые пакеты
|
||||||
|
RUN dnf install -y --allowerasing \
|
||||||
|
systemd \
|
||||||
|
systemd-sysv \
|
||||||
|
dbus \
|
||||||
|
curl \
|
||||||
|
wget \
|
||||||
|
nano \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
sudo \
|
||||||
|
&& dnf clean all
|
||||||
|
|
||||||
|
# Устанавливаем 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
|
||||||
|
# RUN curl -fsSL https://get.docker.com | sh
|
||||||
|
|
||||||
|
# Устанавливаем 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"]
|
||||||
62
dockerfiles/debian10/Dockerfile
Normal file
62
dockerfiles/debian10/Dockerfile
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
# Debian 10 Buster с systemd
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
FROM debian:10
|
||||||
|
|
||||||
|
# Устанавливаем переменные окружения для автоматического ответа на запросы
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
ENV TZ=UTC
|
||||||
|
|
||||||
|
# Настраиваем archive репозитории для Debian 10 (так как основные репозитории больше не поддерживаются)
|
||||||
|
RUN sed -i 's|http://deb.debian.org/debian|http://archive.debian.org/debian|g' /etc/apt/sources.list && \
|
||||||
|
sed -i 's|http://security.debian.org/debian-security|http://archive.debian.org/debian-security|g' /etc/apt/sources.list && \
|
||||||
|
echo "deb http://archive.debian.org/debian buster main" > /etc/apt/sources.list && \
|
||||||
|
echo "deb http://archive.debian.org/debian-security buster/updates main" >> /etc/apt/sources.list
|
||||||
|
|
||||||
|
# Обновляем систему
|
||||||
|
RUN apt-get update && apt-get dist-upgrade -y
|
||||||
|
|
||||||
|
# Устанавливаем systemd и необходимые пакеты
|
||||||
|
RUN apt-get install -y \
|
||||||
|
systemd \
|
||||||
|
systemd-sysv \
|
||||||
|
dbus \
|
||||||
|
curl \
|
||||||
|
wget \
|
||||||
|
nano \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
sudo \
|
||||||
|
&& apt-get clean
|
||||||
|
|
||||||
|
# Устанавливаем Docker вручную для Debian
|
||||||
|
# RUN 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=$(dpkg --print-architecture) 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
|
||||||
|
|
||||||
|
# Настраиваем 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"]
|
||||||
56
dockerfiles/debian11/Dockerfile
Normal file
56
dockerfiles/debian11/Dockerfile
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
# Debian 11 Bullseye с systemd
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
FROM debian:11
|
||||||
|
|
||||||
|
# Устанавливаем переменные окружения для автоматического ответа на запросы
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
ENV TZ=UTC
|
||||||
|
|
||||||
|
# Обновляем систему
|
||||||
|
RUN apt-get update && apt-get dist-upgrade -y
|
||||||
|
|
||||||
|
# Устанавливаем systemd и необходимые пакеты
|
||||||
|
RUN apt-get install -y \
|
||||||
|
systemd \
|
||||||
|
systemd-sysv \
|
||||||
|
dbus \
|
||||||
|
curl \
|
||||||
|
wget \
|
||||||
|
nano \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
sudo \
|
||||||
|
&& apt-get clean
|
||||||
|
|
||||||
|
# Устанавливаем Docker вручную для Debian
|
||||||
|
# RUN 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=$(dpkg --print-architecture) 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
|
||||||
|
|
||||||
|
# Настраиваем 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"]
|
||||||
56
dockerfiles/debian12/Dockerfile
Normal file
56
dockerfiles/debian12/Dockerfile
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
# Debian 12 Bookworm с systemd
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
FROM debian:bookworm
|
||||||
|
|
||||||
|
# Устанавливаем переменные окружения для автоматического ответа на запросы
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
ENV TZ=UTC
|
||||||
|
|
||||||
|
# Обновляем систему
|
||||||
|
RUN apt-get update && apt-get dist-upgrade -y
|
||||||
|
|
||||||
|
# Устанавливаем systemd и необходимые пакеты
|
||||||
|
RUN apt-get install -y \
|
||||||
|
systemd \
|
||||||
|
systemd-sysv \
|
||||||
|
dbus \
|
||||||
|
curl \
|
||||||
|
wget \
|
||||||
|
nano \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
sudo \
|
||||||
|
&& apt-get clean
|
||||||
|
|
||||||
|
# Устанавливаем Docker вручную для Debian
|
||||||
|
# RUN 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=$(dpkg --print-architecture) 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
|
||||||
|
|
||||||
|
# Настраиваем 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"]
|
||||||
62
dockerfiles/debian9/Dockerfile
Normal file
62
dockerfiles/debian9/Dockerfile
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
# Debian 9 Stretch с systemd
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
FROM debian:9
|
||||||
|
|
||||||
|
# Устанавливаем переменные окружения для автоматического ответа на запросы
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
ENV TZ=UTC
|
||||||
|
|
||||||
|
# Настраиваем archive репозитории для Debian 9 (так как основные репозитории больше не поддерживаются)
|
||||||
|
RUN sed -i 's|http://deb.debian.org/debian|http://archive.debian.org/debian|g' /etc/apt/sources.list && \
|
||||||
|
sed -i 's|http://security.debian.org/debian-security|http://archive.debian.org/debian-security|g' /etc/apt/sources.list && \
|
||||||
|
echo "deb http://archive.debian.org/debian stretch main" > /etc/apt/sources.list && \
|
||||||
|
echo "deb http://archive.debian.org/debian-security stretch/updates main" >> /etc/apt/sources.list
|
||||||
|
|
||||||
|
# Обновляем систему
|
||||||
|
RUN apt-get update && apt-get dist-upgrade -y
|
||||||
|
|
||||||
|
# Устанавливаем systemd и необходимые пакеты
|
||||||
|
RUN apt-get install -y \
|
||||||
|
systemd \
|
||||||
|
systemd-sysv \
|
||||||
|
dbus \
|
||||||
|
curl \
|
||||||
|
wget \
|
||||||
|
nano \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
sudo \
|
||||||
|
&& apt-get clean
|
||||||
|
|
||||||
|
# Устанавливаем Docker вручную для Debian
|
||||||
|
# RUN 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=$(dpkg --print-architecture) 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
|
||||||
|
|
||||||
|
# Настраиваем 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"]
|
||||||
54
dockerfiles/redos/Dockerfile
Normal file
54
dockerfiles/redos/Dockerfile
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
# RED OS с systemd
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
# https://registry.red-soft.ru/ubi7/ubi/tags
|
||||||
|
# docker search registry.red-soft.ru/ubi7/ubi
|
||||||
|
# ВАЖНО: Базовый образ поддерживает только linux/amd64
|
||||||
|
# Для сборки используйте: docker buildx build --platform linux/amd64
|
||||||
|
|
||||||
|
FROM registry.red-soft.ru/ubi7/ubi
|
||||||
|
|
||||||
|
# Обновляем систему
|
||||||
|
RUN dnf update -y && dnf upgrade -y
|
||||||
|
|
||||||
|
# Устанавливаем systemd и необходимые пакеты
|
||||||
|
RUN dnf install -y \
|
||||||
|
systemd \
|
||||||
|
systemd-sysv \
|
||||||
|
dbus \
|
||||||
|
curl \
|
||||||
|
wget \
|
||||||
|
nano \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
sudo \
|
||||||
|
&& 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 вручную для RED OS
|
||||||
|
# RUN 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 \
|
||||||
|
# && 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
|
||||||
|
|
||||||
|
# Настраиваем 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"]
|
||||||
49
dockerfiles/rhel/Dockerfile
Normal file
49
dockerfiles/rhel/Dockerfile
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
# RHEL с systemd
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
FROM registry.access.redhat.com/ubi8/ubi
|
||||||
|
|
||||||
|
# Обновляем систему
|
||||||
|
RUN dnf update -y && dnf upgrade -y
|
||||||
|
|
||||||
|
# Устанавливаем systemd и необходимые пакеты
|
||||||
|
RUN dnf install -y \
|
||||||
|
systemd \
|
||||||
|
systemd-sysv \
|
||||||
|
dbus \
|
||||||
|
curl \
|
||||||
|
wget \
|
||||||
|
nano \
|
||||||
|
python39 \
|
||||||
|
python39-pip \
|
||||||
|
sudo \
|
||||||
|
&& dnf clean all
|
||||||
|
|
||||||
|
# Создаем symlink для python3 -> python3.9
|
||||||
|
RUN ln -sf /usr/bin/python3.9 /usr/bin/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
|
||||||
|
# RUN curl -fsSL https://get.docker.com | sh
|
||||||
|
|
||||||
|
# Устанавливаем 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"]
|
||||||
54
dockerfiles/rocky/Dockerfile
Normal file
54
dockerfiles/rocky/Dockerfile
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
# Rocky Linux с systemd
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
FROM rockylinux:9
|
||||||
|
|
||||||
|
# Обновляем систему
|
||||||
|
RUN dnf update -y && dnf upgrade -y
|
||||||
|
|
||||||
|
# Устанавливаем systemd и необходимые пакеты
|
||||||
|
RUN dnf install -y --allowerasing \
|
||||||
|
systemd \
|
||||||
|
systemd-sysv \
|
||||||
|
dbus \
|
||||||
|
curl \
|
||||||
|
wget \
|
||||||
|
nano \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
python3-devel \
|
||||||
|
sudo \
|
||||||
|
&& dnf clean all
|
||||||
|
|
||||||
|
# Устанавливаем более новую версию Python через pip если нужно
|
||||||
|
RUN python3 -m pip install --upgrade pip
|
||||||
|
|
||||||
|
# Устанавливаем yq (автоматически определяем архитектуру)
|
||||||
|
# RUN ARCH=$(uname -m) && \
|
||||||
|
# if [ "$ARCH" = "x86_64" ]; then ARCH="amd64"; elif [ "$ARCH" = "aarch64" ]; then ARCH="arm64"; fi && \
|
||||||
|
# wget -qO /usr/local/bin/yq "https://github.com/mikefarah/yq/releases/latest/download/yq_linux_${ARCH}" && \
|
||||||
|
# chmod +x /usr/local/bin/yq
|
||||||
|
|
||||||
|
# Устанавливаем Docker
|
||||||
|
# RUN 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-buildx-plugin docker-compose-plugin
|
||||||
|
|
||||||
|
# Устанавливаем 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"]
|
||||||
56
dockerfiles/ubuntu20/Dockerfile
Normal file
56
dockerfiles/ubuntu20/Dockerfile
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
# Ubuntu 20.04 с systemd
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
FROM ubuntu:20.04
|
||||||
|
|
||||||
|
# Устанавливаем переменные окружения для автоматического ответа на запросы
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
ENV TZ=UTC
|
||||||
|
|
||||||
|
# Обновляем систему
|
||||||
|
RUN apt-get update && apt-get dist-upgrade -y
|
||||||
|
|
||||||
|
# Устанавливаем systemd и необходимые пакеты
|
||||||
|
RUN apt-get install -y \
|
||||||
|
systemd \
|
||||||
|
systemd-sysv \
|
||||||
|
dbus \
|
||||||
|
curl \
|
||||||
|
wget \
|
||||||
|
nano \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
sudo \
|
||||||
|
&& apt-get clean
|
||||||
|
|
||||||
|
# Устанавливаем Docker вручную для Ubuntu
|
||||||
|
# RUN 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/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg \
|
||||||
|
# && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu jammy 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
|
||||||
|
|
||||||
|
# Настраиваем 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"]
|
||||||
56
dockerfiles/ubuntu22/Dockerfile
Normal file
56
dockerfiles/ubuntu22/Dockerfile
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
# Ubuntu 22.04 с systemd
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
FROM ubuntu:22.04
|
||||||
|
|
||||||
|
# Устанавливаем переменные окружения для автоматического ответа на запросы
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
ENV TZ=UTC
|
||||||
|
|
||||||
|
# Обновляем систему
|
||||||
|
RUN apt-get update && apt-get dist-upgrade -y
|
||||||
|
|
||||||
|
# Устанавливаем systemd и необходимые пакеты
|
||||||
|
RUN apt-get install -y \
|
||||||
|
systemd \
|
||||||
|
systemd-sysv \
|
||||||
|
dbus \
|
||||||
|
curl \
|
||||||
|
wget \
|
||||||
|
nano \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
sudo \
|
||||||
|
&& apt-get clean
|
||||||
|
|
||||||
|
# Устанавливаем Docker вручную для Ubuntu
|
||||||
|
# RUN 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/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg \
|
||||||
|
# && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu jammy 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
|
||||||
|
|
||||||
|
# Настраиваем 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"]
|
||||||
56
dockerfiles/ubuntu24/Dockerfile
Normal file
56
dockerfiles/ubuntu24/Dockerfile
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
# Ubuntu 24.04 с systemd
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
FROM ubuntu:24.04
|
||||||
|
|
||||||
|
# Устанавливаем переменные окружения для автоматического ответа на запросы
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
ENV TZ=UTC
|
||||||
|
|
||||||
|
# Обновляем систему
|
||||||
|
RUN apt-get update && apt-get dist-upgrade -y
|
||||||
|
|
||||||
|
# Устанавливаем systemd и необходимые пакеты
|
||||||
|
RUN apt-get install -y \
|
||||||
|
systemd \
|
||||||
|
systemd-sysv \
|
||||||
|
dbus \
|
||||||
|
curl \
|
||||||
|
wget \
|
||||||
|
nano \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
sudo \
|
||||||
|
&& apt-get clean
|
||||||
|
|
||||||
|
# Устанавливаем Docker вручную для Ubuntu
|
||||||
|
# RUN 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/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg \
|
||||||
|
# && echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu jammy 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
|
||||||
|
|
||||||
|
# Настраиваем 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"]
|
||||||
169
docs/all-images-preset.md
Normal file
169
docs/all-images-preset.md
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
# Пресет all-images - Тестирование всех образов
|
||||||
|
|
||||||
|
## Описание
|
||||||
|
|
||||||
|
Пресет `all-images` предназначен для комплексного тестирования Ansible ролей на всех доступных операционных системах проекта. Это самый полный пресет, который включает все 16 образов:
|
||||||
|
|
||||||
|
### Включенные образы
|
||||||
|
|
||||||
|
#### Debian-based системы:
|
||||||
|
- **Ubuntu 20.04** (ubuntu20-test) - порт 8080
|
||||||
|
- **Ubuntu 22.04** (ubuntu22-test) - порт 8081
|
||||||
|
- **Ubuntu 24.04** (ubuntu24-test) - порт 8082
|
||||||
|
- **Debian 9** (debian9-test) - порт 8083
|
||||||
|
- **Debian 10** (debian10-test) - порт 8084
|
||||||
|
- **Debian 11** (debian11-test) - порт 8085
|
||||||
|
- **Debian 12** (debian12-test) - порт 8086
|
||||||
|
- **Alt Linux** (alt-test) - порт 8087
|
||||||
|
- **Astra Linux** (astra-test) - порт 8088
|
||||||
|
|
||||||
|
#### RHEL-based системы:
|
||||||
|
- **CentOS 7** (centos7-test) - порт 8090
|
||||||
|
- **CentOS 8** (centos8-test) - порт 8091
|
||||||
|
- **CentOS 9** (centos9-test) - порт 8092
|
||||||
|
- **RHEL** (rhel-test) - порт 8085
|
||||||
|
- **AlmaLinux** (alma-test) - порт 8086
|
||||||
|
- **Rocky Linux** (rocky-test) - порт 8087
|
||||||
|
- **RedOS** (redos-test) - порт 8088
|
||||||
|
|
||||||
|
## Использование
|
||||||
|
|
||||||
|
### Запуск тестирования всех образов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Тестирование всех образов
|
||||||
|
make role test all-images
|
||||||
|
```
|
||||||
|
|
||||||
|
### Предварительные требования
|
||||||
|
|
||||||
|
1. **Собранные образы** - все образы должны быть собраны:
|
||||||
|
```bash
|
||||||
|
make docker build
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Достаточно ресурсов** - тест запускает 16 контейнеров одновременно, требуется:
|
||||||
|
- Минимум 16GB RAM
|
||||||
|
- Минимум 8 CPU cores
|
||||||
|
- Достаточно места на диске
|
||||||
|
|
||||||
|
### Особенности
|
||||||
|
|
||||||
|
#### Порты
|
||||||
|
Каждый контейнер использует уникальный порт для доступа:
|
||||||
|
- Ubuntu 20.04: `localhost:8080`
|
||||||
|
- Ubuntu 22.04: `localhost:8081`
|
||||||
|
- Ubuntu 24.04: `localhost:8082`
|
||||||
|
- Debian 9: `localhost:8083`
|
||||||
|
- Debian 10: `localhost:8084`
|
||||||
|
- Debian 11: `localhost:8085`
|
||||||
|
- Debian 12: `localhost:8086`
|
||||||
|
- Alt Linux: `localhost:8087`
|
||||||
|
- Astra Linux: `localhost:8088`
|
||||||
|
- CentOS 7: `localhost:8090`
|
||||||
|
- CentOS 8: `localhost:8091`
|
||||||
|
- CentOS 9: `localhost:8092`
|
||||||
|
- RHEL: `localhost:8085`
|
||||||
|
- AlmaLinux: `localhost:8086`
|
||||||
|
- Rocky Linux: `localhost:8087`
|
||||||
|
- RedOS: `localhost:8088`
|
||||||
|
|
||||||
|
#### Переменные окружения
|
||||||
|
Каждый контейнер получает переменные:
|
||||||
|
- `TEST_OS` - название ОС
|
||||||
|
- `TEST_FAMILY` - семейство ОС (Debian/RedHat/Altlinux/Astra Linux)
|
||||||
|
|
||||||
|
#### Специальные настройки
|
||||||
|
- **Astra Linux**: автоматическое отключение Parsec
|
||||||
|
- **Все образы**: предустановленный sudo с настройкой sudoers
|
||||||
|
- **Systemd**: полная поддержка systemd в контейнерах
|
||||||
|
|
||||||
|
## Производительность
|
||||||
|
|
||||||
|
### Время выполнения
|
||||||
|
- **Создание контейнеров**: ~2-3 минуты
|
||||||
|
- **Тестирование ролей**: зависит от сложности ролей
|
||||||
|
- **Очистка**: ~30 секунд
|
||||||
|
|
||||||
|
### Ресурсы
|
||||||
|
- **RAM**: 16-32GB (рекомендуется)
|
||||||
|
- **CPU**: 8-16 cores
|
||||||
|
- **Диск**: 20-40GB свободного места
|
||||||
|
|
||||||
|
## Отладка
|
||||||
|
|
||||||
|
### Проверка статуса контейнеров
|
||||||
|
```bash
|
||||||
|
# Список запущенных контейнеров
|
||||||
|
docker ps --filter "network=labnet"
|
||||||
|
|
||||||
|
# Логи конкретного контейнера
|
||||||
|
docker logs ubuntu-test
|
||||||
|
docker logs astra-test
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проблемы и решения
|
||||||
|
|
||||||
|
#### Контейнеры не запускаются
|
||||||
|
1. Проверьте, что образы собраны:
|
||||||
|
```bash
|
||||||
|
docker images | grep inecs/ansible-lab
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Пересоберите образы:
|
||||||
|
```bash
|
||||||
|
make docker rebuild
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Astra Linux перезапускается
|
||||||
|
- Проблема решена в Dockerfile (отключение Parsec)
|
||||||
|
- Если проблема остается, проверьте логи:
|
||||||
|
```bash
|
||||||
|
docker logs astra-test
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Нехватка ресурсов
|
||||||
|
- Уменьшите количество контейнеров в пресете
|
||||||
|
- Используйте пресет `minimal` для быстрого тестирования
|
||||||
|
|
||||||
|
## Альтернативные пресеты
|
||||||
|
|
||||||
|
Если `all-images` слишком ресурсоемкий, используйте:
|
||||||
|
|
||||||
|
- `minimal` - 1 контейнер (Debian)
|
||||||
|
- `default` - 2 контейнера (Debian + RHEL)
|
||||||
|
- `multi-os` - 12 контейнеров (разные ОС)
|
||||||
|
|
||||||
|
## Мониторинг
|
||||||
|
|
||||||
|
### Логи тестирования
|
||||||
|
```bash
|
||||||
|
# Просмотр логов ansible-controller
|
||||||
|
docker logs ansible-controller
|
||||||
|
|
||||||
|
# Логи конкретного playbook
|
||||||
|
tail -f /tmp/molecule_workspace/logs/ansible.log
|
||||||
|
```
|
||||||
|
|
||||||
|
### Метрики производительности
|
||||||
|
- Время выполнения каждого этапа
|
||||||
|
- Использование ресурсов
|
||||||
|
- Количество успешных/неудачных тестов
|
||||||
|
|
||||||
|
## Интеграция с CI/CD
|
||||||
|
|
||||||
|
Пресет `all-images` идеально подходит для:
|
||||||
|
- **GitHub Actions** - полное тестирование на всех ОС
|
||||||
|
- **GitLab CI** - комплексная проверка совместимости
|
||||||
|
- **Jenkins** - автоматическое тестирование релизов
|
||||||
|
|
||||||
|
### Пример для GitHub Actions
|
||||||
|
```yaml
|
||||||
|
- name: Test all images
|
||||||
|
run: make role test all-images
|
||||||
|
timeout-minutes: 30
|
||||||
|
```
|
||||||
|
|
||||||
|
## Заключение
|
||||||
|
|
||||||
|
Пресет `all-images` обеспечивает максимальное покрытие тестирования, гарантируя совместимость Ansible ролей со всеми поддерживаемыми операционными системами. Это критически важно для production-окружений с разнородной инфраструктурой.
|
||||||
98
docs/buildx-fixes.md
Normal file
98
docs/buildx-fixes.md
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
# Исправления проблем с Docker Buildx
|
||||||
|
|
||||||
|
## Проблема
|
||||||
|
Команда `docker buildx ls` часто зависает в CI/CD окружениях из-за:
|
||||||
|
- Мертвых Docker контекстов (tcp://...)
|
||||||
|
- Проблем с доступом к registry
|
||||||
|
- Недостаточных привилегий
|
||||||
|
- Старых/битых builder'ов
|
||||||
|
|
||||||
|
## Решение
|
||||||
|
|
||||||
|
### 1. Замена `buildx ls` на `buildx inspect`
|
||||||
|
**Было:**
|
||||||
|
```bash
|
||||||
|
if ! docker buildx ls | grep -q $(DOCKER_BUILDX_BUILDER); then
|
||||||
|
```
|
||||||
|
|
||||||
|
**Стало:**
|
||||||
|
```bash
|
||||||
|
if docker buildx inspect $(DOCKER_BUILDX_BUILDER) >/dev/null 2>&1; then
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Новые надежные функции
|
||||||
|
|
||||||
|
#### `docker-check-builder`
|
||||||
|
- Проверяет существование builder'а через `inspect`
|
||||||
|
- Не зависает на мертвых контекстах
|
||||||
|
- Возвращает четкий статус
|
||||||
|
|
||||||
|
#### `docker-create-builder`
|
||||||
|
- Предварительная загрузка образа `moby/buildkit:buildx-stable-1`
|
||||||
|
- Очистка старых builder'ов
|
||||||
|
- Явное указание образа buildkit
|
||||||
|
- Проверка готовности через `inspect --bootstrap`
|
||||||
|
|
||||||
|
#### `docker-diagnose-buildx`
|
||||||
|
- Полная диагностика проблем с buildx
|
||||||
|
- Проверка версий Docker и Buildx
|
||||||
|
- Поиск мертвых контекстов
|
||||||
|
- Проверка доступа к registry
|
||||||
|
- Проверка Docker socket
|
||||||
|
- Рекомендации по устранению
|
||||||
|
|
||||||
|
#### `docker-reset-builder`
|
||||||
|
- Полная очистка и пересоздание builder'а
|
||||||
|
- Удаление buildkit контейнеров
|
||||||
|
- Создание нового builder'а с предварительной загрузкой
|
||||||
|
|
||||||
|
### 3. Обновленные команды
|
||||||
|
|
||||||
|
#### `make docker setup-builder`
|
||||||
|
- Использует `docker-check-builder` вместо `buildx ls`
|
||||||
|
- Безопасное создание builder'а
|
||||||
|
- Предварительная загрузка образа
|
||||||
|
|
||||||
|
#### `make docker clean-builder`
|
||||||
|
- Теперь использует `docker-reset-builder`
|
||||||
|
- Полная очистка buildkit контейнеров
|
||||||
|
|
||||||
|
#### Новые команды:
|
||||||
|
- `make docker diagnose` - диагностика проблем
|
||||||
|
- `make docker reset-builder` - сброс builder'а
|
||||||
|
|
||||||
|
### 4. Преимущества
|
||||||
|
|
||||||
|
✅ **Нет зависаний** - не использует `buildx ls`
|
||||||
|
✅ **Быстрая диагностика** - четкие сообщения об ошибках
|
||||||
|
✅ **Предварительная загрузка** - избегает проблем с pull в bootstrap
|
||||||
|
✅ **Полная очистка** - удаляет все связанные контейнеры
|
||||||
|
✅ **Подробные логи** - понятные сообщения о процессе
|
||||||
|
|
||||||
|
### 5. Использование
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Диагностика проблем
|
||||||
|
make docker diagnose
|
||||||
|
|
||||||
|
# Сброс builder'а при проблемах
|
||||||
|
make docker reset-builder
|
||||||
|
|
||||||
|
# Обычная настройка (теперь безопасная)
|
||||||
|
make docker setup-builder
|
||||||
|
|
||||||
|
# Сборка образов
|
||||||
|
make docker build
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. Рекомендации для CI/CD
|
||||||
|
|
||||||
|
1. **Используйте `docker-diagnose-buildx`** при проблемах
|
||||||
|
2. **Настройте прокси** для доступа к registry
|
||||||
|
3. **Очищайте мертвые контексты** регулярно
|
||||||
|
4. **Используйте `docker-reset-builder`** при зависаниях
|
||||||
|
5. **Проверяйте права доступа** к Docker socket
|
||||||
|
|
||||||
|
## Автор
|
||||||
|
Сергей Антропов
|
||||||
|
Сайт: https://devops.org.ru
|
||||||
913
docs/cicd-setup.md
Normal file
913
docs/cicd-setup.md
Normal file
@@ -0,0 +1,913 @@
|
|||||||
|
# Настройка CI/CD для AnsibleLab
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
|
|
||||||
|
## 🚀 GitHub Actions
|
||||||
|
|
||||||
|
### Базовая конфигурация
|
||||||
|
|
||||||
|
**`.github/workflows/ansible-test.yml`:**
|
||||||
|
```yaml
|
||||||
|
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
|
||||||
|
```
|
||||||
|
|
||||||
|
### Продвинутая конфигурация
|
||||||
|
|
||||||
|
**`.github/workflows/ansible-advanced.yml`:**
|
||||||
|
```yaml
|
||||||
|
name: Advanced Ansible Testing
|
||||||
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
env:
|
||||||
|
ANSIBLE_FORCE_COLOR: 'true'
|
||||||
|
DOCKER_TLS_CERTDIR: ''
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
detect-roles:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
roles: ${{ steps.detect.outputs.roles }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Detect new roles
|
||||||
|
id: detect
|
||||||
|
run: |
|
||||||
|
echo "roles=$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tasks/main.yml||' | tr '\n' ' ')" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
update-playbooks:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: detect-roles
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Update playbooks
|
||||||
|
run: |
|
||||||
|
chmod +x scripts/update-playbooks.sh
|
||||||
|
./scripts/update-playbooks.sh
|
||||||
|
- name: Commit changes
|
||||||
|
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 diff --staged --quiet || git commit -m "Auto-update playbooks for new roles"
|
||||||
|
git push
|
||||||
|
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: update-playbooks
|
||||||
|
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: [update-playbooks, 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
|
||||||
|
|
||||||
|
notify:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [lint, test, deploy-check]
|
||||||
|
if: always()
|
||||||
|
steps:
|
||||||
|
- name: Notify on success
|
||||||
|
if: needs.lint.result == 'success' && needs.test.result == 'success'
|
||||||
|
run: |
|
||||||
|
echo "✅ All tests passed for new roles"
|
||||||
|
curl -X POST -H 'Content-type: application/json' \
|
||||||
|
--data '{"text":"✅ Ansible role tests passed for new roles"}' \
|
||||||
|
${{ secrets.SLACK_WEBHOOK_URL }}
|
||||||
|
- name: Notify on failure
|
||||||
|
if: needs.lint.result == 'failure' || needs.test.result == 'failure'
|
||||||
|
run: |
|
||||||
|
echo "❌ Tests failed for new roles"
|
||||||
|
curl -X POST -H 'Content-type: application/json' \
|
||||||
|
--data '{"text":"❌ Ansible role tests failed for new roles"}' \
|
||||||
|
${{ secrets.SLACK_WEBHOOK_URL }}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🏢 Azure DevOps
|
||||||
|
|
||||||
|
### Базовая конфигурация
|
||||||
|
|
||||||
|
**`azure-pipelines.yml`:**
|
||||||
|
```yaml
|
||||||
|
trigger:
|
||||||
|
- main
|
||||||
|
- develop
|
||||||
|
|
||||||
|
pool:
|
||||||
|
vmImage: 'ubuntu-latest'
|
||||||
|
|
||||||
|
variables:
|
||||||
|
ANSIBLE_FORCE_COLOR: 'true'
|
||||||
|
DOCKER_TLS_CERTDIR: ''
|
||||||
|
|
||||||
|
stages:
|
||||||
|
- stage: Lint
|
||||||
|
displayName: 'Lint Stage'
|
||||||
|
jobs:
|
||||||
|
- job: LintJob
|
||||||
|
displayName: 'Run Lint'
|
||||||
|
steps:
|
||||||
|
- task: UsePythonVersion@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: '3.11'
|
||||||
|
- script: |
|
||||||
|
pip install ansible ansible-lint
|
||||||
|
ansible-galaxy collection install -r requirements.yml
|
||||||
|
make role lint
|
||||||
|
displayName: 'Run Ansible Lint'
|
||||||
|
|
||||||
|
- stage: Test
|
||||||
|
displayName: 'Test Stage'
|
||||||
|
dependsOn: Lint
|
||||||
|
jobs:
|
||||||
|
- job: TestJob
|
||||||
|
displayName: 'Run Tests'
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
minimal:
|
||||||
|
preset: minimal
|
||||||
|
default:
|
||||||
|
preset: default
|
||||||
|
performance:
|
||||||
|
preset: performance
|
||||||
|
steps:
|
||||||
|
- task: UsePythonVersion@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: '3.11'
|
||||||
|
- script: |
|
||||||
|
pip install ansible ansible-lint
|
||||||
|
ansible-galaxy collection install -r requirements.yml
|
||||||
|
make role test $(preset)
|
||||||
|
displayName: 'Run Molecule Tests'
|
||||||
|
env:
|
||||||
|
PRESET: $(preset)
|
||||||
|
|
||||||
|
- stage: Deploy
|
||||||
|
displayName: 'Deploy Stage'
|
||||||
|
dependsOn: Test
|
||||||
|
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
|
||||||
|
jobs:
|
||||||
|
- job: DeployJob
|
||||||
|
displayName: 'Check Deployment'
|
||||||
|
steps:
|
||||||
|
- script: make role deploy
|
||||||
|
displayName: 'Check Deployment'
|
||||||
|
env:
|
||||||
|
ANSIBLE_HOST_KEY_CHECKING: false
|
||||||
|
```
|
||||||
|
|
||||||
|
### Продвинутая конфигурация
|
||||||
|
|
||||||
|
**`azure-pipelines-advanced.yml`:**
|
||||||
|
```yaml
|
||||||
|
trigger:
|
||||||
|
- main
|
||||||
|
- develop
|
||||||
|
|
||||||
|
pool:
|
||||||
|
vmImage: 'ubuntu-latest'
|
||||||
|
|
||||||
|
variables:
|
||||||
|
ANSIBLE_FORCE_COLOR: 'true'
|
||||||
|
DOCKER_TLS_CERTDIR: ''
|
||||||
|
|
||||||
|
stages:
|
||||||
|
- stage: Detect
|
||||||
|
displayName: 'Detect Roles'
|
||||||
|
jobs:
|
||||||
|
- job: DetectJob
|
||||||
|
displayName: 'Detect New Roles'
|
||||||
|
steps:
|
||||||
|
- script: |
|
||||||
|
echo "##vso[task.setvariable variable=roles;isOutput=true]$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tasks/main.yml||' | tr '\n' ' ')"
|
||||||
|
displayName: 'Detect Roles'
|
||||||
|
name: detect
|
||||||
|
|
||||||
|
- stage: Update
|
||||||
|
displayName: 'Update Playbooks'
|
||||||
|
dependsOn: Detect
|
||||||
|
jobs:
|
||||||
|
- job: UpdateJob
|
||||||
|
displayName: 'Update Playbooks'
|
||||||
|
steps:
|
||||||
|
- script: |
|
||||||
|
chmod +x scripts/update-playbooks.sh
|
||||||
|
./scripts/update-playbooks.sh
|
||||||
|
displayName: 'Update Playbooks'
|
||||||
|
- 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 diff --staged --quiet || git commit -m "Auto-update playbooks for new roles"
|
||||||
|
git push
|
||||||
|
displayName: 'Commit Changes'
|
||||||
|
|
||||||
|
- stage: Lint
|
||||||
|
displayName: 'Lint Stage'
|
||||||
|
dependsOn: Update
|
||||||
|
jobs:
|
||||||
|
- job: LintJob
|
||||||
|
displayName: 'Run Lint'
|
||||||
|
steps:
|
||||||
|
- task: UsePythonVersion@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: '3.11'
|
||||||
|
- script: |
|
||||||
|
pip install ansible ansible-lint
|
||||||
|
ansible-galaxy collection install -r requirements.yml
|
||||||
|
make role lint
|
||||||
|
displayName: 'Run Ansible Lint'
|
||||||
|
|
||||||
|
- stage: Test
|
||||||
|
displayName: 'Test Stage'
|
||||||
|
dependsOn: [Update, Lint]
|
||||||
|
jobs:
|
||||||
|
- job: TestJob
|
||||||
|
displayName: 'Run Tests'
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
minimal:
|
||||||
|
preset: minimal
|
||||||
|
default:
|
||||||
|
preset: default
|
||||||
|
performance:
|
||||||
|
preset: performance
|
||||||
|
steps:
|
||||||
|
- task: UsePythonVersion@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: '3.11'
|
||||||
|
- script: |
|
||||||
|
pip install ansible ansible-lint
|
||||||
|
ansible-galaxy collection install -r requirements.yml
|
||||||
|
make role test $(preset)
|
||||||
|
displayName: 'Run Molecule Tests'
|
||||||
|
env:
|
||||||
|
PRESET: $(preset)
|
||||||
|
|
||||||
|
- stage: Deploy
|
||||||
|
displayName: 'Deploy Stage'
|
||||||
|
dependsOn: [Lint, Test]
|
||||||
|
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
|
||||||
|
jobs:
|
||||||
|
- job: DeployJob
|
||||||
|
displayName: 'Check Deployment'
|
||||||
|
steps:
|
||||||
|
- script: make role deploy
|
||||||
|
displayName: 'Check Deployment'
|
||||||
|
env:
|
||||||
|
ANSIBLE_HOST_KEY_CHECKING: false
|
||||||
|
|
||||||
|
- stage: Notify
|
||||||
|
displayName: 'Notification Stage'
|
||||||
|
dependsOn: [Lint, Test, Deploy]
|
||||||
|
condition: always()
|
||||||
|
jobs:
|
||||||
|
- job: NotifyJob
|
||||||
|
displayName: 'Send Notifications'
|
||||||
|
steps:
|
||||||
|
- script: |
|
||||||
|
if [ "$(Lint.result)" == "Succeeded" ] && [ "$(Test.result)" == "Succeeded" ]; then
|
||||||
|
echo "✅ All tests passed for new roles"
|
||||||
|
curl -X POST -H 'Content-type: application/json' \
|
||||||
|
--data '{"text":"✅ Ansible role tests passed for new roles"}' \
|
||||||
|
$(SLACK_WEBHOOK_URL)
|
||||||
|
else
|
||||||
|
echo "❌ Tests failed for new roles"
|
||||||
|
curl -X POST -H 'Content-type: application/json' \
|
||||||
|
--data '{"text":"❌ Ansible role tests failed for new roles"}' \
|
||||||
|
$(SLACK_WEBHOOK_URL)
|
||||||
|
fi
|
||||||
|
displayName: 'Send Notifications'
|
||||||
|
env:
|
||||||
|
SLACK_WEBHOOK_URL: $(SLACK_WEBHOOK_URL)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🏭 Jenkins
|
||||||
|
|
||||||
|
### Базовая конфигурация
|
||||||
|
|
||||||
|
**`Jenkinsfile`:**
|
||||||
|
```groovy
|
||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
|
||||||
|
environment {
|
||||||
|
ANSIBLE_FORCE_COLOR = 'true'
|
||||||
|
DOCKER_TLS_CERTDIR = ''
|
||||||
|
}
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage('Checkout') {
|
||||||
|
steps {
|
||||||
|
checkout scm
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Install Dependencies') {
|
||||||
|
steps {
|
||||||
|
sh '''
|
||||||
|
pip install --upgrade pip
|
||||||
|
pip install ansible ansible-lint
|
||||||
|
ansible-galaxy collection install -r requirements.yml
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Lint') {
|
||||||
|
steps {
|
||||||
|
sh 'make role lint'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Test') {
|
||||||
|
parallel {
|
||||||
|
stage('Test Minimal') {
|
||||||
|
steps {
|
||||||
|
sh 'make role test minimal'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Test Default') {
|
||||||
|
steps {
|
||||||
|
sh 'make role test default'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Test Performance') {
|
||||||
|
steps {
|
||||||
|
sh 'make role test performance'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Deploy Check') {
|
||||||
|
when {
|
||||||
|
branch 'main'
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
sh 'make role deploy'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
archiveArtifacts artifacts: 'molecule/**/.molecule/**/*', allowEmptyArchive: true
|
||||||
|
}
|
||||||
|
|
||||||
|
success {
|
||||||
|
echo 'Pipeline completed successfully!'
|
||||||
|
}
|
||||||
|
|
||||||
|
failure {
|
||||||
|
echo 'Pipeline failed!'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Продвинутая конфигурация
|
||||||
|
|
||||||
|
**`Jenkinsfile-advanced`:**
|
||||||
|
```groovy
|
||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
|
||||||
|
environment {
|
||||||
|
ANSIBLE_FORCE_COLOR = 'true'
|
||||||
|
DOCKER_TLS_CERTDIR = ''
|
||||||
|
}
|
||||||
|
|
||||||
|
stages {
|
||||||
|
stage('Checkout') {
|
||||||
|
steps {
|
||||||
|
checkout scm
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Detect Roles') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
env.ROLES = sh(
|
||||||
|
script: 'find roles/ -name "main.yml" -path "*/tasks/*" | sed "s|roles/||; s|/tasks/main.yml||" | tr "\\n" " "',
|
||||||
|
returnStdout: true
|
||||||
|
).trim()
|
||||||
|
}
|
||||||
|
echo "Detected roles: ${env.ROLES}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Update Playbooks') {
|
||||||
|
steps {
|
||||||
|
sh '''
|
||||||
|
chmod +x scripts/update-playbooks.sh
|
||||||
|
./scripts/update-playbooks.sh
|
||||||
|
'''
|
||||||
|
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 diff --staged --quiet || git commit -m "Auto-update playbooks for new roles"
|
||||||
|
git push
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Install Dependencies') {
|
||||||
|
steps {
|
||||||
|
sh '''
|
||||||
|
pip install --upgrade pip
|
||||||
|
pip install ansible ansible-lint
|
||||||
|
ansible-galaxy collection install -r requirements.yml
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Lint') {
|
||||||
|
steps {
|
||||||
|
sh 'make role lint'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Test') {
|
||||||
|
parallel {
|
||||||
|
stage('Test Minimal') {
|
||||||
|
steps {
|
||||||
|
sh 'make role test minimal'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Test Default') {
|
||||||
|
steps {
|
||||||
|
sh 'make role test default'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Test Performance') {
|
||||||
|
steps {
|
||||||
|
sh 'make role test performance'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage('Deploy Check') {
|
||||||
|
when {
|
||||||
|
branch 'main'
|
||||||
|
}
|
||||||
|
steps {
|
||||||
|
sh 'make role deploy'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
archiveArtifacts artifacts: 'molecule/**/.molecule/**/*', allowEmptyArchive: true
|
||||||
|
}
|
||||||
|
|
||||||
|
success {
|
||||||
|
echo 'Pipeline completed successfully!'
|
||||||
|
script {
|
||||||
|
if (env.SLACK_WEBHOOK_URL) {
|
||||||
|
sh '''
|
||||||
|
curl -X POST -H 'Content-type: application/json' \
|
||||||
|
--data '{"text":"✅ Ansible role tests passed for new roles"}' \
|
||||||
|
${SLACK_WEBHOOK_URL}
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
failure {
|
||||||
|
echo 'Pipeline failed!'
|
||||||
|
script {
|
||||||
|
if (env.SLACK_WEBHOOK_URL) {
|
||||||
|
sh '''
|
||||||
|
curl -X POST -H 'Content-type: application/json' \
|
||||||
|
--data '{"text":"❌ Ansible role tests failed for new roles"}' \
|
||||||
|
${SLACK_WEBHOOK_URL}
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🦊 GitLab CI
|
||||||
|
|
||||||
|
### Базовая конфигурация
|
||||||
|
|
||||||
|
**`.gitlab-ci.yml`:**
|
||||||
|
```yaml
|
||||||
|
stages:
|
||||||
|
- lint
|
||||||
|
- test
|
||||||
|
- deploy
|
||||||
|
|
||||||
|
variables:
|
||||||
|
ANSIBLE_FORCE_COLOR: "true"
|
||||||
|
DOCKER_TLS_CERTDIR: ""
|
||||||
|
|
||||||
|
lint:
|
||||||
|
stage: lint
|
||||||
|
image: python:3.11
|
||||||
|
before_script:
|
||||||
|
- pip install ansible ansible-lint
|
||||||
|
- ansible-galaxy collection install -r requirements.yml
|
||||||
|
script:
|
||||||
|
- make role lint
|
||||||
|
|
||||||
|
test:
|
||||||
|
stage: test
|
||||||
|
image: docker:latest
|
||||||
|
services:
|
||||||
|
- docker:dind
|
||||||
|
variables:
|
||||||
|
DOCKER_TLS_CERTDIR: ""
|
||||||
|
before_script:
|
||||||
|
- apk add --no-cache make python3 py3-pip
|
||||||
|
- pip install ansible ansible-lint
|
||||||
|
- ansible-galaxy collection install -r requirements.yml
|
||||||
|
script:
|
||||||
|
- make role test $PRESET
|
||||||
|
parallel:
|
||||||
|
matrix:
|
||||||
|
- PRESET: [minimal, default, performance]
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
stage: deploy
|
||||||
|
image: python:3.11
|
||||||
|
only:
|
||||||
|
- main
|
||||||
|
before_script:
|
||||||
|
- pip install ansible ansible-lint
|
||||||
|
- ansible-galaxy collection install -r requirements.yml
|
||||||
|
script:
|
||||||
|
- make role deploy
|
||||||
|
variables:
|
||||||
|
ANSIBLE_HOST_KEY_CHECKING: "false"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Продвинутая конфигурация
|
||||||
|
|
||||||
|
**`.gitlab-ci-advanced.yml`:**
|
||||||
|
```yaml
|
||||||
|
stages:
|
||||||
|
- detect
|
||||||
|
- update
|
||||||
|
- lint
|
||||||
|
- test
|
||||||
|
- deploy
|
||||||
|
- notify
|
||||||
|
|
||||||
|
variables:
|
||||||
|
ANSIBLE_FORCE_COLOR: "true"
|
||||||
|
DOCKER_TLS_CERTDIR: ""
|
||||||
|
|
||||||
|
detect-roles:
|
||||||
|
stage: detect
|
||||||
|
image: alpine:latest
|
||||||
|
script:
|
||||||
|
- echo "ROLES=$(find roles/ -name 'main.yml' -path '*/tasks/*' | sed 's|roles/||; s|/tasks/main.yml||' | tr '\n' ' ')" >> build.env
|
||||||
|
artifacts:
|
||||||
|
reports:
|
||||||
|
dotenv: build.env
|
||||||
|
|
||||||
|
update-playbooks:
|
||||||
|
stage: update
|
||||||
|
image: alpine:latest
|
||||||
|
script:
|
||||||
|
- apk add --no-cache make bash
|
||||||
|
- chmod +x scripts/update-playbooks.sh
|
||||||
|
- ./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 diff --staged --quiet || git commit -m "Auto-update playbooks for new roles"
|
||||||
|
- git push
|
||||||
|
only:
|
||||||
|
- main
|
||||||
|
- develop
|
||||||
|
|
||||||
|
lint:
|
||||||
|
stage: lint
|
||||||
|
image: python:3.11
|
||||||
|
before_script:
|
||||||
|
- pip install ansible ansible-lint
|
||||||
|
- ansible-galaxy collection install -r requirements.yml
|
||||||
|
script:
|
||||||
|
- make role lint
|
||||||
|
|
||||||
|
test:
|
||||||
|
stage: test
|
||||||
|
image: docker:latest
|
||||||
|
services:
|
||||||
|
- docker:dind
|
||||||
|
variables:
|
||||||
|
DOCKER_TLS_CERTDIR: ""
|
||||||
|
before_script:
|
||||||
|
- apk add --no-cache make python3 py3-pip
|
||||||
|
- pip install ansible ansible-lint
|
||||||
|
- ansible-galaxy collection install -r requirements.yml
|
||||||
|
script:
|
||||||
|
- make role test $PRESET
|
||||||
|
parallel:
|
||||||
|
matrix:
|
||||||
|
- PRESET: [minimal, default, performance]
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
stage: deploy
|
||||||
|
image: python:3.11
|
||||||
|
only:
|
||||||
|
- main
|
||||||
|
before_script:
|
||||||
|
- pip install ansible ansible-lint
|
||||||
|
- ansible-galaxy collection install -r requirements.yml
|
||||||
|
script:
|
||||||
|
- make role deploy
|
||||||
|
variables:
|
||||||
|
ANSIBLE_HOST_KEY_CHECKING: "false"
|
||||||
|
|
||||||
|
notify:
|
||||||
|
stage: notify
|
||||||
|
image: alpine:latest
|
||||||
|
script:
|
||||||
|
- |
|
||||||
|
if [ "$CI_JOB_STATUS" == "success" ]; then
|
||||||
|
echo "✅ All tests passed for new roles"
|
||||||
|
curl -X POST -H 'Content-type: application/json' \
|
||||||
|
--data '{"text":"✅ Ansible role tests passed for new roles"}' \
|
||||||
|
${SLACK_WEBHOOK_URL}
|
||||||
|
else
|
||||||
|
echo "❌ Tests failed for new roles"
|
||||||
|
curl -X POST -H 'Content-type: application/json' \
|
||||||
|
--data '{"text":"❌ Ansible role tests failed for new roles"}' \
|
||||||
|
${SLACK_WEBHOOK_URL}
|
||||||
|
fi
|
||||||
|
when: always
|
||||||
|
variables:
|
||||||
|
SLACK_WEBHOOK_URL: $SLACK_WEBHOOK_URL
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔔 Настройка уведомлений
|
||||||
|
|
||||||
|
### Slack уведомления
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# .github/workflows/notifications.yml
|
||||||
|
name: Notifications
|
||||||
|
on: [workflow_run]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
notify:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: always()
|
||||||
|
steps:
|
||||||
|
- name: Notify Slack
|
||||||
|
uses: 8398a7/action-slack@v3
|
||||||
|
with:
|
||||||
|
status: ${{ job.status }}
|
||||||
|
channel: '#ansible'
|
||||||
|
webhook_url: ${{ secrets.SLACK_WEBHOOK_URL }}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Teams уведомления
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# .github/workflows/teams-notifications.yml
|
||||||
|
name: Teams Notifications
|
||||||
|
on: [workflow_run]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
notify:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: always()
|
||||||
|
steps:
|
||||||
|
- name: Notify Teams
|
||||||
|
uses: skitionek/notify-microsoft-teams@master
|
||||||
|
with:
|
||||||
|
webhook_url: ${{ secrets.TEAMS_WEBHOOK_URL }}
|
||||||
|
status: ${{ job.status }}
|
||||||
|
title: 'Ansible Role Tests'
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 Мониторинг CI/CD
|
||||||
|
|
||||||
|
### Метрики производительности
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# .github/workflows/metrics.yml
|
||||||
|
name: CI/CD Metrics
|
||||||
|
on: [workflow_run]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
metrics:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Collect Metrics
|
||||||
|
run: |
|
||||||
|
echo "Build time: $(date)"
|
||||||
|
echo "Commit: ${{ github.sha }}"
|
||||||
|
echo "Branch: ${{ github.ref }}"
|
||||||
|
echo "Actor: ${{ github.actor }}"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Отчеты о тестировании
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# .github/workflows/reports.yml
|
||||||
|
name: Test Reports
|
||||||
|
on: [workflow_run]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
reports:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Generate Report
|
||||||
|
run: |
|
||||||
|
echo "## Test Results" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "- Lint: ✅ Passed" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "- Test: ✅ Passed" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "- Deploy: ✅ Passed" >> $GITHUB_STEP_SUMMARY
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 Настройка секретов
|
||||||
|
|
||||||
|
### GitHub Secrets
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Настройка секретов в GitHub
|
||||||
|
gh secret set SLACK_WEBHOOK_URL --body "https://hooks.slack.com/services/..."
|
||||||
|
gh secret set TEAMS_WEBHOOK_URL --body "https://outlook.office.com/webhook/..."
|
||||||
|
```
|
||||||
|
|
||||||
|
### Azure DevOps Variables
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# azure-pipelines.yml
|
||||||
|
variables:
|
||||||
|
- group: ansible-secrets
|
||||||
|
- name: SLACK_WEBHOOK_URL
|
||||||
|
value: $(SLACK_WEBHOOK_URL)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Jenkins Credentials
|
||||||
|
|
||||||
|
```groovy
|
||||||
|
// Jenkinsfile
|
||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
environment {
|
||||||
|
SLACK_WEBHOOK_URL = credentials('slack-webhook-url')
|
||||||
|
}
|
||||||
|
// ... остальная конфигурация
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚀 Автоматизация
|
||||||
|
|
||||||
|
### Автоматическое создание скриптов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# scripts/setup-cicd.sh
|
||||||
|
# Автоматическая настройка CI/CD
|
||||||
|
|
||||||
|
echo "🔧 Настройка CI/CD для AnsibleTemplate..."
|
||||||
|
|
||||||
|
# Создание директории .github/workflows
|
||||||
|
mkdir -p .github/workflows
|
||||||
|
|
||||||
|
# Создание базового workflow
|
||||||
|
cat > .github/workflows/ansible-test.yml << 'EOF'
|
||||||
|
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
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Создание Azure DevOps pipeline
|
||||||
|
cat > azure-pipelines.yml << 'EOF'
|
||||||
|
trigger:
|
||||||
|
- main
|
||||||
|
pool:
|
||||||
|
vmImage: 'ubuntu-latest'
|
||||||
|
stages:
|
||||||
|
- stage: Test
|
||||||
|
jobs:
|
||||||
|
- job: TestJob
|
||||||
|
steps:
|
||||||
|
- script: make role test
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Создание Jenkinsfile
|
||||||
|
cat > Jenkinsfile << 'EOF'
|
||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
stages {
|
||||||
|
stage('Test') {
|
||||||
|
steps {
|
||||||
|
sh 'make role test'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Создание GitLab CI
|
||||||
|
cat > .gitlab-ci.yml << 'EOF'
|
||||||
|
stages:
|
||||||
|
- test
|
||||||
|
test:
|
||||||
|
stage: test
|
||||||
|
script:
|
||||||
|
- make role test
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "✅ CI/CD настроен"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
609
docs/creating-roles.md
Normal file
609
docs/creating-roles.md
Normal file
@@ -0,0 +1,609 @@
|
|||||||
|
# Создание и разработка ролей для AnsibleLab
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
|
|
||||||
|
## 🚀 Быстрый старт
|
||||||
|
|
||||||
|
### Интерактивное управление ролями
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Просмотр всех ролей
|
||||||
|
make role list
|
||||||
|
|
||||||
|
# Создание новой роли (интерактивно)
|
||||||
|
make role create
|
||||||
|
|
||||||
|
# Удаление роли (интерактивно)
|
||||||
|
make role delete
|
||||||
|
```
|
||||||
|
|
||||||
|
### Автоматическое обновление
|
||||||
|
|
||||||
|
При создании или удалении роли система автоматически:
|
||||||
|
- ✅ Обновляет `roles/deploy.yml`
|
||||||
|
- ✅ Создает полную структуру папок
|
||||||
|
- ✅ Генерирует README.md с документацией
|
||||||
|
- ✅ Настраивает метаданные роли
|
||||||
|
|
||||||
|
## 📁 Структура роли
|
||||||
|
|
||||||
|
### Стандартная структура
|
||||||
|
|
||||||
|
```
|
||||||
|
roles/my-role/
|
||||||
|
├── tasks/ # Основные задачи
|
||||||
|
│ └── main.yml
|
||||||
|
├── handlers/ # Обработчики
|
||||||
|
│ └── main.yml
|
||||||
|
├── templates/ # Шаблоны Jinja2
|
||||||
|
│ └── my-role.conf.j2
|
||||||
|
├── files/ # Статические файлы
|
||||||
|
│ └── my-role.service
|
||||||
|
├── vars/ # Переменные роли
|
||||||
|
│ └── main.yml
|
||||||
|
├── defaults/ # Переменные по умолчанию
|
||||||
|
│ └── main.yml
|
||||||
|
├── meta/ # Метаданные роли
|
||||||
|
│ └── main.yml
|
||||||
|
└── README.md # Документация роли
|
||||||
|
```
|
||||||
|
|
||||||
|
### Создание структуры
|
||||||
|
|
||||||
|
#### Автоматическое создание (рекомендуется)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Интерактивное создание роли
|
||||||
|
make role create
|
||||||
|
|
||||||
|
# Система автоматически:
|
||||||
|
# - Создаст структуру папок
|
||||||
|
# - Создаст все необходимые файлы
|
||||||
|
# - Обновит roles/deploy.yml
|
||||||
|
# - Создаст README.md с документацией
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Ручное создание
|
||||||
|
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📝 Разработка роли
|
||||||
|
|
||||||
|
### 1. Основные задачи (tasks/main.yml)
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
# Основные задачи для роли my-role
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
- name: Установка пакетов
|
||||||
|
package:
|
||||||
|
name: "{{ my_role_packages }}"
|
||||||
|
state: present
|
||||||
|
when: my_role_enabled | default(true)
|
||||||
|
tags:
|
||||||
|
- my-role
|
||||||
|
- install
|
||||||
|
|
||||||
|
- name: Создание пользователя
|
||||||
|
user:
|
||||||
|
name: "{{ my_role_user }}"
|
||||||
|
system: "{{ my_role_system_user | default(false) }}"
|
||||||
|
shell: "{{ my_role_shell | default('/bin/bash') }}"
|
||||||
|
home: "{{ my_role_home | default('/home/' + my_role_user) }}"
|
||||||
|
when: my_role_create_user | default(true)
|
||||||
|
tags:
|
||||||
|
- my-role
|
||||||
|
- user
|
||||||
|
|
||||||
|
- name: Настройка конфигурации
|
||||||
|
template:
|
||||||
|
src: my-role.conf.j2
|
||||||
|
dest: "{{ my_role_config_file }}"
|
||||||
|
owner: "{{ my_role_user }}"
|
||||||
|
group: "{{ my_role_group | default(my_role_user) }}"
|
||||||
|
mode: '0644'
|
||||||
|
backup: "{{ my_role_backup | default(true) }}"
|
||||||
|
notify: restart my-role
|
||||||
|
tags:
|
||||||
|
- my-role
|
||||||
|
- config
|
||||||
|
|
||||||
|
- name: Настройка сервиса
|
||||||
|
systemd:
|
||||||
|
name: "{{ my_role_service_name | default('my-role') }}"
|
||||||
|
enabled: "{{ my_role_enabled | default(true) }}"
|
||||||
|
state: "{{ 'started' if my_role_enabled | default(true) else 'stopped' }}"
|
||||||
|
daemon_reload: true
|
||||||
|
tags:
|
||||||
|
- my-role
|
||||||
|
- service
|
||||||
|
|
||||||
|
- name: Настройка файрвола
|
||||||
|
firewalld:
|
||||||
|
port: "{{ my_role_port | default('8080') }}/tcp"
|
||||||
|
permanent: true
|
||||||
|
state: "{{ 'enabled' if my_role_firewall | default(false) else 'disabled' }}"
|
||||||
|
immediate: true
|
||||||
|
when: my_role_firewall | default(false)
|
||||||
|
tags:
|
||||||
|
- my-role
|
||||||
|
- firewall
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Обработчики (handlers/main.yml)
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
# Обработчики для роли my-role
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
- name: restart my-role
|
||||||
|
systemd:
|
||||||
|
name: "{{ my_role_service_name | default('my-role') }}"
|
||||||
|
state: restarted
|
||||||
|
daemon_reload: true
|
||||||
|
when: my_role_enabled | default(true)
|
||||||
|
|
||||||
|
- name: reload my-role
|
||||||
|
systemd:
|
||||||
|
name: "{{ my_role_service_name | default('my-role') }}"
|
||||||
|
state: reloaded
|
||||||
|
when: my_role_enabled | default(true)
|
||||||
|
|
||||||
|
- name: stop my-role
|
||||||
|
systemd:
|
||||||
|
name: "{{ my_role_service_name | default('my-role') }}"
|
||||||
|
state: stopped
|
||||||
|
when: not my_role_enabled | default(true)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Переменные по умолчанию (defaults/main.yml)
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
# Переменные по умолчанию для роли my-role
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
# Основные настройки
|
||||||
|
my_role_enabled: true
|
||||||
|
my_role_user: my-role
|
||||||
|
my_role_group: my-role
|
||||||
|
my_role_system_user: false
|
||||||
|
my_role_shell: /bin/bash
|
||||||
|
my_role_home: "{{ '/home/' + my_role_user if not my_role_system_user else '/var/lib/' + my_role_user }}"
|
||||||
|
|
||||||
|
# Пакеты
|
||||||
|
my_role_packages:
|
||||||
|
- nginx
|
||||||
|
- curl
|
||||||
|
- htop
|
||||||
|
|
||||||
|
# Конфигурация
|
||||||
|
my_role_config_file: /etc/my-role/my-role.conf
|
||||||
|
my_role_log_level: info
|
||||||
|
my_role_port: 8080
|
||||||
|
my_role_backup: true
|
||||||
|
|
||||||
|
# Сервис
|
||||||
|
my_role_service_name: my-role
|
||||||
|
my_role_create_user: true
|
||||||
|
|
||||||
|
# Безопасность
|
||||||
|
my_role_firewall: false
|
||||||
|
my_role_ssl_enabled: false
|
||||||
|
my_role_ssl_certificate: /etc/ssl/certs/my-role.crt
|
||||||
|
my_role_ssl_private_key: /etc/ssl/private/my-role.key
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Переменные роли (vars/main.yml)
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
# Переменные роли my-role
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
# Системные переменные
|
||||||
|
my_role_system_packages:
|
||||||
|
- python3
|
||||||
|
- python3-pip
|
||||||
|
- python3-venv
|
||||||
|
|
||||||
|
# Конфигурационные переменные
|
||||||
|
my_role_config_template: my-role.conf.j2
|
||||||
|
my_role_service_template: my-role.service.j2
|
||||||
|
|
||||||
|
# Пути
|
||||||
|
my_role_log_dir: /var/log/my-role
|
||||||
|
my_role_data_dir: /var/lib/my-role
|
||||||
|
my_role_cache_dir: /var/cache/my-role
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Метаданные (meta/main.yml)
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
# Метаданные роли my-role
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
galaxy_info:
|
||||||
|
author: Сергей Антропов
|
||||||
|
description: Моя кастомная роль для AnsibleTemplate
|
||||||
|
company: https://devops.org.ru
|
||||||
|
license: MIT
|
||||||
|
min_ansible_version: "2.9"
|
||||||
|
platforms:
|
||||||
|
- name: Ubuntu
|
||||||
|
versions:
|
||||||
|
- focal
|
||||||
|
- jammy
|
||||||
|
- name: Debian
|
||||||
|
versions:
|
||||||
|
- bullseye
|
||||||
|
- bookworm
|
||||||
|
- name: EL
|
||||||
|
versions:
|
||||||
|
- 7
|
||||||
|
- 8
|
||||||
|
- 9
|
||||||
|
- name: CentOS
|
||||||
|
versions:
|
||||||
|
- 7
|
||||||
|
- 8
|
||||||
|
- 9
|
||||||
|
- name: AlmaLinux
|
||||||
|
versions:
|
||||||
|
- 8
|
||||||
|
- 9
|
||||||
|
- name: Rocky
|
||||||
|
versions:
|
||||||
|
- 8
|
||||||
|
- 9
|
||||||
|
galaxy_tags:
|
||||||
|
- system
|
||||||
|
- configuration
|
||||||
|
- my-role
|
||||||
|
- web
|
||||||
|
- service
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
- role: geerlingguy.docker
|
||||||
|
when: my_role_docker_enabled | default(false)
|
||||||
|
- role: geerlingguy.kubernetes
|
||||||
|
when: my_role_k8s_enabled | default(false)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6. Шаблоны (templates/)
|
||||||
|
|
||||||
|
**`templates/my-role.conf.j2`:**
|
||||||
|
```jinja2
|
||||||
|
# Конфигурация my-role
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
[main]
|
||||||
|
enabled = {{ my_role_enabled | default(true) }}
|
||||||
|
user = {{ my_role_user }}
|
||||||
|
group = {{ my_role_group | default(my_role_user) }}
|
||||||
|
log_level = {{ my_role_log_level | default('info') }}
|
||||||
|
port = {{ my_role_port | default(8080) }}
|
||||||
|
|
||||||
|
[logging]
|
||||||
|
log_file = {{ my_role_log_dir | default('/var/log/my-role') }}/my-role.log
|
||||||
|
log_level = {{ my_role_log_level | default('info') }}
|
||||||
|
max_size = {{ my_role_log_max_size | default('100M') }}
|
||||||
|
max_files = {{ my_role_log_max_files | default('5') }}
|
||||||
|
|
||||||
|
[security]
|
||||||
|
ssl_enabled = {{ my_role_ssl_enabled | default(false) }}
|
||||||
|
{% if my_role_ssl_enabled | default(false) %}
|
||||||
|
ssl_certificate = {{ my_role_ssl_certificate }}
|
||||||
|
ssl_private_key = {{ my_role_ssl_private_key }}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
[network]
|
||||||
|
host = {{ my_role_host | default('0.0.0.0') }}
|
||||||
|
port = {{ my_role_port | default(8080) }}
|
||||||
|
timeout = {{ my_role_timeout | default(30) }}
|
||||||
|
|
||||||
|
{% if my_role_web_config | default(false) %}
|
||||||
|
[web]
|
||||||
|
enabled = true
|
||||||
|
{% raw %}
|
||||||
|
{{ my_role_nginx_config }}
|
||||||
|
{% endraw %}
|
||||||
|
{% endif %}
|
||||||
|
```
|
||||||
|
|
||||||
|
**`templates/my-role.service.j2`:**
|
||||||
|
```ini
|
||||||
|
[Unit]
|
||||||
|
Description=My Role Service
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User={{ my_role_user }}
|
||||||
|
Group={{ my_role_group | default(my_role_user) }}
|
||||||
|
ExecStart=/usr/bin/my-role --config {{ my_role_config_file }}
|
||||||
|
ExecReload=/bin/kill -HUP $MAINPID
|
||||||
|
Restart=always
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7. Статические файлы (files/)
|
||||||
|
|
||||||
|
**`files/my-role.service`:**
|
||||||
|
```ini
|
||||||
|
[Unit]
|
||||||
|
Description=My Role Service
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=my-role
|
||||||
|
Group=my-role
|
||||||
|
ExecStart=/usr/bin/my-role --config /etc/my-role/my-role.conf
|
||||||
|
ExecReload=/bin/kill -HUP $MAINPID
|
||||||
|
Restart=always
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧪 Тестирование роли
|
||||||
|
|
||||||
|
### 1. Lint проверка
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Lint проверка роли
|
||||||
|
make role lint
|
||||||
|
|
||||||
|
# Lint проверка конкретной роли
|
||||||
|
ansible-lint roles/my-role/
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Тестирование в Docker
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Тестирование с default preset
|
||||||
|
make role test
|
||||||
|
|
||||||
|
# Тестирование с minimal preset
|
||||||
|
make role test minimal
|
||||||
|
|
||||||
|
# Тестирование с custom preset
|
||||||
|
make role test my-custom-preset
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Тестирование на реальных серверах
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Dry-run развертывания
|
||||||
|
make role deploy
|
||||||
|
|
||||||
|
# Развертывание на продакшн
|
||||||
|
make role deploy
|
||||||
|
# Подтвердить развертывание: y
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 Интеграция с системой
|
||||||
|
|
||||||
|
### 1. Автоматическое включение в playbook'и
|
||||||
|
|
||||||
|
Роль автоматически включается в:
|
||||||
|
- `molecule/default/site.yml` (для тестирования)
|
||||||
|
- `roles/deploy.yml` (для продакшн развертывания)
|
||||||
|
|
||||||
|
### 2. Обновление playbook'ов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Автоматическое обновление playbook'ов
|
||||||
|
make update-playbooks
|
||||||
|
|
||||||
|
# Проверка обновленных playbook'ов
|
||||||
|
make role test
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Создание документации
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Автоматическое создание документации
|
||||||
|
make generate-docs
|
||||||
|
|
||||||
|
# Проверка созданной документации
|
||||||
|
ls -la roles/*/README.md
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📚 Документация роли
|
||||||
|
|
||||||
|
### README.md для роли
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Роль My-Role
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
|
|
||||||
|
## Описание
|
||||||
|
|
||||||
|
Роль для настройки и конфигурации my-role сервиса.
|
||||||
|
|
||||||
|
## Требования
|
||||||
|
|
||||||
|
- Ansible >= 2.9
|
||||||
|
- Поддерживаемые ОС: Ubuntu, Debian, RHEL, CentOS, AlmaLinux, Rocky Linux
|
||||||
|
|
||||||
|
## Переменные
|
||||||
|
|
||||||
|
| Переменная | Тип | По умолчанию | Описание |
|
||||||
|
|------------|-----|--------------|----------|
|
||||||
|
| `my_role_enabled` | boolean | `true` | Включить роль |
|
||||||
|
| `my_role_user` | string | `my-role` | Пользователь для сервиса |
|
||||||
|
| `my_role_packages` | list | `['nginx', 'curl']` | Пакеты для установки |
|
||||||
|
| `my_role_port` | integer | `8080` | Порт сервиса |
|
||||||
|
| `my_role_ssl_enabled` | boolean | `false` | Включить SSL |
|
||||||
|
|
||||||
|
## Примеры использования
|
||||||
|
|
||||||
|
### Базовое использование
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- name: Настройка my-role
|
||||||
|
hosts: all
|
||||||
|
roles:
|
||||||
|
- my-role
|
||||||
|
```
|
||||||
|
|
||||||
|
### С кастомными параметрами
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- name: Настройка my-role с SSL
|
||||||
|
hosts: all
|
||||||
|
roles:
|
||||||
|
- role: my-role
|
||||||
|
vars:
|
||||||
|
my_role_ssl_enabled: true
|
||||||
|
my_role_port: 8443
|
||||||
|
my_role_packages:
|
||||||
|
- nginx
|
||||||
|
- openssl
|
||||||
|
```
|
||||||
|
|
||||||
|
### В playbook
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
- name: Настройка web серверов
|
||||||
|
hosts: web_servers
|
||||||
|
become: true
|
||||||
|
roles:
|
||||||
|
- role: my-role
|
||||||
|
vars:
|
||||||
|
my_role_enabled: true
|
||||||
|
my_role_ssl_enabled: true
|
||||||
|
my_role_firewall: true
|
||||||
|
tags:
|
||||||
|
- web
|
||||||
|
- my-role
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tags
|
||||||
|
|
||||||
|
- `my-role` - выполнение всех задач роли
|
||||||
|
- `install` - установка пакетов
|
||||||
|
- `user` - создание пользователя
|
||||||
|
- `config` - настройка конфигурации
|
||||||
|
- `service` - управление сервисом
|
||||||
|
- `firewall` - настройка файрвола
|
||||||
|
|
||||||
|
## Поддерживаемые ОС
|
||||||
|
|
||||||
|
- Red Hat Enterprise Linux 7/8/9
|
||||||
|
- CentOS 7/8/Stream
|
||||||
|
- AlmaLinux 8/9
|
||||||
|
- Rocky Linux 8/9
|
||||||
|
- Ubuntu 20.04/22.04
|
||||||
|
- Debian 10/11/12
|
||||||
|
|
||||||
|
## Лицензия
|
||||||
|
|
||||||
|
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
|
||||||
520
docs/deploy-yml-customization.md
Normal file
520
docs/deploy-yml-customization.md
Normal file
@@ -0,0 +1,520 @@
|
|||||||
|
# Кастомизация deploy.yml - Полное руководство
|
||||||
|
|
||||||
|
## Описание
|
||||||
|
|
||||||
|
Файл `roles/deploy.yml` - это основной playbook для развертывания Ansible ролей на продакшн серверах. Этот документ содержит полную сводку по кастомизации и настройке различных сценариев развертывания.
|
||||||
|
|
||||||
|
## Базовый пример
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
# Playbook для развертывания на продакшн серверах
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
- name: Развертывание всех ролей
|
||||||
|
hosts: all
|
||||||
|
roles:
|
||||||
|
- ping
|
||||||
|
```
|
||||||
|
|
||||||
|
## 1. Управление привилегиями (become)
|
||||||
|
|
||||||
|
### Базовое использование become
|
||||||
|
```yaml
|
||||||
|
- name: Развертывание с sudo правами
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
roles:
|
||||||
|
- nginx
|
||||||
|
- postgresql
|
||||||
|
```
|
||||||
|
|
||||||
|
### Become с паролем
|
||||||
|
```yaml
|
||||||
|
- name: Развертывание с sudo паролем
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
become_method: sudo
|
||||||
|
become_user: root
|
||||||
|
vars:
|
||||||
|
ansible_become_pass: "{{ vault_sudo_password }}"
|
||||||
|
roles:
|
||||||
|
- nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
### Become для конкретных ролей
|
||||||
|
```yaml
|
||||||
|
- name: Развертывание с разными привилегиями
|
||||||
|
hosts: all
|
||||||
|
roles:
|
||||||
|
- role: nginx
|
||||||
|
become: true
|
||||||
|
- role: app-config
|
||||||
|
become: false
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2. Группировка хостов
|
||||||
|
|
||||||
|
### Развертывание по группам
|
||||||
|
```yaml
|
||||||
|
- name: Развертывание на веб-серверах
|
||||||
|
hosts: webservers
|
||||||
|
become: true
|
||||||
|
roles:
|
||||||
|
- nginx
|
||||||
|
- php-fpm
|
||||||
|
|
||||||
|
- name: Развертывание на БД серверах
|
||||||
|
hosts: databases
|
||||||
|
become: true
|
||||||
|
roles:
|
||||||
|
- postgresql
|
||||||
|
- redis
|
||||||
|
|
||||||
|
- name: Развертывание на мониторинг серверах
|
||||||
|
hosts: monitoring
|
||||||
|
become: true
|
||||||
|
roles:
|
||||||
|
- prometheus
|
||||||
|
- grafana
|
||||||
|
```
|
||||||
|
|
||||||
|
### Условное развертывание
|
||||||
|
```yaml
|
||||||
|
- name: Развертывание на production
|
||||||
|
hosts: production
|
||||||
|
become: true
|
||||||
|
when: environment == "production"
|
||||||
|
roles:
|
||||||
|
- nginx
|
||||||
|
- ssl-certificates
|
||||||
|
|
||||||
|
- name: Развертывание на staging
|
||||||
|
hosts: staging
|
||||||
|
become: false
|
||||||
|
when: environment == "staging"
|
||||||
|
roles:
|
||||||
|
- nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. Переменные и конфигурация
|
||||||
|
|
||||||
|
### Глобальные переменные
|
||||||
|
```yaml
|
||||||
|
- name: Развертывание с переменными
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
vars:
|
||||||
|
nginx_port: 80
|
||||||
|
nginx_ssl_port: 443
|
||||||
|
app_name: "my-application"
|
||||||
|
app_version: "1.0.0"
|
||||||
|
roles:
|
||||||
|
- nginx
|
||||||
|
- application
|
||||||
|
```
|
||||||
|
|
||||||
|
### Переменные для конкретных ролей
|
||||||
|
```yaml
|
||||||
|
- name: Развертывание с ролевыми переменными
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
roles:
|
||||||
|
- role: nginx
|
||||||
|
vars:
|
||||||
|
nginx_port: 80
|
||||||
|
nginx_ssl_enabled: true
|
||||||
|
- role: postgresql
|
||||||
|
vars:
|
||||||
|
postgresql_version: "13"
|
||||||
|
postgresql_max_connections: 200
|
||||||
|
```
|
||||||
|
|
||||||
|
### Использование group_vars и host_vars
|
||||||
|
```yaml
|
||||||
|
# group_vars/webservers.yml
|
||||||
|
nginx_worker_processes: 4
|
||||||
|
nginx_worker_connections: 1024
|
||||||
|
|
||||||
|
# group_vars/databases.yml
|
||||||
|
postgresql_shared_buffers: "256MB"
|
||||||
|
postgresql_effective_cache_size: "1GB"
|
||||||
|
|
||||||
|
# В deploy.yml
|
||||||
|
- name: Развертывание с групповыми переменными
|
||||||
|
hosts: webservers:databases
|
||||||
|
become: true
|
||||||
|
roles:
|
||||||
|
- nginx
|
||||||
|
- postgresql
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4. Теги (Tags)
|
||||||
|
|
||||||
|
### Базовое использование тегов
|
||||||
|
```yaml
|
||||||
|
- name: Развертывание с тегами
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
roles:
|
||||||
|
- role: nginx
|
||||||
|
tags: ['web', 'nginx']
|
||||||
|
- role: postgresql
|
||||||
|
tags: ['database', 'postgresql']
|
||||||
|
- role: monitoring
|
||||||
|
tags: ['monitoring', 'prometheus']
|
||||||
|
```
|
||||||
|
|
||||||
|
### Запуск с тегами
|
||||||
|
```bash
|
||||||
|
# Развертывание только веб-серверов
|
||||||
|
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags web
|
||||||
|
|
||||||
|
# Развертывание только БД
|
||||||
|
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags database
|
||||||
|
|
||||||
|
# Развертывание веб + БД
|
||||||
|
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags web,database
|
||||||
|
|
||||||
|
# Пропустить мониторинг
|
||||||
|
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --skip-tags monitoring
|
||||||
|
```
|
||||||
|
|
||||||
|
## 5. Обработчики (Handlers)
|
||||||
|
|
||||||
|
### Использование обработчиков
|
||||||
|
```yaml
|
||||||
|
- name: Развертывание с обработчиками
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
roles:
|
||||||
|
- nginx
|
||||||
|
- postgresql
|
||||||
|
handlers:
|
||||||
|
- name: restart nginx
|
||||||
|
service:
|
||||||
|
name: nginx
|
||||||
|
state: restarted
|
||||||
|
listen: "restart nginx"
|
||||||
|
|
||||||
|
- name: restart postgresql
|
||||||
|
service:
|
||||||
|
name: postgresql
|
||||||
|
state: restarted
|
||||||
|
listen: "restart postgresql"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6. Условное выполнение
|
||||||
|
|
||||||
|
### Условия на основе переменных
|
||||||
|
```yaml
|
||||||
|
- name: Развертывание с условиями
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
roles:
|
||||||
|
- role: nginx
|
||||||
|
when: nginx_enabled | default(true)
|
||||||
|
- role: postgresql
|
||||||
|
when: database_enabled | default(true)
|
||||||
|
- role: redis
|
||||||
|
when: cache_enabled | default(false)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Условия на основе групп
|
||||||
|
```yaml
|
||||||
|
- name: Развертывание с групповыми условиями
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
roles:
|
||||||
|
- role: nginx
|
||||||
|
when: "'webservers' in group_names"
|
||||||
|
- role: postgresql
|
||||||
|
when: "'databases' in group_names"
|
||||||
|
- role: monitoring
|
||||||
|
when: "'monitoring' in group_names"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 7. Параллельное выполнение
|
||||||
|
|
||||||
|
### Настройка параллелизма
|
||||||
|
```yaml
|
||||||
|
- name: Развертывание с параллелизмом
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
serial: 2 # Выполнять на 2 хостах одновременно
|
||||||
|
roles:
|
||||||
|
- nginx
|
||||||
|
- postgresql
|
||||||
|
```
|
||||||
|
|
||||||
|
### Каскадное развертывание
|
||||||
|
```yaml
|
||||||
|
- name: Развертывание БД (первыми)
|
||||||
|
hosts: databases
|
||||||
|
become: true
|
||||||
|
serial: 1
|
||||||
|
roles:
|
||||||
|
- postgresql
|
||||||
|
|
||||||
|
- name: Развертывание приложений (после БД)
|
||||||
|
hosts: webservers
|
||||||
|
become: true
|
||||||
|
serial: 2
|
||||||
|
roles:
|
||||||
|
- nginx
|
||||||
|
- application
|
||||||
|
```
|
||||||
|
|
||||||
|
## 8. Обработка ошибок
|
||||||
|
|
||||||
|
### Игнорирование ошибок
|
||||||
|
```yaml
|
||||||
|
- name: Развертывание с игнорированием ошибок
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
ignore_errors: true
|
||||||
|
roles:
|
||||||
|
- nginx
|
||||||
|
- postgresql
|
||||||
|
```
|
||||||
|
|
||||||
|
### Обработка ошибок на уровне ролей
|
||||||
|
```yaml
|
||||||
|
- name: Развертывание с обработкой ошибок
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
roles:
|
||||||
|
- role: nginx
|
||||||
|
ignore_errors: true
|
||||||
|
- role: postgresql
|
||||||
|
ignore_errors: false
|
||||||
|
```
|
||||||
|
|
||||||
|
## 9. Инвентарь и подключение
|
||||||
|
|
||||||
|
### Различные пользователи
|
||||||
|
```yaml
|
||||||
|
- name: Развертывание с разными пользователями
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
remote_user: "{{ ansible_user | default('ubuntu') }}"
|
||||||
|
roles:
|
||||||
|
- nginx
|
||||||
|
- postgresql
|
||||||
|
```
|
||||||
|
|
||||||
|
### SSH настройки
|
||||||
|
```yaml
|
||||||
|
- name: Развертывание с SSH настройками
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
gather_facts: true
|
||||||
|
roles:
|
||||||
|
- nginx
|
||||||
|
- postgresql
|
||||||
|
vars:
|
||||||
|
ansible_ssh_private_key_file: "~/.ssh/id_rsa"
|
||||||
|
ansible_ssh_common_args: "-o StrictHostKeyChecking=no"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 10. Полный пример продакшн развертывания
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
# Полный пример продакшн развертывания
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
# 1. Развертывание инфраструктуры
|
||||||
|
- name: Развертывание инфраструктуры
|
||||||
|
hosts: infrastructure
|
||||||
|
become: true
|
||||||
|
serial: 1
|
||||||
|
roles:
|
||||||
|
- role: nginx
|
||||||
|
vars:
|
||||||
|
nginx_ssl_enabled: true
|
||||||
|
nginx_ssl_cert: "{{ ssl_cert_path }}"
|
||||||
|
nginx_ssl_key: "{{ ssl_key_path }}"
|
||||||
|
tags: ['infrastructure', 'nginx']
|
||||||
|
|
||||||
|
# 2. Развертывание БД
|
||||||
|
- name: Развертывание базы данных
|
||||||
|
hosts: databases
|
||||||
|
become: true
|
||||||
|
serial: 1
|
||||||
|
roles:
|
||||||
|
- role: postgresql
|
||||||
|
vars:
|
||||||
|
postgresql_version: "13"
|
||||||
|
postgresql_max_connections: 200
|
||||||
|
postgresql_shared_buffers: "256MB"
|
||||||
|
tags: ['database', 'postgresql']
|
||||||
|
|
||||||
|
# 3. Развертывание приложений
|
||||||
|
- name: Развертывание приложений
|
||||||
|
hosts: webservers
|
||||||
|
become: true
|
||||||
|
serial: 2
|
||||||
|
roles:
|
||||||
|
- role: nginx
|
||||||
|
vars:
|
||||||
|
nginx_upstream_servers: "{{ app_servers }}"
|
||||||
|
tags: ['application', 'nginx']
|
||||||
|
- role: application
|
||||||
|
vars:
|
||||||
|
app_version: "{{ app_version }}"
|
||||||
|
app_environment: "{{ environment }}"
|
||||||
|
tags: ['application']
|
||||||
|
|
||||||
|
# 4. Развертывание мониторинга
|
||||||
|
- name: Развертывание мониторинга
|
||||||
|
hosts: monitoring
|
||||||
|
become: true
|
||||||
|
when: monitoring_enabled | default(true)
|
||||||
|
roles:
|
||||||
|
- role: prometheus
|
||||||
|
tags: ['monitoring', 'prometheus']
|
||||||
|
- role: grafana
|
||||||
|
tags: ['monitoring', 'grafana']
|
||||||
|
```
|
||||||
|
|
||||||
|
## 11. Команды запуска
|
||||||
|
|
||||||
|
### Базовые команды
|
||||||
|
```bash
|
||||||
|
# Развертывание всех ролей
|
||||||
|
make role deploy
|
||||||
|
|
||||||
|
# Развертывание с проверкой (dry-run)
|
||||||
|
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --check
|
||||||
|
|
||||||
|
# Развертывание с тегами
|
||||||
|
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags web,database
|
||||||
|
|
||||||
|
# Развертывание с переменными
|
||||||
|
ansible-playbook -i inventory/hosts.ini roles/deploy.yml -e "app_version=1.0.0"
|
||||||
|
|
||||||
|
# Развертывание с лимитом хостов
|
||||||
|
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --limit webservers
|
||||||
|
```
|
||||||
|
|
||||||
|
### Продвинутые команды
|
||||||
|
```bash
|
||||||
|
# Развертывание с параллелизмом
|
||||||
|
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --forks 5
|
||||||
|
|
||||||
|
# Развертывание с детальным выводом
|
||||||
|
ansible-playbook -i inventory/hosts.ini roles/deploy.yml -vvv
|
||||||
|
|
||||||
|
# Развертывание с обработкой ошибок
|
||||||
|
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --force-handlers
|
||||||
|
|
||||||
|
# Развертывание с тестированием
|
||||||
|
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --check --diff
|
||||||
|
```
|
||||||
|
|
||||||
|
## 12. Переменные окружения
|
||||||
|
|
||||||
|
### Использование переменных окружения
|
||||||
|
```bash
|
||||||
|
# Установка переменных окружения
|
||||||
|
export ANSIBLE_HOST_KEY_CHECKING=False
|
||||||
|
export ANSIBLE_SSH_RETRIES=3
|
||||||
|
export ANSIBLE_TIMEOUT=30
|
||||||
|
|
||||||
|
# Развертывание
|
||||||
|
make role deploy
|
||||||
|
```
|
||||||
|
|
||||||
|
### Файл переменных
|
||||||
|
```yaml
|
||||||
|
# group_vars/all.yml
|
||||||
|
ansible_user: ubuntu
|
||||||
|
ansible_ssh_private_key_file: "~/.ssh/id_rsa"
|
||||||
|
ansible_ssh_common_args: "-o StrictHostKeyChecking=no"
|
||||||
|
|
||||||
|
# Переменные приложения
|
||||||
|
app_name: "my-application"
|
||||||
|
app_version: "1.0.0"
|
||||||
|
environment: "production"
|
||||||
|
|
||||||
|
# Переменные БД
|
||||||
|
postgresql_version: "13"
|
||||||
|
postgresql_max_connections: 200
|
||||||
|
```
|
||||||
|
|
||||||
|
## 13. Безопасность
|
||||||
|
|
||||||
|
### Использование Vault
|
||||||
|
```yaml
|
||||||
|
# В deploy.yml
|
||||||
|
- name: Развертывание с секретами
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
vars:
|
||||||
|
db_password: "{{ vault_db_password }}"
|
||||||
|
ssl_cert: "{{ vault_ssl_cert }}"
|
||||||
|
roles:
|
||||||
|
- postgresql
|
||||||
|
- nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
### Запуск с Vault
|
||||||
|
```bash
|
||||||
|
# Развертывание с паролем Vault
|
||||||
|
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --ask-vault-pass
|
||||||
|
|
||||||
|
# Развертывание с файлом пароля
|
||||||
|
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --vault-password-file .vault_pass
|
||||||
|
```
|
||||||
|
|
||||||
|
## 14. Отладка и логирование
|
||||||
|
|
||||||
|
### Включение отладки
|
||||||
|
```yaml
|
||||||
|
- name: Развертывание с отладкой
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
debug: true
|
||||||
|
roles:
|
||||||
|
- nginx
|
||||||
|
- postgresql
|
||||||
|
```
|
||||||
|
|
||||||
|
### Логирование
|
||||||
|
```bash
|
||||||
|
# Развертывание с логированием
|
||||||
|
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --log-path /var/log/ansible.log
|
||||||
|
|
||||||
|
# Развертывание с детальным выводом
|
||||||
|
ansible-playbook -i inventory/hosts.ini roles/deploy.yml -vvv
|
||||||
|
```
|
||||||
|
|
||||||
|
## 15. Лучшие практики
|
||||||
|
|
||||||
|
### Структура файла
|
||||||
|
1. **Комментарии** - описывайте каждый блок
|
||||||
|
2. **Группировка** - логически группируйте роли
|
||||||
|
3. **Переменные** - выносите переменные в отдельные файлы
|
||||||
|
4. **Теги** - используйте теги для гибкости
|
||||||
|
5. **Условия** - добавляйте условия для безопасности
|
||||||
|
|
||||||
|
### Рекомендации
|
||||||
|
- Используйте `become: true` для системных ролей
|
||||||
|
- Группируйте хосты по функциональности
|
||||||
|
- Применяйте теги для модульности
|
||||||
|
- Используйте переменные для конфигурации
|
||||||
|
- Добавляйте условия для безопасности
|
||||||
|
- Логируйте все операции
|
||||||
|
- Тестируйте с `--check` перед развертыванием
|
||||||
|
|
||||||
|
## Заключение
|
||||||
|
|
||||||
|
Файл `roles/deploy.yml` - это центральный элемент развертывания. Правильная его настройка обеспечивает гибкость, безопасность и надежность развертывания Ansible ролей на продакшн серверах.
|
||||||
|
|
||||||
|
Для получения дополнительной информации см.:
|
||||||
|
- [Создание ролей](creating-roles.md)
|
||||||
|
- [Настройка CI/CD](cicd-setup.md)
|
||||||
|
- [Мониторинг](monitoring.md)
|
||||||
425
docs/examples.md
Normal file
425
docs/examples.md
Normal file
@@ -0,0 +1,425 @@
|
|||||||
|
# Примеры использования универсальной системы тестирования
|
||||||
|
|
||||||
|
## Пример 1: Тестирование кластера etcd + PostgreSQL + Patroni
|
||||||
|
|
||||||
|
### Описание
|
||||||
|
Этот пример демонстрирует тестирование высокодоступного кластера 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
|
||||||
|
|
||||||
|
# Тестирование с preset'ом
|
||||||
|
make preset-test PRESET=etcd-patroni
|
||||||
|
|
||||||
|
# Или через role test
|
||||||
|
make role test etcd-patroni
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка результатов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверить статус контейнеров
|
||||||
|
make container-info
|
||||||
|
|
||||||
|
# Проверить vault файлы
|
||||||
|
make vault-check
|
||||||
|
```
|
||||||
|
|
||||||
|
## Пример 2: Нагрузочное тестирование
|
||||||
|
|
||||||
|
### Описание
|
||||||
|
Этот пример демонстрирует тестирование под нагрузкой с множественными серверами и кэшем.
|
||||||
|
|
||||||
|
### Preset: performance
|
||||||
|
|
||||||
|
```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
|
||||||
|
vars:
|
||||||
|
db_password: "{{ database_password }}"
|
||||||
|
api_key: "{{ api_key }}"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка безопасности
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверить vault файлы
|
||||||
|
make vault-check
|
||||||
|
|
||||||
|
# Найти потенциальные секреты
|
||||||
|
make vault-scan
|
||||||
|
```
|
||||||
|
|
||||||
|
## Заключение
|
||||||
|
|
||||||
|
Эти примеры демонстрируют различные способы использования универсальной системы тестирования Ansible ролей. Вы можете:
|
||||||
|
|
||||||
|
1. Использовать готовые preset'ы для быстрого тестирования
|
||||||
|
2. Создавать собственные preset'ы для специфических нужд
|
||||||
|
3. Комбинировать различные типы контейнеров
|
||||||
|
4. Использовать Ansible Vault для безопасности
|
||||||
|
5. Тестировать на различных операционных системах
|
||||||
|
|
||||||
|
Для получения дополнительной информации используйте:
|
||||||
|
- `make help` - общая справка
|
||||||
|
- `make preset-list` - список preset'ов
|
||||||
|
- `make container-types` - типы контейнеров
|
||||||
|
- `make vault` - команды Vault
|
||||||
|
|
||||||
294
docs/getting-started.md
Normal file
294
docs/getting-started.md
Normal file
@@ -0,0 +1,294 @@
|
|||||||
|
# Быстрый старт с AnsibleLab
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
|
|
||||||
|
## 🚀 Установка и настройка
|
||||||
|
|
||||||
|
### 1. Клонирование репозитория
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/your-username/AnsibleLab.git
|
||||||
|
cd AnsibleLab
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Настройка Docker
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Настройка multi-arch builder
|
||||||
|
make docker setup-builder
|
||||||
|
|
||||||
|
# Сборка всех образов
|
||||||
|
make docker build
|
||||||
|
|
||||||
|
# Проверка собранных образов
|
||||||
|
make docker info
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧪 Первое тестирование
|
||||||
|
|
||||||
|
### 1. Управление ролями
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Просмотр всех ролей
|
||||||
|
make role list
|
||||||
|
|
||||||
|
# Создание новой роли (интерактивно)
|
||||||
|
make role create
|
||||||
|
|
||||||
|
# Удаление роли (интерактивно)
|
||||||
|
make role delete
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Просмотр доступных preset'ов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Список всех preset'ов
|
||||||
|
make presets list
|
||||||
|
|
||||||
|
# Информация о конкретном preset'е
|
||||||
|
make presets info PRESET=default
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Тестирование роли ping
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Тестирование с default preset
|
||||||
|
make role test
|
||||||
|
|
||||||
|
# Тестирование с minimal preset
|
||||||
|
make role test minimal
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Проверка результатов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Просмотр логов
|
||||||
|
docker logs ansible-controller
|
||||||
|
|
||||||
|
# Вход в контейнер для отладки
|
||||||
|
docker exec -it ansible-controller bash
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 Создание первой роли
|
||||||
|
|
||||||
|
### 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. Разработка роли
|
||||||
|
|
||||||
|
**`roles/my-role/tasks/main.yml`:**
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
# Основные задачи для роли my-role
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
- name: Установка пакетов
|
||||||
|
package:
|
||||||
|
name: "{{ my_role_packages }}"
|
||||||
|
state: present
|
||||||
|
when: my_role_enabled | default(true)
|
||||||
|
tags:
|
||||||
|
- my-role
|
||||||
|
- install
|
||||||
|
|
||||||
|
- 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
|
||||||
|
```
|
||||||
|
|
||||||
|
**`roles/my-role/defaults/main.yml`:**
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
# Переменные по умолчанию для роли my-role
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
# Основные настройки
|
||||||
|
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. Тестирование роли
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Lint проверка
|
||||||
|
make role lint
|
||||||
|
|
||||||
|
# Тестирование в Docker
|
||||||
|
make role test minimal
|
||||||
|
|
||||||
|
# Тестирование с custom preset
|
||||||
|
make role test my-custom-preset
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚀 Развертывание на продакшн
|
||||||
|
|
||||||
|
### 1. Настройка инвентори
|
||||||
|
|
||||||
|
**`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
|
||||||
|
|
||||||
|
[all:vars]
|
||||||
|
ansible_user=devops
|
||||||
|
ansible_ssh_private_key_file=~/.ssh/id_rsa
|
||||||
|
ansible_ssh_common_args='-o StrictHostKeyChecking=no'
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Настройка SSH ключей
|
||||||
|
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Тестирование подключения
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка подключения
|
||||||
|
ansible all -i inventory/hosts.ini -m ping
|
||||||
|
|
||||||
|
# Dry-run развертывания
|
||||||
|
make role deploy
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Развертывание
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Развертывание на продакшн
|
||||||
|
make role deploy
|
||||||
|
# Подтвердить развертывание: y
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔐 Управление секретами
|
||||||
|
|
||||||
|
### 1. Инициализация vault
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создание файла пароля
|
||||||
|
make vault init
|
||||||
|
|
||||||
|
# Создание файла секретов
|
||||||
|
make vault create
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Работа с секретами
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Редактирование секретов
|
||||||
|
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
|
||||||
226
docs/linting-guide.md
Normal file
226
docs/linting-guide.md
Normal file
@@ -0,0 +1,226 @@
|
|||||||
|
# 🔍 Руководство по линтингу ролей
|
||||||
|
|
||||||
|
## Автор
|
||||||
|
Сергей Антропов
|
||||||
|
Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
## Обзор
|
||||||
|
|
||||||
|
Линтинг ролей - это автоматическая проверка синтаксиса, стиля и соответствия лучшим практикам Ansible. В AnsibleTemplate используется `ansible-lint` для обеспечения качества кода.
|
||||||
|
|
||||||
|
## Команды линтинга
|
||||||
|
|
||||||
|
### Проверка всех ролей
|
||||||
|
```bash
|
||||||
|
make role lint
|
||||||
|
```
|
||||||
|
- Проверяет все роли в директории `roles/`
|
||||||
|
- Использует конфигурацию из `.ansible-lint`
|
||||||
|
- Показывает все найденные ошибки и предупреждения
|
||||||
|
|
||||||
|
### Проверка конкретной роли
|
||||||
|
```bash
|
||||||
|
make role lint devops
|
||||||
|
make role lint ping
|
||||||
|
```
|
||||||
|
- Проверяет только указанную роль
|
||||||
|
- Автоматически валидирует существование роли
|
||||||
|
- Показывает доступные роли при ошибке
|
||||||
|
|
||||||
|
## Профили линтинга
|
||||||
|
|
||||||
|
Ansible-lint использует несколько профилей для разных уровней строгости:
|
||||||
|
|
||||||
|
### Production (по умолчанию)
|
||||||
|
- Самый строгий профиль
|
||||||
|
- Проверяет все правила
|
||||||
|
- Рекомендуется для продакшн кода
|
||||||
|
|
||||||
|
### Basic
|
||||||
|
- Базовые правила
|
||||||
|
- Подходит для разработки
|
||||||
|
- Менее строгий чем production
|
||||||
|
|
||||||
|
### Min
|
||||||
|
- Минимальные правила
|
||||||
|
- Только критичные ошибки
|
||||||
|
- Для быстрой проверки
|
||||||
|
|
||||||
|
## Конфигурация
|
||||||
|
|
||||||
|
Линтинг настраивается через файл `.ansible-lint`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
# Профиль по умолчанию
|
||||||
|
profile: production
|
||||||
|
|
||||||
|
# Исключения
|
||||||
|
skip_list:
|
||||||
|
- yaml[line-length] # Исключить проверку длины строк
|
||||||
|
|
||||||
|
# Дополнительные правила
|
||||||
|
enable_list:
|
||||||
|
- name[casing] # Включить проверку именования
|
||||||
|
|
||||||
|
# Игнорирование файлов
|
||||||
|
exclude_paths:
|
||||||
|
- .cache/
|
||||||
|
- .github/
|
||||||
|
- tests/
|
||||||
|
```
|
||||||
|
|
||||||
|
## Типы ошибок
|
||||||
|
|
||||||
|
### Синтаксические ошибки
|
||||||
|
- Неправильный YAML синтаксис
|
||||||
|
- Ошибки в Jinja2 шаблонах
|
||||||
|
- Неправильная структура playbook
|
||||||
|
|
||||||
|
### Стилистические ошибки
|
||||||
|
- Trailing spaces (лишние пробелы)
|
||||||
|
- Неправильные комментарии
|
||||||
|
- Неправильное форматирование
|
||||||
|
|
||||||
|
### Лучшие практики
|
||||||
|
- Использование устаревших модулей
|
||||||
|
- Неправильное использование become
|
||||||
|
- Отсутствие changed_when для command
|
||||||
|
|
||||||
|
## Примеры исправлений
|
||||||
|
|
||||||
|
### Trailing spaces
|
||||||
|
```yaml
|
||||||
|
# ❌ Неправильно
|
||||||
|
groups: ["sudo", "docker"]
|
||||||
|
# Лишние пробелы в конце строки
|
||||||
|
|
||||||
|
# ✅ Правильно
|
||||||
|
groups: ["sudo", "docker"]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Комментарии
|
||||||
|
```yaml
|
||||||
|
# ❌ Неправильно
|
||||||
|
#Комментарий без пробела
|
||||||
|
|
||||||
|
# ✅ Правильно
|
||||||
|
# Комментарий с пробелом
|
||||||
|
```
|
||||||
|
|
||||||
|
### Changed when
|
||||||
|
```yaml
|
||||||
|
# ❌ Неправильно
|
||||||
|
- name: "Проверка статуса"
|
||||||
|
command: "systemctl status nginx"
|
||||||
|
|
||||||
|
# ✅ Правильно
|
||||||
|
- name: "Проверка статуса"
|
||||||
|
command: "systemctl status nginx"
|
||||||
|
changed_when: false
|
||||||
|
```
|
||||||
|
|
||||||
|
## Автоматическое исправление
|
||||||
|
|
||||||
|
Некоторые ошибки можно исправить автоматически:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Исправить trailing spaces
|
||||||
|
sed -i 's/[[:space:]]*$//' roles/*/tasks/*.yml
|
||||||
|
|
||||||
|
# Исправить комментарии
|
||||||
|
sed -i 's/^#\([^ ]\)/# \1/' roles/*/tasks/*.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
## Интеграция с CI/CD
|
||||||
|
|
||||||
|
Линтинг автоматически запускается в CI/CD пайплайне:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# .github/workflows/lint.yml
|
||||||
|
name: Lint
|
||||||
|
on: [push, pull_request]
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: Run lint
|
||||||
|
run: make role lint
|
||||||
|
```
|
||||||
|
|
||||||
|
## Лучшие практики
|
||||||
|
|
||||||
|
### 1. Регулярная проверка
|
||||||
|
```bash
|
||||||
|
# Проверяйте код перед коммитом
|
||||||
|
make role lint
|
||||||
|
|
||||||
|
# Проверяйте конкретную роль при разработке
|
||||||
|
make role lint devops
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Исправляйте ошибки сразу
|
||||||
|
- Не накапливайте ошибки
|
||||||
|
- Исправляйте по мере обнаружения
|
||||||
|
- Используйте автоматические исправления
|
||||||
|
|
||||||
|
### 3. Настройте IDE
|
||||||
|
- Включите поддержку YAML
|
||||||
|
- Настройте автоформатирование
|
||||||
|
- Используйте расширения для Ansible
|
||||||
|
|
||||||
|
### 4. Используйте pre-commit hooks
|
||||||
|
```yaml
|
||||||
|
# .pre-commit-config.yaml
|
||||||
|
repos:
|
||||||
|
- repo: https://github.com/ansible/ansible-lint
|
||||||
|
rev: v6.0.0
|
||||||
|
hooks:
|
||||||
|
- id: ansible-lint
|
||||||
|
```
|
||||||
|
|
||||||
|
## Устранение неполадок
|
||||||
|
|
||||||
|
### Ошибка "Role not found"
|
||||||
|
```bash
|
||||||
|
❌ Роль 'nonexistent' не найдена в roles/
|
||||||
|
📋 Доступные роли:
|
||||||
|
- devops
|
||||||
|
- ping
|
||||||
|
```
|
||||||
|
**Решение**: Проверьте правильность имени роли
|
||||||
|
|
||||||
|
### Ошибка "Docker image not found"
|
||||||
|
```bash
|
||||||
|
Unable to find image 'ansible-controller:latest' locally
|
||||||
|
```
|
||||||
|
**Решение**: Соберите Docker образы:
|
||||||
|
```bash
|
||||||
|
make docker build
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ошибка "Permission denied"
|
||||||
|
```bash
|
||||||
|
Permission denied: /workspace/roles/
|
||||||
|
```
|
||||||
|
**Решение**: Проверьте права доступа к файлам
|
||||||
|
|
||||||
|
## Дополнительные ресурсы
|
||||||
|
|
||||||
|
- [Ansible Lint Documentation](https://ansible.readthedocs.io/projects/lint/)
|
||||||
|
- [Ansible Best Practices](https://docs.ansible.com/ansible/latest/user_guide/playbooks_best_practices.html)
|
||||||
|
- [YAML Style Guide](https://yaml.org/spec/1.2/spec.html)
|
||||||
|
|
||||||
|
## Поддержка
|
||||||
|
|
||||||
|
Если у вас возникли вопросы или проблемы с линтингом:
|
||||||
|
|
||||||
|
1. Проверьте документацию выше
|
||||||
|
2. Запустите `make role lint` для диагностики
|
||||||
|
3. Обратитесь к команде разработки
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Последнее обновление**: $(date)
|
||||||
|
**Версия**: 1.0.0
|
||||||
859
docs/molecule-guide.md
Normal file
859
docs/molecule-guide.md
Normal file
@@ -0,0 +1,859 @@
|
|||||||
|
# Подробное руководство по файлам Molecule
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
|
|
||||||
|
## 📋 Обзор
|
||||||
|
|
||||||
|
Molecule - это инструмент для тестирования Ansible ролей в изолированных окружениях. В проекте AnsibleLab используется универсальная конфигурация Molecule с поддержкой множества операционных систем и различных preset'ов для тестирования.
|
||||||
|
|
||||||
|
### 🔧 Fallback значения
|
||||||
|
|
||||||
|
**Важная особенность:** Все файлы Molecule содержат fallback значения, что обеспечивает работоспособность системы даже без preset файлов. Это означает, что:
|
||||||
|
|
||||||
|
- **Система всегда работает** - даже если preset файл не найден
|
||||||
|
- **Быстрый старт** - можно запустить тестирование без настройки
|
||||||
|
- **Надежность** - меньше точек отказа в системе
|
||||||
|
- **Отладка** - легче диагностировать проблемы с preset'ами
|
||||||
|
|
||||||
|
## 🏗️ Структура файлов Molecule
|
||||||
|
|
||||||
|
```
|
||||||
|
molecule/
|
||||||
|
├── default/ # Основная конфигурация Molecule
|
||||||
|
│ ├── molecule.yml # Главный конфигурационный файл
|
||||||
|
│ ├── create.yml # Создание тестовых контейнеров
|
||||||
|
│ ├── converge.yml # Выполнение ролей в контейнерах
|
||||||
|
│ ├── verify.yml # Проверка результатов тестирования
|
||||||
|
│ ├── destroy.yml # Удаление тестовых контейнеров
|
||||||
|
│ └── site.yml # Основной playbook для тестирования
|
||||||
|
└── presets/ # Preset конфигурации для разных сценариев
|
||||||
|
├── minimal.yml # Минимальный preset (1 хост)
|
||||||
|
├── performance.yml # Performance preset (12 хостов)
|
||||||
|
├── security.yml # Security preset (10 хостов)
|
||||||
|
├── etcd-patroni.yml # etcd-patroni preset
|
||||||
|
└── ... # Другие preset'ы
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📄 Детальное описание файлов
|
||||||
|
|
||||||
|
### 1. `molecule/default/molecule.yml` - Главный конфигурационный файл
|
||||||
|
|
||||||
|
**Назначение:** Основная конфигурация Molecule с настройками драйвера, платформ, provisioner'а и verifier'а.
|
||||||
|
|
||||||
|
#### Основные секции:
|
||||||
|
|
||||||
|
**Driver (Драйвер):**
|
||||||
|
```yaml
|
||||||
|
driver:
|
||||||
|
name: docker
|
||||||
|
```
|
||||||
|
- **Назначение:** Определяет использование Docker в качестве драйвера
|
||||||
|
- **Функция:** Создание и управление тестовыми контейнерами
|
||||||
|
|
||||||
|
**Platforms (Платформы):**
|
||||||
|
```yaml
|
||||||
|
platforms:
|
||||||
|
- name: placeholder
|
||||||
|
image: ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy
|
||||||
|
pre_build_image: true
|
||||||
|
- name: ansible-controller
|
||||||
|
image: inecs/ansible-lab:ansible-controller-latest
|
||||||
|
pre_build_image: true
|
||||||
|
# ... другие образы
|
||||||
|
```
|
||||||
|
- **Назначение:** Определяет доступные Docker образы для тестирования
|
||||||
|
- **Поддерживаемые ОС:** Ubuntu, Debian, RHEL, CentOS, AlmaLinux, Rocky Linux, Alt Linux, Astra Linux, RedOS
|
||||||
|
- **Собственные образы:** AnsibleLab создает собственные образы для тестирования
|
||||||
|
|
||||||
|
**Provisioner (Провижнер):**
|
||||||
|
```yaml
|
||||||
|
provisioner:
|
||||||
|
name: ansible
|
||||||
|
config_options:
|
||||||
|
defaults:
|
||||||
|
stdout_callback: yaml
|
||||||
|
env:
|
||||||
|
ANSIBLE_STDOUT_CALLBACK: yaml
|
||||||
|
inventory:
|
||||||
|
links:
|
||||||
|
hosts: "${MOLECULE_EPHEMERAL_DIRECTORY}/inventory/hosts.ini"
|
||||||
|
playbooks:
|
||||||
|
create: create.yml
|
||||||
|
converge: converge.yml
|
||||||
|
destroy: destroy.yml
|
||||||
|
```
|
||||||
|
- **Назначение:** Настройка Ansible как provisioner'а
|
||||||
|
- **Функции:**
|
||||||
|
- Настройка вывода в YAML формате
|
||||||
|
- Связывание инвентори файла
|
||||||
|
- Определение playbook'ов для разных этапов
|
||||||
|
|
||||||
|
**Dependency (Зависимости):**
|
||||||
|
```yaml
|
||||||
|
dependency:
|
||||||
|
name: galaxy
|
||||||
|
```
|
||||||
|
- **Назначение:** Установка зависимостей через Ansible Galaxy
|
||||||
|
- **Функция:** Автоматическая установка коллекций из `requirements.yml`
|
||||||
|
|
||||||
|
**Verifier (Верификатор):**
|
||||||
|
```yaml
|
||||||
|
verifier:
|
||||||
|
name: ansible
|
||||||
|
```
|
||||||
|
- **Назначение:** Использование Ansible для проверки результатов
|
||||||
|
- **Функция:** Выполнение `verify.yml` для проверки состояния системы
|
||||||
|
|
||||||
|
**Lint (Линтер):**
|
||||||
|
```yaml
|
||||||
|
lint: |-
|
||||||
|
set -e
|
||||||
|
ansible-lint /workspace/roles/
|
||||||
|
```
|
||||||
|
- **Назначение:** Проверка синтаксиса ролей
|
||||||
|
- **Функция:** Запуск `ansible-lint` для всех ролей в директории `roles/`
|
||||||
|
|
||||||
|
### 2. `molecule/default/create.yml` - Создание тестовых контейнеров
|
||||||
|
|
||||||
|
**Назначение:** Создание и настройка тестовых контейнеров согласно выбранному preset'у с fallback значениями.
|
||||||
|
|
||||||
|
#### Переменные и конфигурация:
|
||||||
|
|
||||||
|
**Fallback значения (по умолчанию):**
|
||||||
|
```yaml
|
||||||
|
vars:
|
||||||
|
# Получаем preset из переменной окружения или используем default
|
||||||
|
preset_name: "{{ lookup('env', 'MOLECULE_PRESET') | default('default') }}"
|
||||||
|
preset_file: "/workspace/molecule/presets/{{ preset_name }}.yml"
|
||||||
|
|
||||||
|
# Fallback значения если preset файл не найден
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
images:
|
||||||
|
alt: "inecs/ansible-lab:alt-linux-latest"
|
||||||
|
astra: "inecs/ansible-lab:astra-linux-latest"
|
||||||
|
rhel: "inecs/ansible-lab:rhel-latest"
|
||||||
|
centos: "inecs/ansible-lab:centos-latest"
|
||||||
|
alma: "inecs/ansible-lab:alma-latest"
|
||||||
|
rocky: "inecs/ansible-lab:rocky-latest"
|
||||||
|
redos: "inecs/ansible-lab:redos-latest"
|
||||||
|
ubuntu: "inecs/ansible-lab:ubuntu-latest"
|
||||||
|
debian: "inecs/ansible-lab:debian-latest"
|
||||||
|
systemd_defaults:
|
||||||
|
privileged: true
|
||||||
|
command: "/sbin/init"
|
||||||
|
volumes:
|
||||||
|
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
||||||
|
tmpfs: ["/run", "/run/lock"]
|
||||||
|
capabilities: ["SYS_ADMIN"]
|
||||||
|
hosts:
|
||||||
|
- name: u1
|
||||||
|
family: debian
|
||||||
|
groups: [test]
|
||||||
|
```
|
||||||
|
- **Назначение:** Определение fallback значений для случаев когда preset файл не найден
|
||||||
|
- **Функция:** Обеспечение работоспособности даже без preset файлов
|
||||||
|
- **Образы:** Собственные образы AnsibleLab для всех поддерживаемых ОС
|
||||||
|
- **Systemd настройки:** Стандартные настройки для systemd контейнеров
|
||||||
|
|
||||||
|
#### Основные задачи:
|
||||||
|
|
||||||
|
**Load preset configuration:**
|
||||||
|
```yaml
|
||||||
|
- name: Load preset configuration
|
||||||
|
include_vars: "{{ preset_file }}"
|
||||||
|
when: preset_file is file
|
||||||
|
ignore_errors: true
|
||||||
|
```
|
||||||
|
- **Назначение:** Загрузка конфигурации preset'а (перезаписывает fallback значения)
|
||||||
|
- **Функция:** Динамическое определение тестового окружения
|
||||||
|
- **Переменные:** `MOLECULE_PRESET` определяет какой preset использовать
|
||||||
|
- **Fallback:** Если preset файл не найден, используются значения по умолчанию
|
||||||
|
|
||||||
|
#### Преимущества fallback значений:
|
||||||
|
|
||||||
|
1. **Надежность:** Система работает даже без preset файлов
|
||||||
|
2. **Быстрый старт:** Можно запустить тестирование без настройки preset'ов
|
||||||
|
3. **Стандартизация:** Единые настройки для всех ОС
|
||||||
|
4. **Отладка:** Легче диагностировать проблемы с preset файлами
|
||||||
|
5. **Разработка:** Удобно для разработки новых preset'ов
|
||||||
|
|
||||||
|
**Ensure network exists:**
|
||||||
|
```yaml
|
||||||
|
- name: Ensure network exists
|
||||||
|
community.docker.docker_network:
|
||||||
|
name: "{{ docker_network }}"
|
||||||
|
state: present
|
||||||
|
```
|
||||||
|
- **Назначение:** Создание Docker сети для тестирования
|
||||||
|
- **Функция:** Обеспечение сетевого взаимодействия между контейнерами
|
||||||
|
- **По умолчанию:** Сеть `labnet`
|
||||||
|
|
||||||
|
**Pull systemd images:**
|
||||||
|
```yaml
|
||||||
|
- name: Pull systemd images
|
||||||
|
community.docker.docker_image:
|
||||||
|
name: "{{ images[item.family] }}"
|
||||||
|
source: pull
|
||||||
|
loop: "{{ hosts | selectattr('type','undefined') | list }}"
|
||||||
|
```
|
||||||
|
- **Назначение:** Загрузка Docker образов для systemd контейнеров
|
||||||
|
- **Функция:** Подготовка образов для создания контейнеров
|
||||||
|
- **Поддержка:** Различные семейства ОС (debian, rhel, alt, astra)
|
||||||
|
|
||||||
|
**Start systemd nodes:**
|
||||||
|
```yaml
|
||||||
|
- name: Start systemd nodes
|
||||||
|
community.docker.docker_container:
|
||||||
|
name: "{{ item.name }}"
|
||||||
|
image: "{{ images[item.family] }}"
|
||||||
|
networks:
|
||||||
|
- name: "{{ docker_network }}"
|
||||||
|
privileged: "{{ systemd_defaults.privileged }}"
|
||||||
|
command: "{{ systemd_defaults.command }}"
|
||||||
|
volumes: "{{ systemd_defaults.volumes | default([]) + (item.volumes | default([])) }}"
|
||||||
|
tmpfs: "{{ systemd_defaults.tmpfs | default([]) }}"
|
||||||
|
capabilities: "{{ systemd_defaults.capabilities | default([]) }}"
|
||||||
|
published_ports: "{{ item.publish | default([]) }}"
|
||||||
|
env: "{{ item.env | default({}) }}"
|
||||||
|
state: started
|
||||||
|
restart_policy: unless-stopped
|
||||||
|
```
|
||||||
|
- **Назначение:** Создание и запуск systemd контейнеров
|
||||||
|
- **Функции:**
|
||||||
|
- Создание контейнеров с systemd поддержкой
|
||||||
|
- Настройка привилегированного режима
|
||||||
|
- Монтирование cgroup для systemd
|
||||||
|
- Настройка tmpfs для /run
|
||||||
|
- Публикация портов
|
||||||
|
- Настройка переменных окружения
|
||||||
|
|
||||||
|
**Start DinD nodes (Docker-in-Docker):**
|
||||||
|
```yaml
|
||||||
|
- 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
|
||||||
|
```
|
||||||
|
- **Назначение:** Создание Docker-in-Docker контейнеров
|
||||||
|
- **Функции:**
|
||||||
|
- Тестирование Docker Compose
|
||||||
|
- Тестирование Dockerfile'ов
|
||||||
|
- Изолированная Docker среда
|
||||||
|
- Отдельные volumes для Docker данных
|
||||||
|
|
||||||
|
**Start DOoD nodes (Docker-out-of-Docker):**
|
||||||
|
```yaml
|
||||||
|
- name: Start DOoD nodes (systemd + docker.sock mount)
|
||||||
|
community.docker.docker_container:
|
||||||
|
name: "{{ item.name }}"
|
||||||
|
image: "{{ images[item.family] }}"
|
||||||
|
networks:
|
||||||
|
- name: "{{ 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([])) }}"
|
||||||
|
tmpfs: "{{ systemd_defaults.tmpfs | default([]) }}"
|
||||||
|
capabilities: "{{ systemd_defaults.capabilities | default([]) }}"
|
||||||
|
published_ports: "{{ item.publish | default([]) }}"
|
||||||
|
env: "{{ item.env | default({}) }}"
|
||||||
|
state: started
|
||||||
|
restart_policy: unless-stopped
|
||||||
|
```
|
||||||
|
- **Назначение:** Создание Docker-out-of-Docker контейнеров
|
||||||
|
- **Функции:**
|
||||||
|
- Доступ к Docker daemon хоста
|
||||||
|
- Тестирование Docker операций
|
||||||
|
- Комбинация systemd + Docker
|
||||||
|
|
||||||
|
**Build groups map:**
|
||||||
|
```yaml
|
||||||
|
- name: Initialize groups map
|
||||||
|
set_fact:
|
||||||
|
groups_map: {}
|
||||||
|
|
||||||
|
- name: Append hosts to groups
|
||||||
|
set_fact:
|
||||||
|
groups_map: "{{ groups_map | combine({ item_group: (groups_map[item_group] | default([])) + [item_name] }) }}"
|
||||||
|
loop: "{{ hosts | subelements('groups', skip_missing=True) }}"
|
||||||
|
```
|
||||||
|
- **Назначение:** Создание карты групп для инвентори
|
||||||
|
- **Функция:** Группировка хостов по назначению (servers, database, cache, etc.)
|
||||||
|
|
||||||
|
**Render inventory ini:**
|
||||||
|
```yaml
|
||||||
|
- name: Render inventory ini
|
||||||
|
set_fact:
|
||||||
|
inv_content: |
|
||||||
|
[all:vars]
|
||||||
|
ansible_connection=community.docker.docker
|
||||||
|
ansible_python_interpreter=/usr/bin/python3
|
||||||
|
|
||||||
|
{% for group, members in (groups_map | dictsort) %}
|
||||||
|
[{{ group }}]
|
||||||
|
{% for h in members %}{{ h }}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
[all]
|
||||||
|
{% for h in hosts %}{{ h.name }}
|
||||||
|
{% endfor %}
|
||||||
|
```
|
||||||
|
- **Назначение:** Генерация инвентори файла
|
||||||
|
- **Функция:** Создание динамического инвентори для Ansible
|
||||||
|
- **Формат:** INI формат с группами и переменными
|
||||||
|
|
||||||
|
**Write inventory file:**
|
||||||
|
```yaml
|
||||||
|
- name: Write inventory file
|
||||||
|
copy:
|
||||||
|
dest: "{{ generated_inventory }}"
|
||||||
|
content: "{{ inv_content }}"
|
||||||
|
mode: "0644"
|
||||||
|
```
|
||||||
|
- **Назначение:** Сохранение инвентори файла
|
||||||
|
- **Функция:** Запись сгенерированного инвентори в файл
|
||||||
|
|
||||||
|
**Display inventory summary:**
|
||||||
|
```yaml
|
||||||
|
- name: Display inventory summary
|
||||||
|
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 }}
|
||||||
|
```
|
||||||
|
- **Назначение:** Отображение сводки по созданным контейнерам
|
||||||
|
- **Функция:** Информация о количестве и типах контейнеров
|
||||||
|
|
||||||
|
### 3. `molecule/default/converge.yml` - Выполнение ролей
|
||||||
|
|
||||||
|
**Назначение:** Выполнение Ansible ролей в созданных контейнерах.
|
||||||
|
|
||||||
|
#### Основные задачи:
|
||||||
|
|
||||||
|
**Load preset configuration:**
|
||||||
|
```yaml
|
||||||
|
- name: Load preset configuration
|
||||||
|
include_vars: "{{ preset_file }}"
|
||||||
|
when: preset_file is file
|
||||||
|
ignore_errors: true
|
||||||
|
```
|
||||||
|
- **Назначение:** Загрузка конфигурации preset'а
|
||||||
|
- **Функция:** Применение настроек preset'а для выполнения
|
||||||
|
|
||||||
|
**Preflight vault — normalize state:**
|
||||||
|
```yaml
|
||||||
|
- 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
|
||||||
|
'
|
||||||
|
```
|
||||||
|
- **Назначение:** Подготовка vault файлов для выполнения
|
||||||
|
- **Функции:**
|
||||||
|
- Шифрование незашифрованных файлов
|
||||||
|
- Расшифровка файлов для выполнения
|
||||||
|
- Нормализация состояния vault файлов
|
||||||
|
|
||||||
|
**Run lab playbook:**
|
||||||
|
```yaml
|
||||||
|
- 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
|
||||||
|
"
|
||||||
|
```
|
||||||
|
- **Назначение:** Выполнение основного playbook'а
|
||||||
|
- **Функции:**
|
||||||
|
- Запуск `site.yml` в ansible-controller контейнере
|
||||||
|
- Использование сгенерированного инвентори
|
||||||
|
- Установка пути к ролям
|
||||||
|
|
||||||
|
**Post-run — re-encrypt secrets:**
|
||||||
|
```yaml
|
||||||
|
- 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
|
||||||
|
```
|
||||||
|
- **Назначение:** Повторное шифрование секретов после выполнения
|
||||||
|
- **Функция:** Обеспечение безопасности vault файлов
|
||||||
|
|
||||||
|
### 4. `molecule/default/verify.yml` - Проверка результатов
|
||||||
|
|
||||||
|
**Назначение:** Проверка состояния системы после выполнения ролей.
|
||||||
|
|
||||||
|
#### Основные задачи:
|
||||||
|
|
||||||
|
**Load preset configuration:**
|
||||||
|
```yaml
|
||||||
|
- name: Load preset configuration
|
||||||
|
include_vars: "{{ preset_file }}"
|
||||||
|
when: preset_file is file
|
||||||
|
ignore_errors: true
|
||||||
|
```
|
||||||
|
- **Назначение:** Загрузка конфигурации preset'а
|
||||||
|
- **Функция:** Применение настроек для проверки
|
||||||
|
|
||||||
|
**Check systemd nodes status:**
|
||||||
|
```yaml
|
||||||
|
- name: Check systemd nodes status
|
||||||
|
community.docker.docker_container_exec:
|
||||||
|
container: "{{ item.name }}"
|
||||||
|
command: systemctl is-system-running
|
||||||
|
loop: "{{ hosts | selectattr('type','undefined') | list }}"
|
||||||
|
register: systemd_status
|
||||||
|
ignore_errors: true
|
||||||
|
```
|
||||||
|
- **Назначение:** Проверка состояния systemd в контейнерах
|
||||||
|
- **Функция:** Убедиться что systemd работает корректно
|
||||||
|
|
||||||
|
**Check DinD nodes docker daemon:**
|
||||||
|
```yaml
|
||||||
|
- 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 }}"
|
||||||
|
register: dind_status
|
||||||
|
ignore_errors: true
|
||||||
|
```
|
||||||
|
- **Назначение:** Проверка Docker daemon в DinD контейнерах
|
||||||
|
- **Функция:** Убедиться что Docker работает в контейнерах
|
||||||
|
|
||||||
|
**Check DOoD nodes docker access:**
|
||||||
|
```yaml
|
||||||
|
- name: Check DOoD nodes docker access
|
||||||
|
community.docker.docker_container_exec:
|
||||||
|
container: "{{ item.name }}"
|
||||||
|
command: docker ps --format '{{.Names}}'
|
||||||
|
loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dood') | list }}"
|
||||||
|
register: dood_status
|
||||||
|
ignore_errors: true
|
||||||
|
```
|
||||||
|
- **Назначение:** Проверка доступа к Docker в DOoD контейнерах
|
||||||
|
- **Функция:** Убедиться что контейнеры могут обращаться к Docker daemon
|
||||||
|
|
||||||
|
**Test network connectivity between nodes:**
|
||||||
|
```yaml
|
||||||
|
- name: Test network connectivity between nodes
|
||||||
|
community.docker.docker_container_exec:
|
||||||
|
container: "{{ item.0.name }}"
|
||||||
|
command: ping -c 1 {{ item.1.name }}
|
||||||
|
loop: "{{ hosts | subelements(hosts, 'name') }}"
|
||||||
|
when: item.0.name != item.1.name
|
||||||
|
register: ping_results
|
||||||
|
ignore_errors: true
|
||||||
|
```
|
||||||
|
- **Назначение:** Проверка сетевого взаимодействия между контейнерами
|
||||||
|
- **Функция:** Убедиться что контейнеры могут общаться друг с другом
|
||||||
|
|
||||||
|
**Check published ports:**
|
||||||
|
```yaml
|
||||||
|
- name: Check published ports
|
||||||
|
community.docker.docker_container_exec:
|
||||||
|
container: "{{ item.name }}"
|
||||||
|
command: netstat -tlnp
|
||||||
|
loop: "{{ hosts | selectattr('publish','defined') | list }}"
|
||||||
|
register: port_status
|
||||||
|
ignore_errors: true
|
||||||
|
```
|
||||||
|
- **Назначение:** Проверка опубликованных портов
|
||||||
|
- **Функция:** Убедиться что порты доступны
|
||||||
|
|
||||||
|
**Display verification summary:**
|
||||||
|
```yaml
|
||||||
|
- name: Display verification summary
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
✅ Verification Summary:
|
||||||
|
- 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 }}
|
||||||
|
- Groups: {{ groups_map.keys() | list | join(', ') }}
|
||||||
|
- Network: {{ docker_network }}
|
||||||
|
```
|
||||||
|
- **Назначение:** Отображение итоговой сводки проверки
|
||||||
|
- **Функция:** Информация о состоянии всех компонентов
|
||||||
|
|
||||||
|
### 5. `molecule/default/destroy.yml` - Удаление контейнеров
|
||||||
|
|
||||||
|
**Назначение:** Очистка тестовых контейнеров и ресурсов.
|
||||||
|
|
||||||
|
#### Основные задачи:
|
||||||
|
|
||||||
|
**Load preset configuration:**
|
||||||
|
```yaml
|
||||||
|
- name: Load preset configuration
|
||||||
|
include_vars: "{{ preset_file }}"
|
||||||
|
when: preset_file is file
|
||||||
|
ignore_errors: true
|
||||||
|
```
|
||||||
|
- **Назначение:** Загрузка конфигурации preset'а
|
||||||
|
- **Функция:** Определение какие ресурсы нужно удалить
|
||||||
|
|
||||||
|
**Stop and remove containers:**
|
||||||
|
```yaml
|
||||||
|
- name: Stop and remove containers
|
||||||
|
community.docker.docker_container:
|
||||||
|
name: "{{ item.name }}"
|
||||||
|
state: absent
|
||||||
|
force_kill: true
|
||||||
|
loop: "{{ hosts }}"
|
||||||
|
ignore_errors: true
|
||||||
|
```
|
||||||
|
- **Назначение:** Остановка и удаление всех контейнеров
|
||||||
|
- **Функция:** Полная очистка тестовых контейнеров
|
||||||
|
|
||||||
|
**Remove DinD volumes:**
|
||||||
|
```yaml
|
||||||
|
- name: Remove DinD volumes
|
||||||
|
community.docker.docker_volume:
|
||||||
|
name: "{{ item.name }}-docker"
|
||||||
|
state: absent
|
||||||
|
loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list }}"
|
||||||
|
ignore_errors: true
|
||||||
|
```
|
||||||
|
- **Назначение:** Удаление volumes для DinD контейнеров
|
||||||
|
- **Функция:** Очистка Docker данных
|
||||||
|
|
||||||
|
**Remove custom volumes:**
|
||||||
|
```yaml
|
||||||
|
- name: Remove custom volumes
|
||||||
|
community.docker.docker_volume:
|
||||||
|
name: "{{ item.volumes | default([]) | select('match', '^[^:]+$') | list }}"
|
||||||
|
state: absent
|
||||||
|
loop: "{{ hosts }}"
|
||||||
|
ignore_errors: true
|
||||||
|
when: item.volumes is defined
|
||||||
|
```
|
||||||
|
- **Назначение:** Удаление пользовательских volumes
|
||||||
|
- **Функция:** Очистка дополнительных volumes
|
||||||
|
|
||||||
|
**Remove network:**
|
||||||
|
```yaml
|
||||||
|
- name: Remove network
|
||||||
|
community.docker.docker_network:
|
||||||
|
name: "{{ docker_network }}"
|
||||||
|
state: absent
|
||||||
|
ignore_errors: true
|
||||||
|
```
|
||||||
|
- **Назначение:** Удаление Docker сети
|
||||||
|
- **Функция:** Очистка сетевых ресурсов
|
||||||
|
|
||||||
|
**Display cleanup summary:**
|
||||||
|
```yaml
|
||||||
|
- 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 }}
|
||||||
|
```
|
||||||
|
- **Назначение:** Отображение сводки по очистке
|
||||||
|
- **Функция:** Информация о удаленных ресурсах
|
||||||
|
|
||||||
|
### 6. `molecule/default/site.yml` - Основной playbook
|
||||||
|
|
||||||
|
**Назначение:** Основной playbook для тестирования ролей.
|
||||||
|
|
||||||
|
#### Структура:
|
||||||
|
|
||||||
|
**Подготовка окружения:**
|
||||||
|
- Обновление пакетов для всех ОС
|
||||||
|
- Установка common tools
|
||||||
|
- Настройка пользователей
|
||||||
|
- Создание рабочих директорий
|
||||||
|
|
||||||
|
**Импорт deploy.yml:**
|
||||||
|
```yaml
|
||||||
|
- import_playbook: ../../roles/deploy.yml
|
||||||
|
```
|
||||||
|
- **Назначение:** Импорт playbook'а с ролями
|
||||||
|
- **Функция:** Разделение логики подготовки и выполнения ролей
|
||||||
|
|
||||||
|
## 🎯 Preset файлы
|
||||||
|
|
||||||
|
### `molecule/presets/minimal.yml` - Минимальный preset
|
||||||
|
|
||||||
|
**Назначение:** Быстрое тестирование с одним хостом.
|
||||||
|
|
||||||
|
**Характеристики:**
|
||||||
|
- **Количество хостов:** 1
|
||||||
|
- **ОС:** Debian
|
||||||
|
- **Группы:** test
|
||||||
|
- **Использование:** Быстрая проверка ролей
|
||||||
|
|
||||||
|
### `molecule/presets/performance.yml` - Performance preset
|
||||||
|
|
||||||
|
**Назначение:** Нагрузочное тестирование с множеством хостов.
|
||||||
|
|
||||||
|
**Характеристики:**
|
||||||
|
- **Количество хостов:** 12
|
||||||
|
- **Серверы:** 5 узлов (web, app)
|
||||||
|
- **База данных:** 3 узла
|
||||||
|
- **Кэш:** 3 узла Redis
|
||||||
|
- **Load balancer:** 1 узел HAProxy
|
||||||
|
- **DinD:** 1 узел для Docker Compose
|
||||||
|
|
||||||
|
**Группы:**
|
||||||
|
- `servers` - веб-серверы
|
||||||
|
- `database` - базы данных
|
||||||
|
- `cache` - кэш серверы
|
||||||
|
- `loadbalancer` - балансировщик нагрузки
|
||||||
|
- `apps` - приложения
|
||||||
|
|
||||||
|
### `molecule/presets/security.yml` - Security preset
|
||||||
|
|
||||||
|
**Назначение:** Тестирование безопасности с изолированными сетями.
|
||||||
|
|
||||||
|
**Характеристики:**
|
||||||
|
- **Количество хостов:** 10
|
||||||
|
- **Bastion хосты:** 2 (точки входа)
|
||||||
|
- **Внутренние серверы:** 3
|
||||||
|
- **База данных:** 2 (изолированная сеть)
|
||||||
|
- **Мониторинг:** 2
|
||||||
|
- **Firewall:** 2
|
||||||
|
- **DOoD:** 1 для Docker безопасности
|
||||||
|
|
||||||
|
**Группы:**
|
||||||
|
- `bastion` - точки входа
|
||||||
|
- `internal` - внутренние серверы
|
||||||
|
- `database` - базы данных
|
||||||
|
- `monitoring` - мониторинг
|
||||||
|
- `firewall` - сетевые компоненты
|
||||||
|
- `security` - компоненты безопасности
|
||||||
|
|
||||||
|
## 🚀 Использование
|
||||||
|
|
||||||
|
### Базовые команды:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Тестирование с минимальным preset'ом
|
||||||
|
make role test minimal
|
||||||
|
|
||||||
|
# Тестирование с performance preset'ом
|
||||||
|
make role test performance
|
||||||
|
|
||||||
|
# Тестирование с security preset'ом
|
||||||
|
make role test security
|
||||||
|
|
||||||
|
# Тестирование конкретной роли
|
||||||
|
make role test minimal ping
|
||||||
|
|
||||||
|
# Тестирование без preset'а (используются fallback значения)
|
||||||
|
make role test
|
||||||
|
|
||||||
|
# Тестирование с несуществующим preset'ом (используются fallback значения)
|
||||||
|
MOLECULE_PRESET=nonexistent make role test
|
||||||
|
```
|
||||||
|
|
||||||
|
### Продвинутое использование:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Тестирование с кастомным preset'ом
|
||||||
|
MOLECULE_PRESET=custom make role test
|
||||||
|
|
||||||
|
# Отладка с подробным выводом
|
||||||
|
make role test minimal --verbose
|
||||||
|
|
||||||
|
# Проверка только создания контейнеров
|
||||||
|
molecule create -s default
|
||||||
|
|
||||||
|
# Проверка только выполнения ролей
|
||||||
|
molecule converge -s default
|
||||||
|
|
||||||
|
# Проверка только верификации
|
||||||
|
molecule verify -s default
|
||||||
|
|
||||||
|
# Очистка контейнеров
|
||||||
|
molecule destroy -s default
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 Настройка
|
||||||
|
|
||||||
|
### Создание собственного preset'а:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# molecule/presets/custom.yml
|
||||||
|
---
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
|
||||||
|
images:
|
||||||
|
ubuntu: "inecs/ansible-lab:ubuntu-latest"
|
||||||
|
rhel: "inecs/ansible-lab:rhel-latest"
|
||||||
|
|
||||||
|
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: ubuntu
|
||||||
|
groups: [web, servers]
|
||||||
|
publish: ["80:80"]
|
||||||
|
- name: db1
|
||||||
|
family: rhel
|
||||||
|
groups: [database, internal]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Использование fallback значений:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Тестирование без preset'а (используются fallback значения из create.yml)
|
||||||
|
make role test
|
||||||
|
|
||||||
|
# Тестирование с несуществующим preset'ом (используются fallback значения)
|
||||||
|
MOLECULE_PRESET=nonexistent make role test
|
||||||
|
|
||||||
|
# Проверка fallback значений
|
||||||
|
molecule create -s default --debug
|
||||||
|
```
|
||||||
|
|
||||||
|
### Использование кастомного preset'а:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
MOLECULE_PRESET=custom make role test
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🐛 Troubleshooting
|
||||||
|
|
||||||
|
### Проблемы с контейнерами:
|
||||||
|
|
||||||
|
**Ошибка:** Контейнер не запускается
|
||||||
|
**Решение:** Проверить доступность Docker образа и ресурсы системы
|
||||||
|
|
||||||
|
**Ошибка:** Systemd не работает
|
||||||
|
**Решение:** Убедиться что контейнер запущен с `privileged: true` и правильными volumes
|
||||||
|
|
||||||
|
**Ошибка:** Сетевое взаимодействие не работает
|
||||||
|
**Решение:** Проверить создание Docker сети и настройки firewall
|
||||||
|
|
||||||
|
### Проблемы с preset файлами:
|
||||||
|
|
||||||
|
**Ошибка:** Preset файл не найден
|
||||||
|
**Решение:** Система автоматически использует fallback значения из `create.yml`
|
||||||
|
|
||||||
|
**Ошибка:** Неправильная конфигурация preset'а
|
||||||
|
**Решение:** Проверить синтаксис YAML и доступность образов в preset файле
|
||||||
|
|
||||||
|
**Ошибка:** Preset файл не загружается
|
||||||
|
**Решение:** Убедиться что файл находится в `molecule/presets/` и имеет правильное имя
|
||||||
|
|
||||||
|
### Проблемы с ролями:
|
||||||
|
|
||||||
|
**Ошибка:** Роль не найдена
|
||||||
|
**Решение:** Проверить путь к роли в `roles/deploy.yml`
|
||||||
|
|
||||||
|
**Ошибка:** Ошибка выполнения роли
|
||||||
|
**Решение:** Проверить совместимость роли с ОС и зависимости
|
||||||
|
|
||||||
|
### Проблемы с vault:
|
||||||
|
|
||||||
|
**Ошибка:** Не удается расшифровать vault файлы
|
||||||
|
**Решение:** Проверить наличие файла `.vault` и правильность пароля
|
||||||
|
|
||||||
|
**Ошибка:** Vault файлы остались расшифрованными
|
||||||
|
**Решение:** Проверить права доступа и настройки vault
|
||||||
|
|
||||||
|
## 📊 Мониторинг
|
||||||
|
|
||||||
|
### Логи выполнения:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Просмотр логов Molecule
|
||||||
|
molecule test -s default --debug
|
||||||
|
|
||||||
|
# Логи конкретного этапа
|
||||||
|
molecule create -s default --debug
|
||||||
|
molecule converge -s default --debug
|
||||||
|
molecule verify -s default --debug
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка состояния:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Статус контейнеров
|
||||||
|
docker ps
|
||||||
|
|
||||||
|
# Статус сети
|
||||||
|
docker network ls
|
||||||
|
|
||||||
|
# Статус volumes
|
||||||
|
docker volume ls
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🎯 Лучшие практики
|
||||||
|
|
||||||
|
1. **Используйте подходящие preset'ы** для разных типов тестирования
|
||||||
|
2. **Проверяйте совместимость ролей** с различными ОС
|
||||||
|
3. **Используйте теги** для разделения задач в ролях
|
||||||
|
4. **Документируйте зависимости** ролей
|
||||||
|
5. **Тестируйте на разных preset'ах** перед коммитом
|
||||||
|
6. **Используйте vault** для секретных данных
|
||||||
|
7. **Очищайте ресурсы** после тестирования
|
||||||
|
8. **Используйте fallback значения** для быстрого старта без preset'ов
|
||||||
|
9. **Проверяйте доступность образов** перед созданием preset'ов
|
||||||
|
10. **Документируйте кастомные preset'ы** для команды
|
||||||
|
|
||||||
|
## 🔗 Связанные файлы
|
||||||
|
|
||||||
|
- `roles/deploy.yml` - playbook с ролями
|
||||||
|
- `inventory/hosts.ini` - статический инвентори
|
||||||
|
- `vault/.vault` - пароль для vault
|
||||||
|
- `requirements.yml` - зависимости Ansible
|
||||||
|
- `Makefile` - команды для запуска тестов
|
||||||
593
docs/monitoring.md
Normal file
593
docs/monitoring.md
Normal file
@@ -0,0 +1,593 @@
|
|||||||
|
# Мониторинг и диагностика AnsibleLab
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
|
|
||||||
|
## 🔍 Диагностика Docker
|
||||||
|
|
||||||
|
### Проверка состояния Docker
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка статуса Docker
|
||||||
|
docker info
|
||||||
|
|
||||||
|
# Проверка запущенных контейнеров
|
||||||
|
docker ps -a
|
||||||
|
|
||||||
|
# Проверка образов
|
||||||
|
docker images | grep inecs/ansible-lab
|
||||||
|
|
||||||
|
# Проверка сетей
|
||||||
|
docker network ls
|
||||||
|
```
|
||||||
|
|
||||||
|
### Диагностика buildx проблем
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Диагностика buildx
|
||||||
|
make docker diagnose
|
||||||
|
|
||||||
|
# Проверка builder'а
|
||||||
|
make docker setup-builder
|
||||||
|
|
||||||
|
# Сброс builder'а при проблемах
|
||||||
|
make docker reset-builder
|
||||||
|
```
|
||||||
|
|
||||||
|
### Логи Docker
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Логи Docker daemon
|
||||||
|
sudo journalctl -u docker.service
|
||||||
|
|
||||||
|
# Логи конкретного контейнера
|
||||||
|
docker logs ansible-controller
|
||||||
|
|
||||||
|
# Логи с временными метками
|
||||||
|
docker logs -t ansible-controller
|
||||||
|
|
||||||
|
# Следить за логами в реальном времени
|
||||||
|
docker logs -f ansible-controller
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧪 Диагностика тестирования
|
||||||
|
|
||||||
|
### Проверка preset'ов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Список доступных preset'ов
|
||||||
|
make presets list
|
||||||
|
|
||||||
|
# Информация о конкретном preset'е
|
||||||
|
make presets info PRESET=default
|
||||||
|
|
||||||
|
# Проверка файлов preset'ов
|
||||||
|
ls -la molecule/presets/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка инвентори
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка тестового инвентори
|
||||||
|
cat ${MOLECULE_EPHEMERAL_DIRECTORY}/inventory/hosts.ini
|
||||||
|
|
||||||
|
# Проверка продакшн инвентори
|
||||||
|
cat inventory/hosts.ini
|
||||||
|
|
||||||
|
# Тестирование подключения
|
||||||
|
ansible all -i inventory/hosts.ini -m ping
|
||||||
|
```
|
||||||
|
|
||||||
|
### Логи тестирования
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Логи Molecule
|
||||||
|
ls -la molecule/default/.molecule/
|
||||||
|
|
||||||
|
# Логи конкретного теста
|
||||||
|
cat molecule/default/.molecule/test/ansible.log
|
||||||
|
|
||||||
|
# Логи Ansible
|
||||||
|
cat molecule/default/.molecule/test/ansible.log | grep ERROR
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 Мониторинг производительности
|
||||||
|
|
||||||
|
### Мониторинг ресурсов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Использование CPU и памяти
|
||||||
|
docker stats
|
||||||
|
|
||||||
|
# Использование диска
|
||||||
|
df -h
|
||||||
|
|
||||||
|
# Использование памяти
|
||||||
|
free -h
|
||||||
|
|
||||||
|
# Процессы Docker
|
||||||
|
ps aux | grep docker
|
||||||
|
```
|
||||||
|
|
||||||
|
### Мониторинг сети
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Статистика сети
|
||||||
|
docker network inspect labnet
|
||||||
|
|
||||||
|
# Подключения к портам
|
||||||
|
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
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 Диагностика ролей
|
||||||
|
|
||||||
|
### Проверка синтаксиса
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Lint проверка всех ролей
|
||||||
|
make role lint
|
||||||
|
|
||||||
|
# Lint проверка конкретной роли
|
||||||
|
ansible-lint roles/my-role/
|
||||||
|
|
||||||
|
# Проверка синтаксиса YAML
|
||||||
|
ansible-playbook --syntax-check roles/my-role/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
|
||||||
|
```
|
||||||
|
|
||||||
|
### Тестирование ролей
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Тестирование с verbose выводом
|
||||||
|
ansible-playbook -i inventory/hosts.ini site.yml -vvv
|
||||||
|
|
||||||
|
# Тестирование конкретной роли
|
||||||
|
ansible-playbook -i inventory/hosts.ini site.yml --tags my-role
|
||||||
|
|
||||||
|
# Тестирование с dry-run
|
||||||
|
ansible-playbook -i inventory/hosts.ini site.yml --check
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚨 Алерты и уведомления
|
||||||
|
|
||||||
|
### Настройка алертов
|
||||||
|
|
||||||
|
```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
|
||||||
|
sudo systemctl status docker
|
||||||
|
|
||||||
|
# Запуск Docker
|
||||||
|
sudo systemctl start docker
|
||||||
|
|
||||||
|
# Проверка логов
|
||||||
|
sudo journalctl -u docker.service
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2. Образы не собираются
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка builder'а
|
||||||
|
make docker diagnose
|
||||||
|
|
||||||
|
# Сброс builder'а
|
||||||
|
make docker reset-builder
|
||||||
|
|
||||||
|
# Очистка кеша
|
||||||
|
make docker clean
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 3. Тесты не проходят
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка preset'ов
|
||||||
|
make presets list
|
||||||
|
|
||||||
|
# Проверка инвентори
|
||||||
|
cat ${MOLECULE_EPHEMERAL_DIRECTORY}/inventory/hosts.ini
|
||||||
|
|
||||||
|
# Проверка логов
|
||||||
|
docker logs ansible-controller
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 4. Роли не работают
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка синтаксиса
|
||||||
|
make role lint
|
||||||
|
|
||||||
|
# Проверка переменных
|
||||||
|
ansible-inventory --list -i inventory/hosts.ini
|
||||||
|
|
||||||
|
# Тестирование с verbose
|
||||||
|
ansible-playbook -i inventory/hosts.ini site.yml -vvv
|
||||||
|
```
|
||||||
|
|
||||||
|
### Логи для отладки
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Сбор всех логов
|
||||||
|
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
|
||||||
|
|
||||||
|
# Логи системы
|
||||||
|
df -h > debug-logs/disk-usage.txt
|
||||||
|
free -h > debug-logs/memory-usage.txt
|
||||||
|
ps aux > debug-logs/processes.txt
|
||||||
|
|
||||||
|
# Логи Ansible
|
||||||
|
ansible --version > debug-logs/ansible-version.txt
|
||||||
|
ansible-galaxy list > debug-logs/ansible-galaxy.txt
|
||||||
|
|
||||||
|
# Логи ролей
|
||||||
|
find roles/ -name "*.yml" -exec ansible-playbook --syntax-check {} \; > debug-logs/roles-syntax.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 Дашборд мониторинга
|
||||||
|
|
||||||
|
### Простой дашборд
|
||||||
|
|
||||||
|
```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 "=========================="
|
||||||
|
```
|
||||||
|
|
||||||
|
### Веб-дашборд
|
||||||
|
|
||||||
|
```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
|
||||||
|
|
||||||
|
echo "🔧 Настройка мониторинга..."
|
||||||
|
|
||||||
|
# Создание директорий
|
||||||
|
mkdir -p {scripts,metrics,reports,debug-logs}
|
||||||
|
|
||||||
|
# Создание скрипта мониторинга
|
||||||
|
cat > scripts/monitor.sh << 'EOF'
|
||||||
|
#!/bin/bash
|
||||||
|
# Скрипт мониторинга AnsibleLab
|
||||||
|
|
||||||
|
# Проверка 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
|
||||||
|
|
||||||
|
echo "✅ Мониторинг завершен"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Создание скрипта сбора метрик
|
||||||
|
cat > scripts/collect-metrics.sh << 'EOF'
|
||||||
|
#!/bin/bash
|
||||||
|
# Сбор метрик AnsibleLab
|
||||||
|
|
||||||
|
echo "📊 Сбор метрик..."
|
||||||
|
|
||||||
|
# Метрики Docker
|
||||||
|
docker info > metrics/docker-info.txt
|
||||||
|
docker images > metrics/docker-images.txt
|
||||||
|
|
||||||
|
# Метрики системы
|
||||||
|
df -h > metrics/disk-usage.txt
|
||||||
|
free -h > metrics/memory-usage.txt
|
||||||
|
|
||||||
|
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 "✅ Мониторинг настроен"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
148
docs/platform-support.md
Normal file
148
docs/platform-support.md
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
# Поддержка платформ в пресетах
|
||||||
|
|
||||||
|
## Автор
|
||||||
|
Сергей Антропов
|
||||||
|
Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
## Описание
|
||||||
|
|
||||||
|
Начиная с версии 1.0, Molecule Template поддерживает указание конкретных платформ для хостов в пресетах. Это позволяет автоматически фильтровать хосты, которые не поддерживаются на текущей архитектуре системы.
|
||||||
|
|
||||||
|
## Обязательные требования
|
||||||
|
|
||||||
|
**Для Astra Linux и RedOS** во всех пресетах **обязательно** должно быть указано `supported_platforms: ["linux/amd64"]`, так как эти системы не поддерживают arm64 архитектуру. Без этого указания могут возникать ошибки при запуске на ARM-системах.
|
||||||
|
|
||||||
|
## Как это работает
|
||||||
|
|
||||||
|
### Определение платформы
|
||||||
|
|
||||||
|
Система автоматически определяет архитектуру хоста при запуске:
|
||||||
|
- `x86_64` → `linux/amd64`
|
||||||
|
- `aarch64` / `arm64` → `linux/arm64`
|
||||||
|
- `armv7l` → `linux/arm/v7`
|
||||||
|
|
||||||
|
### Синтаксис в пресетах
|
||||||
|
|
||||||
|
В файлах пресетов (molecule/presets/*.yml) можно указать поле `supported_platforms` для каждого хоста:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
hosts:
|
||||||
|
- name: ubuntu-test
|
||||||
|
family: ubuntu
|
||||||
|
groups: [test]
|
||||||
|
# Без supported_platforms - работает на всех платформах
|
||||||
|
publish:
|
||||||
|
- "8080:80"
|
||||||
|
|
||||||
|
- name: astra-test
|
||||||
|
family: astra
|
||||||
|
groups: [test]
|
||||||
|
supported_platforms: ["linux/amd64"] # Только amd64
|
||||||
|
publish:
|
||||||
|
- "8083:80"
|
||||||
|
|
||||||
|
- name: multi-test
|
||||||
|
family: ubuntu
|
||||||
|
groups: [test]
|
||||||
|
supported_platforms: ["linux/amd64", "linux/arm64"] # Несколько платформ
|
||||||
|
publish:
|
||||||
|
- "8084:80"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Правила фильтрации
|
||||||
|
|
||||||
|
1. **Если `supported_platforms` не указано** - хост будет запущен на всех платформах
|
||||||
|
2. **Если `supported_platforms: ["linux/amd64"]`** - хост запустится только на amd64
|
||||||
|
3. **Если `supported_platforms: ["linux/amd64", "linux/arm64"]`** - хост запустится на обеих платформах
|
||||||
|
|
||||||
|
### Примеры использования
|
||||||
|
|
||||||
|
#### Универсальный хост (работает везде)
|
||||||
|
```yaml
|
||||||
|
- name: universal-test
|
||||||
|
family: ubuntu
|
||||||
|
groups: [test]
|
||||||
|
# supported_platforms не указано = работает на всех платформах
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Только для amd64
|
||||||
|
```yaml
|
||||||
|
- name: amd64-only-test
|
||||||
|
family: astra
|
||||||
|
groups: [test]
|
||||||
|
supported_platforms: ["linux/amd64"]
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Для нескольких платформ
|
||||||
|
```yaml
|
||||||
|
- name: multi-platform-test
|
||||||
|
family: debian
|
||||||
|
groups: [test]
|
||||||
|
supported_platforms: ["linux/amd64", "linux/arm64"]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Реализация
|
||||||
|
|
||||||
|
Фильтрация происходит в файле `molecule/default/create.yml`:
|
||||||
|
|
||||||
|
1. Система определяет текущую платформу
|
||||||
|
2. Загружается пресет
|
||||||
|
3. Хосты фильтруются по `supported_platforms`
|
||||||
|
4. Отображается количество хостов для текущей платформы
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Фильтрация хостов по поддерживаемым платформам
|
||||||
|
- name: Filter hosts by supported platforms
|
||||||
|
set_fact:
|
||||||
|
filtered_hosts: "{{ filtered_hosts | default([]) + [item] }}"
|
||||||
|
loop: "{{ hosts }}"
|
||||||
|
when: |
|
||||||
|
item.supported_platforms is not defined or
|
||||||
|
ansible_architecture in item.supported_platforms
|
||||||
|
```
|
||||||
|
|
||||||
|
## Текущее состояние
|
||||||
|
|
||||||
|
### Хосты с ограничениями по платформе
|
||||||
|
|
||||||
|
- **Astra Linux** - только `linux/amd64` (нет нативной поддержки arm64)
|
||||||
|
- Во всех пресетах имеет `supported_platforms: ["linux/amd64"]`
|
||||||
|
- Базовый образ `registry.astralinux.ru/library/astra/ubi17:1.7.6.uu2` доступен только для amd64
|
||||||
|
|
||||||
|
- **RedOS** - только `linux/amd64` (нет нативной поддержки arm64)
|
||||||
|
- Во всех пресетах имеет `supported_platforms: ["linux/amd64"]`
|
||||||
|
- Базовый образ `registry.red-soft.ru/ubi7/ubi` доступен только для amd64
|
||||||
|
|
||||||
|
**Важно:** При запуске на arm64 системе эти хосты будут автоматически исключены из списка, что предотвратит ошибки при сборке и запуске контейнеров.
|
||||||
|
|
||||||
|
### Универсальные хосты
|
||||||
|
|
||||||
|
Следующие системы работают на всех платформах:
|
||||||
|
- Ubuntu 20.04, 22.04, 24.04
|
||||||
|
- Debian 9, 10, 11, 12
|
||||||
|
- Alt Linux
|
||||||
|
- CentOS 7, 8, 9
|
||||||
|
- RHEL
|
||||||
|
- AlmaLinux
|
||||||
|
- Rocky Linux
|
||||||
|
|
||||||
|
## Примеры запуска
|
||||||
|
|
||||||
|
### На amd64 (все 9 хостов)
|
||||||
|
```bash
|
||||||
|
make role test all-images
|
||||||
|
# Platform linux/amd64: 9 hosts will be deployed
|
||||||
|
```
|
||||||
|
|
||||||
|
### На arm64 (7 хостов, без Astra и RedOS)
|
||||||
|
```bash
|
||||||
|
make role test all-images
|
||||||
|
# Platform linux/arm64: 7 hosts will be deployed
|
||||||
|
```
|
||||||
|
|
||||||
|
## Дополнительная информация
|
||||||
|
|
||||||
|
- Все образы загружаются с принудительным указанием платформы
|
||||||
|
- Система автоматически адаптирует количество контейнеров под текущую платформу
|
||||||
|
- Информация о количестве хостов отображается при запуске
|
||||||
|
|
||||||
183
docs/presets-by-os.md
Normal file
183
docs/presets-by-os.md
Normal file
@@ -0,0 +1,183 @@
|
|||||||
|
# Пресеты по операционным системам
|
||||||
|
|
||||||
|
Этот документ описывает специализированные пресеты для тестирования на конкретных версиях операционных систем.
|
||||||
|
|
||||||
|
## 🐧 Ubuntu пресеты
|
||||||
|
|
||||||
|
### ubuntu-all.yml
|
||||||
|
**Описание:** Пресет со всеми версиями Ubuntu (20.04, 22.04, 24.04)
|
||||||
|
**Хосты:** 6 хостов (по 2 на каждую версию)
|
||||||
|
**Порты:** 8020-8025
|
||||||
|
**Использование:**
|
||||||
|
```bash
|
||||||
|
make role test ubuntu-all
|
||||||
|
```
|
||||||
|
|
||||||
|
### ubuntu20.yml
|
||||||
|
**Описание:** Пресет для Ubuntu 20.04 LTS
|
||||||
|
**Хосты:** 3 хоста (web, db, app)
|
||||||
|
**Порты:** 8020-8022
|
||||||
|
**Использование:**
|
||||||
|
```bash
|
||||||
|
make role test ubuntu20
|
||||||
|
```
|
||||||
|
|
||||||
|
### ubuntu22.yml
|
||||||
|
**Описание:** Пресет для Ubuntu 22.04 LTS
|
||||||
|
**Хосты:** 3 хоста (web, db, app)
|
||||||
|
**Порты:** 8220-8222
|
||||||
|
**Использование:**
|
||||||
|
```bash
|
||||||
|
make role test ubuntu22
|
||||||
|
```
|
||||||
|
|
||||||
|
### ubuntu24.yml
|
||||||
|
**Описание:** Пресет для Ubuntu 24.04 LTS
|
||||||
|
**Хосты:** 3 хоста (web, db, app)
|
||||||
|
**Порты:** 8240-8242
|
||||||
|
**Использование:**
|
||||||
|
```bash
|
||||||
|
make role test ubuntu24
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🐧 Debian пресеты
|
||||||
|
|
||||||
|
### debian-all.yml
|
||||||
|
**Описание:** Пресет со всеми версиями Debian (9, 10, 11, 12)
|
||||||
|
**Хосты:** 8 хостов (по 2 на каждую версию)
|
||||||
|
**Порты:** 9009-9016
|
||||||
|
**Использование:**
|
||||||
|
```bash
|
||||||
|
make role test debian-all
|
||||||
|
```
|
||||||
|
|
||||||
|
### debian9.yml
|
||||||
|
**Описание:** Пресет для Debian 9 Stretch
|
||||||
|
**Хосты:** 3 хоста (web, db, app)
|
||||||
|
**Порты:** 9090-9092
|
||||||
|
**Использование:**
|
||||||
|
```bash
|
||||||
|
make role test debian9
|
||||||
|
```
|
||||||
|
|
||||||
|
### debian10.yml
|
||||||
|
**Описание:** Пресет для Debian 10 Buster
|
||||||
|
**Хосты:** 3 хоста (web, db, app)
|
||||||
|
**Порты:** 9100-9102
|
||||||
|
**Использование:**
|
||||||
|
```bash
|
||||||
|
make role test debian10
|
||||||
|
```
|
||||||
|
|
||||||
|
### debian11.yml
|
||||||
|
**Описание:** Пресет для Debian 11 Bullseye
|
||||||
|
**Хосты:** 3 хоста (web, db, app)
|
||||||
|
**Порты:** 9110-9112
|
||||||
|
**Использование:**
|
||||||
|
```bash
|
||||||
|
make role test debian11
|
||||||
|
```
|
||||||
|
|
||||||
|
### debian12.yml
|
||||||
|
**Описание:** Пресет для Debian 12 Bookworm
|
||||||
|
**Хосты:** 3 хоста (web, db, app)
|
||||||
|
**Порты:** 9120-9122
|
||||||
|
**Использование:**
|
||||||
|
```bash
|
||||||
|
make role test debian12
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🐧 CentOS пресеты
|
||||||
|
|
||||||
|
### centos-all.yml
|
||||||
|
**Описание:** Пресет со всеми версиями CentOS (7, 8, 9)
|
||||||
|
**Хосты:** 6 хостов (по 2 на каждую версию)
|
||||||
|
**Порты:** 7007-7012
|
||||||
|
**Использование:**
|
||||||
|
```bash
|
||||||
|
make role test centos-all
|
||||||
|
```
|
||||||
|
|
||||||
|
### centos7.yml
|
||||||
|
**Описание:** Пресет для CentOS 7
|
||||||
|
**Хосты:** 3 хоста (web, db, app)
|
||||||
|
**Порты:** 7070-7072
|
||||||
|
**Использование:**
|
||||||
|
```bash
|
||||||
|
make role test centos7
|
||||||
|
```
|
||||||
|
|
||||||
|
### centos8.yml
|
||||||
|
**Описание:** Пресет для CentOS 8
|
||||||
|
**Хосты:** 3 хоста (web, db, app)
|
||||||
|
**Порты:** 7080-7082
|
||||||
|
**Использование:**
|
||||||
|
```bash
|
||||||
|
make role test centos8
|
||||||
|
```
|
||||||
|
|
||||||
|
### centos9.yml
|
||||||
|
**Описание:** Пресет для CentOS 9 Stream
|
||||||
|
**Хосты:** 3 хоста (web, db, app)
|
||||||
|
**Порты:** 7090-7092
|
||||||
|
**Использование:**
|
||||||
|
```bash
|
||||||
|
make role test centos9
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 Сравнение пресетов
|
||||||
|
|
||||||
|
| Пресет | ОС | Версии | Хостов | Порты | Назначение |
|
||||||
|
|--------|----|---------|---------|--------|------------|
|
||||||
|
| ubuntu-all | Ubuntu | 20.04, 22.04, 24.04 | 6 | 8020-8025 | Тестирование всех версий Ubuntu |
|
||||||
|
| debian-all | Debian | 9, 10, 11, 12 | 8 | 9009-9016 | Тестирование всех версий Debian |
|
||||||
|
| centos-all | CentOS | 7, 8, 9 | 6 | 7007-7012 | Тестирование всех версий CentOS |
|
||||||
|
| ubuntu20 | Ubuntu | 20.04 | 3 | 8020-8022 | Тестирование Ubuntu 20.04 |
|
||||||
|
| ubuntu22 | Ubuntu | 22.04 | 3 | 8220-8222 | Тестирование Ubuntu 22.04 |
|
||||||
|
| ubuntu24 | Ubuntu | 24.04 | 3 | 8240-8242 | Тестирование Ubuntu 24.04 |
|
||||||
|
| debian9 | Debian | 9 | 3 | 9090-9092 | Тестирование Debian 9 |
|
||||||
|
| debian10 | Debian | 10 | 3 | 9100-9102 | Тестирование Debian 10 |
|
||||||
|
| debian11 | Debian | 11 | 3 | 9110-9112 | Тестирование Debian 11 |
|
||||||
|
| debian12 | Debian | 12 | 3 | 9120-9122 | Тестирование Debian 12 |
|
||||||
|
| centos7 | CentOS | 7 | 3 | 7070-7072 | Тестирование CentOS 7 |
|
||||||
|
| centos8 | CentOS | 8 | 3 | 7080-7082 | Тестирование CentOS 8 |
|
||||||
|
| centos9 | CentOS | 9 | 3 | 7090-7092 | Тестирование CentOS 9 |
|
||||||
|
|
||||||
|
## 🎯 Рекомендации по использованию
|
||||||
|
|
||||||
|
### Для разработки:
|
||||||
|
- Используйте `ubuntu22` или `debian12` для быстрого тестирования
|
||||||
|
- Используйте `ubuntu-all` для проверки совместимости с разными версиями Ubuntu
|
||||||
|
|
||||||
|
### Для продакшена:
|
||||||
|
- Используйте `centos-all` для проверки RHEL-совместимых систем
|
||||||
|
- Используйте `debian-all` для проверки Debian-совместимых систем
|
||||||
|
|
||||||
|
### Для CI/CD:
|
||||||
|
- Используйте отдельные пресеты для изолированного тестирования
|
||||||
|
- Используйте `*-all` пресеты для комплексной проверки совместимости
|
||||||
|
|
||||||
|
## 🔧 Настройка портов
|
||||||
|
|
||||||
|
Все пресеты используют уникальные диапазоны портов:
|
||||||
|
|
||||||
|
### Ubuntu пресеты:
|
||||||
|
- **ubuntu-all:** 8020-8025 (все версии)
|
||||||
|
- **ubuntu20:** 8020-8022
|
||||||
|
- **ubuntu22:** 8220-8222
|
||||||
|
- **ubuntu24:** 8240-8242
|
||||||
|
|
||||||
|
### Debian пресеты:
|
||||||
|
- **debian-all:** 9009-9016 (все версии)
|
||||||
|
- **debian9:** 9090-9092
|
||||||
|
- **debian10:** 9100-9102
|
||||||
|
- **debian11:** 9110-9112
|
||||||
|
- **debian12:** 9120-9122
|
||||||
|
|
||||||
|
### CentOS пресеты:
|
||||||
|
- **centos-all:** 7007-7012 (все версии)
|
||||||
|
- **centos7:** 7070-7072
|
||||||
|
- **centos8:** 7080-7082
|
||||||
|
- **centos9:** 7090-7092
|
||||||
|
|
||||||
|
Это позволяет запускать несколько пресетов одновременно без конфликтов портов.
|
||||||
248
docs/site-yml-guide.md
Normal file
248
docs/site-yml-guide.md
Normal file
@@ -0,0 +1,248 @@
|
|||||||
|
# Руководство по файлу site.yml
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
|
|
||||||
|
## 📋 Описание
|
||||||
|
|
||||||
|
Файл `molecule/default/site.yml` является **универсальным playbook'ом для тестирования Ansible ролей** в контейнерах. Этот файл отвечает за подготовку окружения и установку необходимых утилит внутри контейнеров при запуске тестов.
|
||||||
|
|
||||||
|
## 🎯 Назначение
|
||||||
|
|
||||||
|
### Основные функции:
|
||||||
|
|
||||||
|
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` для запуска ролей
|
||||||
|
- Разделяет логику: `site.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
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔄 Автоматическое обновление
|
||||||
|
|
||||||
|
Файл `site.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` - команды для запуска тестов
|
||||||
99
docs/testing-vs-deployment.md
Normal file
99
docs/testing-vs-deployment.md
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
# Тестирование vs Развертывание
|
||||||
|
|
||||||
|
## Автор: Сергей Антропов
|
||||||
|
## Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
## Различие между тестированием и развертыванием
|
||||||
|
|
||||||
|
### 🧪 Тестирование (molecule)
|
||||||
|
|
||||||
|
**Команда:** `make role test [preset]`
|
||||||
|
|
||||||
|
**Использует:**
|
||||||
|
- Динамический inventory, создаваемый в `molecule/default/create.yml`
|
||||||
|
- Preset файлы из `molecule/presets/`
|
||||||
|
- Docker контейнеры для изоляции тестов
|
||||||
|
- Временные контейнеры (u1, u2, u3)
|
||||||
|
|
||||||
|
**Процесс:**
|
||||||
|
1. Загружается preset конфигурация
|
||||||
|
2. Создаются Docker контейнеры согласно preset
|
||||||
|
3. Генерируется временный inventory файл
|
||||||
|
4. Запускаются тесты на контейнерах
|
||||||
|
5. Контейнеры удаляются после тестов
|
||||||
|
|
||||||
|
**Пример:**
|
||||||
|
```bash
|
||||||
|
make role test standart # Тестирование в 3 контейнерах
|
||||||
|
make role test minimal # Тестирование в 1 контейнере
|
||||||
|
```
|
||||||
|
|
||||||
|
### 🚀 Развертывание (deploy)
|
||||||
|
|
||||||
|
**Команда:** `make role deploy`
|
||||||
|
|
||||||
|
**Использует:**
|
||||||
|
- Статический inventory файл `inventory/hosts.ini`
|
||||||
|
- Реальные серверы
|
||||||
|
- SSH подключение
|
||||||
|
|
||||||
|
**Процесс:**
|
||||||
|
1. Проверяется наличие `inventory/hosts.ini`
|
||||||
|
2. Показывается содержимое inventory
|
||||||
|
3. Запускается dry-run (--check)
|
||||||
|
4. Запрашивается подтверждение
|
||||||
|
5. Выполняется развертывание на реальные серверы
|
||||||
|
|
||||||
|
**Пример:**
|
||||||
|
```bash
|
||||||
|
make role deploy # Развертывание на реальные серверы
|
||||||
|
```
|
||||||
|
|
||||||
|
## Конфигурация
|
||||||
|
|
||||||
|
### Для тестирования
|
||||||
|
- Preset файлы: `molecule/presets/*.yml`
|
||||||
|
- Динамический inventory создается в `create.yml`
|
||||||
|
- Контейнеры: Docker
|
||||||
|
|
||||||
|
### Для развертывания
|
||||||
|
- Inventory файл: `inventory/hosts.ini`
|
||||||
|
- Серверы: Реальные хосты
|
||||||
|
- Подключение: SSH
|
||||||
|
|
||||||
|
## Примеры конфигурации
|
||||||
|
|
||||||
|
### Preset для тестирования (molecule/presets/standart.yml)
|
||||||
|
```yaml
|
||||||
|
hosts:
|
||||||
|
- name: u1
|
||||||
|
family: debian
|
||||||
|
groups: [test]
|
||||||
|
- name: u2
|
||||||
|
family: rhel
|
||||||
|
groups: [test]
|
||||||
|
- name: u3
|
||||||
|
family: debian
|
||||||
|
groups: [test]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Inventory для развертывания (inventory/hosts.ini)
|
||||||
|
```ini
|
||||||
|
[web_servers]
|
||||||
|
web1 ansible_host=192.168.1.10 ansible_user=ubuntu
|
||||||
|
web2 ansible_host=192.168.1.11 ansible_user=ubuntu
|
||||||
|
|
||||||
|
[db_servers]
|
||||||
|
db1 ansible_host=192.168.1.20 ansible_user=ubuntu
|
||||||
|
|
||||||
|
[all:vars]
|
||||||
|
ansible_ssh_private_key_file=~/.ssh/id_rsa
|
||||||
|
ansible_ssh_common_args='-o StrictHostKeyChecking=no'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Рекомендации
|
||||||
|
|
||||||
|
1. **Сначала тестируйте** с помощью `make role test [preset]`
|
||||||
|
2. **Затем развертывайте** с помощью `make role deploy`
|
||||||
|
3. **Используйте разные preset'ы** для разных сценариев тестирования
|
||||||
|
4. **Настройте inventory** для ваших реальных серверов
|
||||||
282
docs/universal-testing.md
Normal file
282
docs/universal-testing.md
Normal file
@@ -0,0 +1,282 @@
|
|||||||
|
# Универсальная система тестирования Ansible ролей
|
||||||
|
|
||||||
|
## Обзор
|
||||||
|
|
||||||
|
Эта система предоставляет универсальную среду для тестирования и деплоя Ansible ролей с поддержкой различных типов контейнеров, автоматической генерации инвентаря и интеграции с Ansible Vault.
|
||||||
|
|
||||||
|
## Основные возможности
|
||||||
|
|
||||||
|
### 🐳 Типы контейнеров
|
||||||
|
|
||||||
|
#### Systemd контейнеры (по умолчанию)
|
||||||
|
- Полная поддержка systemd сервисов
|
||||||
|
- Работа как виртуальные машины
|
||||||
|
- Подходит для тестирования ролей
|
||||||
|
|
||||||
|
#### DinD (Docker-in-Docker)
|
||||||
|
- Изолированный Docker daemon
|
||||||
|
- Подходит для тестирования Docker Compose
|
||||||
|
- Полная изоляция от хостового Docker
|
||||||
|
|
||||||
|
#### DOoD (Docker-out-of-Docker)
|
||||||
|
- Доступ к хостовому Docker daemon
|
||||||
|
- Быстрое тестирование
|
||||||
|
- Подходит для CI/CD
|
||||||
|
|
||||||
|
### 📋 Preset'ы
|
||||||
|
|
||||||
|
#### etcd-patroni
|
||||||
|
- Кластер etcd (5 узлов)
|
||||||
|
- Кластер PostgreSQL с Patroni (3 узла)
|
||||||
|
- HAProxy для балансировки
|
||||||
|
- DinD узел для тестирования
|
||||||
|
|
||||||
|
#### performance
|
||||||
|
- 5 серверов приложений
|
||||||
|
- 3 узла базы данных
|
||||||
|
- 3 узла кэша Redis
|
||||||
|
- Load balancer
|
||||||
|
- DinD узел для тестирования
|
||||||
|
|
||||||
|
#### security
|
||||||
|
- Bastion хосты
|
||||||
|
- Внутренние серверы
|
||||||
|
- Изолированная база данных
|
||||||
|
- Мониторинг и логирование
|
||||||
|
- Firewall компоненты
|
||||||
|
- DOoD узел для тестирования
|
||||||
|
|
||||||
|
#### multi-os
|
||||||
|
- Тестирование на разных ОС
|
||||||
|
- Ubuntu, Debian, RHEL, CentOS
|
||||||
|
- Смешанные конфигурации
|
||||||
|
- DinD узел для тестирования
|
||||||
|
|
||||||
|
### 🔐 Ansible Vault интеграция
|
||||||
|
|
||||||
|
- Автоматическая расшифровка перед тестированием
|
||||||
|
- Безопасное хранение секретов
|
||||||
|
- Автоматическая повторная шифровка после тестирования
|
||||||
|
- Поддержка множественных vault'ов
|
||||||
|
|
||||||
|
## Использование
|
||||||
|
|
||||||
|
### Базовые команды
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Показать все preset'ы
|
||||||
|
make preset-list
|
||||||
|
|
||||||
|
# Информация о preset'е
|
||||||
|
make preset-info PRESET=etcd-patroni
|
||||||
|
|
||||||
|
# Тестирование с preset'ом
|
||||||
|
make preset-test PRESET=etcd-patroni
|
||||||
|
|
||||||
|
# Типы контейнеров
|
||||||
|
make container-types
|
||||||
|
|
||||||
|
# Информация о контейнерах
|
||||||
|
make container-info
|
||||||
|
|
||||||
|
# Проверка vault файлов
|
||||||
|
make vault-check
|
||||||
|
|
||||||
|
# Поиск секретов
|
||||||
|
make vault-scan
|
||||||
|
```
|
||||||
|
|
||||||
|
### Тестирование ролей
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# С default preset
|
||||||
|
make role test
|
||||||
|
|
||||||
|
# С конкретным preset'ом
|
||||||
|
make role test etcd-patroni
|
||||||
|
make role test performance
|
||||||
|
make role test security
|
||||||
|
make role test multi-os
|
||||||
|
```
|
||||||
|
|
||||||
|
### Работа с Ansible Vault
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создать файл секретов
|
||||||
|
make vault create
|
||||||
|
|
||||||
|
# Редактировать секреты
|
||||||
|
make vault edit
|
||||||
|
|
||||||
|
# Показать секреты
|
||||||
|
make vault show
|
||||||
|
|
||||||
|
# Зашифровать файл
|
||||||
|
make vault encrypt
|
||||||
|
|
||||||
|
# Расшифровать файл
|
||||||
|
make vault decrypt
|
||||||
|
```
|
||||||
|
|
||||||
|
## Структура проекта
|
||||||
|
|
||||||
|
```
|
||||||
|
.
|
||||||
|
├── molecule/
|
||||||
|
│ ├── default/
|
||||||
|
│ │ ├── create.yml # Создание контейнеров
|
||||||
|
│ │ ├── destroy.yml # Удаление контейнеров
|
||||||
|
│ │ ├── converge.yml # Запуск плейбуков
|
||||||
|
│ │ └── verify.yml # Проверка результатов
|
||||||
|
│ └── presets/
|
||||||
|
│ ├── etcd-patroni.yml
|
||||||
|
│ ├── performance.yml
|
||||||
|
│ ├── security.yml
|
||||||
|
│ └── multi-os.yml
|
||||||
|
├── files/
|
||||||
|
│ ├── requirements.yml
|
||||||
|
│ └── playbooks/
|
||||||
|
│ └── site.yml
|
||||||
|
├── vault/
|
||||||
|
│ └── secrets.yml
|
||||||
|
└── Makefile
|
||||||
|
```
|
||||||
|
|
||||||
|
## Создание собственных preset'ов
|
||||||
|
|
||||||
|
### Пример preset'а
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
# Пресет для тестирования кластера etcd + PostgreSQL + Patroni
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
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:
|
||||||
|
# Systemd узлы
|
||||||
|
- name: server1
|
||||||
|
family: debian
|
||||||
|
groups: [servers, web]
|
||||||
|
publish: ["80:80"]
|
||||||
|
|
||||||
|
# DinD узел
|
||||||
|
- name: app-dind
|
||||||
|
type: dind
|
||||||
|
groups: [apps, docker]
|
||||||
|
publish: ["8080:8080"]
|
||||||
|
|
||||||
|
# DOoD узел
|
||||||
|
- name: docker-secure
|
||||||
|
type: dood
|
||||||
|
family: debian
|
||||||
|
groups: [docker, security]
|
||||||
|
publish: ["8081:8081"]
|
||||||
|
env:
|
||||||
|
DOCKER_HOST: "unix:///var/run/docker.sock"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Параметры хостов
|
||||||
|
|
||||||
|
- `name` - имя хоста
|
||||||
|
- `family` - семейство ОС (debian, rhel, ubuntu, centos)
|
||||||
|
- `type` - тип контейнера (dind, dood)
|
||||||
|
- `groups` - группы для инвентаря
|
||||||
|
- `publish` - порты для публикации
|
||||||
|
- `env` - переменные окружения
|
||||||
|
- `volumes` - дополнительные тома
|
||||||
|
- `capabilities` - дополнительные возможности
|
||||||
|
|
||||||
|
## Лучшие практики
|
||||||
|
|
||||||
|
### 1. Использование групп
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
hosts:
|
||||||
|
- name: web1
|
||||||
|
groups: [web, servers, production]
|
||||||
|
- name: db1
|
||||||
|
groups: [database, servers, production]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Безопасность
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Используйте Ansible Vault для секретов
|
||||||
|
vault_targets:
|
||||||
|
- /ansible/vault/secrets.yml
|
||||||
|
- /ansible/files/playbooks/group_vars/*/vault.yml
|
||||||
|
- /ansible/files/playbooks/host_vars/*/vault.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Тестирование
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Проверяйте различные сценарии
|
||||||
|
- name: Test web servers
|
||||||
|
hosts: web
|
||||||
|
tasks:
|
||||||
|
- name: Check nginx status
|
||||||
|
systemd:
|
||||||
|
name: nginx
|
||||||
|
state: started
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Проблемы с контейнерами
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверить статус контейнеров
|
||||||
|
make container-info
|
||||||
|
|
||||||
|
# Очистить Docker ресурсы
|
||||||
|
make docker clean
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проблемы с Vault
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверить vault файлы
|
||||||
|
make vault-check
|
||||||
|
|
||||||
|
# Найти потенциальные секреты
|
||||||
|
make vault-scan
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проблемы с preset'ами
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Показать все preset'ы
|
||||||
|
make preset-list
|
||||||
|
|
||||||
|
# Информация о preset'е
|
||||||
|
make preset-info PRESET=имя_пресета
|
||||||
|
```
|
||||||
|
|
||||||
|
## Заключение
|
||||||
|
|
||||||
|
Универсальная система тестирования Ansible ролей предоставляет мощные инструменты для тестирования ролей в различных сценариях. Используйте preset'ы для быстрого создания тестовых сред, различные типы контейнеров для изоляции и Ansible Vault для безопасности.
|
||||||
|
|
||||||
|
Для получения дополнительной информации используйте:
|
||||||
|
- `make help` - общая справка
|
||||||
|
- `make role` - команды для ролей
|
||||||
|
- `make molecule` - команды Molecule
|
||||||
|
- `make vault` - команды Vault
|
||||||
|
|
||||||
249
docs/vault-guide.md
Normal file
249
docs/vault-guide.md
Normal file
@@ -0,0 +1,249 @@
|
|||||||
|
# Руководство по работе с Ansible Vault
|
||||||
|
|
||||||
|
## Автор
|
||||||
|
Сергей Антропов
|
||||||
|
Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
## Описание
|
||||||
|
|
||||||
|
Это руководство описывает работу с зашифрованными секретами в Ansible Vault для проекта AnsibleTemplate.
|
||||||
|
|
||||||
|
## Безопасность
|
||||||
|
|
||||||
|
⚠️ **ВАЖНО**: Зашифрованные файлы содержат секретные данные и должны храниться в безопасности!
|
||||||
|
|
||||||
|
## Команды для работы с Vault
|
||||||
|
|
||||||
|
### Инициализация Vault
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создание файла с паролем для vault
|
||||||
|
make vault init
|
||||||
|
```
|
||||||
|
|
||||||
|
### Основные операции
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создание нового файла секретов
|
||||||
|
make vault create
|
||||||
|
|
||||||
|
# Редактирование существующих секретов
|
||||||
|
make vault edit
|
||||||
|
|
||||||
|
# Просмотр содержимого секретов
|
||||||
|
make vault show
|
||||||
|
|
||||||
|
# Шифрование существующего файла
|
||||||
|
make vault encrypt
|
||||||
|
|
||||||
|
# Расшифровка файла
|
||||||
|
make vault decrypt
|
||||||
|
|
||||||
|
# Смена пароля шифрования
|
||||||
|
make vault rekey
|
||||||
|
|
||||||
|
# Удаление файла секретов
|
||||||
|
make vault delete
|
||||||
|
|
||||||
|
# Проверка vault файлов
|
||||||
|
make vault check
|
||||||
|
```
|
||||||
|
|
||||||
|
## Структура файлов
|
||||||
|
|
||||||
|
```
|
||||||
|
vault/
|
||||||
|
├── .vault # Файл с паролем для vault (НЕ коммитится в git)
|
||||||
|
├── secrets.yml # Зашифрованный файл с секретами
|
||||||
|
└── secrets/ # Директория для незашифрованных секретов
|
||||||
|
└── *.yml # Незашифрованные файлы секретов
|
||||||
|
```
|
||||||
|
|
||||||
|
## Примеры использования
|
||||||
|
|
||||||
|
### 1. Создание нового файла секретов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создать новый файл
|
||||||
|
make vault create
|
||||||
|
# Введите имя файла (без .yml): my-secrets
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Редактирование секретов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Редактировать существующий файл
|
||||||
|
make vault edit
|
||||||
|
# Введите имя файла (без .yml): secrets
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Просмотр секретов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Показать содержимое файла
|
||||||
|
make vault show
|
||||||
|
# Введите имя файла (без .yml): secrets
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Шифрование файла
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Зашифровать незашифрованный файл
|
||||||
|
make vault encrypt
|
||||||
|
# Введите имя файла (без .yml): secrets
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. Расшифровка файла
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Расшифровать файл для редактирования
|
||||||
|
make vault decrypt
|
||||||
|
# Введите имя файла (без .yml): secrets
|
||||||
|
```
|
||||||
|
|
||||||
|
## Использование в Playbook
|
||||||
|
|
||||||
|
### Передача пароля vault
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Запуск playbook с паролем vault
|
||||||
|
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --ask-vault-pass
|
||||||
|
|
||||||
|
# Использование файла с паролем
|
||||||
|
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --vault-password-file vault/.vault
|
||||||
|
```
|
||||||
|
|
||||||
|
### Переменные из vault
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# В playbook
|
||||||
|
- name: "Использование секретов из vault"
|
||||||
|
hosts: all
|
||||||
|
vars_files:
|
||||||
|
- vault/secrets.yml
|
||||||
|
tasks:
|
||||||
|
- name: "Использование SSH ключа"
|
||||||
|
authorized_key:
|
||||||
|
user: "{{ devops_user.name }}"
|
||||||
|
key: "{{ devops_ssh_keys.public_key }}"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Безопасность и лучшие практики
|
||||||
|
|
||||||
|
### 1. Защита пароля vault
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Установка правильных прав на файл пароля
|
||||||
|
chmod 600 vault/.vault
|
||||||
|
|
||||||
|
# Добавление в .gitignore
|
||||||
|
echo "vault/.vault" >> .gitignore
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Ротация паролей
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Смена пароля vault
|
||||||
|
make vault rekey
|
||||||
|
# Введите имя файла (без .yml): secrets
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Резервное копирование
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создание резервной копии зашифрованного файла
|
||||||
|
cp vault/secrets.yml vault/secrets.yml.backup
|
||||||
|
|
||||||
|
# Создание резервной копии пароля
|
||||||
|
cp vault/.vault vault/.vault.backup
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Проверка целостности
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка vault файлов
|
||||||
|
make vault check
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Проблема: "Unable to read source file"
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Убедитесь, что файл существует
|
||||||
|
ls -la vault/*.yml
|
||||||
|
|
||||||
|
# Проверьте права доступа
|
||||||
|
ls -la vault/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проблема: "Vault password not provided"
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Убедитесь, что файл .vault существует
|
||||||
|
ls -la vault/.vault
|
||||||
|
|
||||||
|
# Проверьте содержимое файла
|
||||||
|
cat vault/.vault
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проблема: "Invalid vault password"
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверьте пароль в файле .vault
|
||||||
|
cat vault/.vault
|
||||||
|
|
||||||
|
# Пересоздайте файл пароля
|
||||||
|
rm vault/.vault
|
||||||
|
make vault init
|
||||||
|
```
|
||||||
|
|
||||||
|
## Интеграция с CI/CD
|
||||||
|
|
||||||
|
### GitHub Actions
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# .github/workflows/deploy.yml
|
||||||
|
- name: "Deploy with Vault"
|
||||||
|
run: |
|
||||||
|
echo "${{ secrets.VAULT_PASSWORD }}" > vault/.vault
|
||||||
|
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --vault-password-file vault/.vault
|
||||||
|
```
|
||||||
|
|
||||||
|
### GitLab CI
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# .gitlab-ci.yml
|
||||||
|
deploy:
|
||||||
|
script:
|
||||||
|
- echo "$VAULT_PASSWORD" > vault/.vault
|
||||||
|
- ansible-playbook -i inventory/hosts.ini roles/deploy.yml --vault-password-file vault/.vault
|
||||||
|
```
|
||||||
|
|
||||||
|
## Мониторинг и логирование
|
||||||
|
|
||||||
|
### Проверка статуса vault
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка всех vault файлов
|
||||||
|
make vault check
|
||||||
|
|
||||||
|
# Проверка конкретного файла
|
||||||
|
ansible-vault view vault/secrets.yml --vault-password-file vault/.vault
|
||||||
|
```
|
||||||
|
|
||||||
|
### Логирование операций
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Включение подробного логирования
|
||||||
|
export ANSIBLE_VERBOSITY=4
|
||||||
|
|
||||||
|
# Запуск с логированием
|
||||||
|
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --vault-password-file vault/.vault -vvv
|
||||||
|
```
|
||||||
|
|
||||||
|
## Поддержка
|
||||||
|
|
||||||
|
- 📧 Email: через сайт https://devops.org.ru
|
||||||
|
- 📖 Документация: `docs/`
|
||||||
|
- 🧪 Тесты: `roles/*/tests/`
|
||||||
@@ -1 +0,0 @@
|
|||||||
[all]
|
|
||||||
16
inventory/hosts.ini
Normal file
16
inventory/hosts.ini
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# Инвентори для развертывания на реальные серверы
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
# Примеры серверов (замените на ваши реальные серверы)
|
||||||
|
[web_servers]
|
||||||
|
# web1 ansible_host=192.168.1.10 ansible_user=ubuntu
|
||||||
|
# web2 ansible_host=192.168.1.11 ansible_user=ubuntu
|
||||||
|
|
||||||
|
[db_servers]
|
||||||
|
# db1 ansible_host=192.168.1.20 ansible_user=ubuntu
|
||||||
|
|
||||||
|
[all:vars]
|
||||||
|
# Общие переменные для всех серверов
|
||||||
|
ansible_ssh_private_key_file=~/.ssh/id_rsa
|
||||||
|
ansible_ssh_common_args='-o StrictHostKeyChecking=no'
|
||||||
@@ -1,6 +1,75 @@
|
|||||||
---
|
---
|
||||||
- name: Converge
|
- hosts: localhost
|
||||||
hosts: all
|
gather_facts: false
|
||||||
vars_files:
|
vars:
|
||||||
- ../../vars/secrets.yml
|
# Получаем preset из переменной окружения или используем default
|
||||||
roles:
|
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: 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
|
||||||
|
"
|
||||||
|
|
||||||
|
- 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
|
||||||
284
molecule/default/create.yml
Normal file
284
molecule/default/create.yml
Normal file
@@ -0,0 +1,284 @@
|
|||||||
|
---
|
||||||
|
- hosts: localhost
|
||||||
|
gather_facts: false
|
||||||
|
vars:
|
||||||
|
# Получаем preset из переменной окружения или используем default
|
||||||
|
preset_name: "{{ lookup('env', 'MOLECULE_PRESET') | default('default') }}"
|
||||||
|
preset_file: "/workspace/molecule/presets/{{ preset_name }}.yml"
|
||||||
|
|
||||||
|
# Fallback значения если preset файл не найден
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
images:
|
||||||
|
alt: "inecs/ansible-lab:alt-linux-latest"
|
||||||
|
astra: "inecs/ansible-lab:astra-linux-latest"
|
||||||
|
rhel: "inecs/ansible-lab:rhel-latest"
|
||||||
|
centos: "inecs/ansible-lab:centos-latest"
|
||||||
|
alma: "inecs/ansible-lab:alma-latest"
|
||||||
|
rocky: "inecs/ansible-lab:rocky-latest"
|
||||||
|
redos: "inecs/ansible-lab:redos-latest"
|
||||||
|
ubuntu: "inecs/ansible-lab:ubuntu-latest"
|
||||||
|
debian: "inecs/ansible-lab:debian-latest"
|
||||||
|
systemd_defaults:
|
||||||
|
privileged: true
|
||||||
|
command: "/sbin/init"
|
||||||
|
volumes:
|
||||||
|
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
|
||||||
|
tmpfs: ["/run", "/run/lock"]
|
||||||
|
capabilities: ["SYS_ADMIN"]
|
||||||
|
hosts:
|
||||||
|
- name: u1
|
||||||
|
family: debian
|
||||||
|
groups: [test]
|
||||||
|
|
||||||
|
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: Detect system architecture
|
||||||
|
shell: |
|
||||||
|
arch=$(uname -m)
|
||||||
|
case $arch in
|
||||||
|
x86_64) echo "linux/amd64" ;;
|
||||||
|
aarch64|arm64) echo "linux/arm64" ;;
|
||||||
|
armv7l) echo "linux/arm/v7" ;;
|
||||||
|
*) echo "linux/amd64" ;;
|
||||||
|
esac
|
||||||
|
register: detected_platform
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- name: Set ansible_architecture variable
|
||||||
|
set_fact:
|
||||||
|
ansible_architecture: "{{ detected_platform.stdout }}"
|
||||||
|
|
||||||
|
- name: Load preset configuration
|
||||||
|
include_vars: "{{ preset_file }}"
|
||||||
|
when: preset_file is file
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
# Фильтрация хостов по поддерживаемым платформам
|
||||||
|
- name: Filter hosts by supported platforms
|
||||||
|
set_fact:
|
||||||
|
filtered_hosts: "{{ filtered_hosts | default([]) + [item] }}"
|
||||||
|
loop: "{{ hosts }}"
|
||||||
|
when: |
|
||||||
|
item.supported_platforms is not defined or
|
||||||
|
ansible_architecture in item.supported_platforms
|
||||||
|
|
||||||
|
- name: Update hosts list with filtered results
|
||||||
|
set_fact:
|
||||||
|
hosts: "{{ filtered_hosts | default(hosts) }}"
|
||||||
|
|
||||||
|
- name: Display filtered hosts
|
||||||
|
debug:
|
||||||
|
msg: "Platform {{ ansible_architecture }}: {{ hosts | length }} hosts will be deployed"
|
||||||
|
|
||||||
|
- name: Ensure network exists
|
||||||
|
community.docker.docker_network:
|
||||||
|
name: "{{ docker_network }}"
|
||||||
|
state: present
|
||||||
|
|
||||||
|
# SYSTEMD nodes
|
||||||
|
- name: Pull systemd images with correct platform
|
||||||
|
command: "docker pull --platform {{ ansible_architecture }} {{ 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
|
||||||
|
|
||||||
|
- 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: Start systemd nodes
|
||||||
|
community.docker.docker_container:
|
||||||
|
name: "{{ item.name }}"
|
||||||
|
image: "{{ images[item.family] }}"
|
||||||
|
networks:
|
||||||
|
- name: "{{ docker_network }}"
|
||||||
|
privileged: "{{ systemd_defaults.privileged }}"
|
||||||
|
command: "{{ systemd_defaults.command }}"
|
||||||
|
volumes: "{{ systemd_defaults.volumes | default([]) + (item.volumes | default([])) }}"
|
||||||
|
tmpfs: "{{ systemd_defaults.tmpfs | default([]) }}"
|
||||||
|
capabilities: "{{ systemd_defaults.capabilities | default([]) }}"
|
||||||
|
published_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 }}"
|
||||||
|
state: started
|
||||||
|
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
|
||||||
|
|
||||||
|
# Ожидание стабилизации контейнеров
|
||||||
|
- name: Wait for containers to be ready
|
||||||
|
pause:
|
||||||
|
seconds: 5
|
||||||
|
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"
|
||||||
|
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
|
||||||
|
|
||||||
|
# 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:
|
||||||
|
name: "{{ item.name }}"
|
||||||
|
image: "{{ images[item.family] }}"
|
||||||
|
networks:
|
||||||
|
- name: "{{ 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([])) }}"
|
||||||
|
tmpfs: "{{ systemd_defaults.tmpfs | default([]) }}"
|
||||||
|
capabilities: "{{ systemd_defaults.capabilities | default([]) }}"
|
||||||
|
published_ports: "{{ item.publish | default([]) }}"
|
||||||
|
env: "{{ item.env | default({}) }}"
|
||||||
|
state: started
|
||||||
|
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
|
||||||
|
|
||||||
|
# Build groups map
|
||||||
|
- name: Initialize groups map
|
||||||
|
set_fact:
|
||||||
|
groups_map: {}
|
||||||
|
|
||||||
|
- name: Append hosts to groups
|
||||||
|
set_fact:
|
||||||
|
groups_map: "{{ groups_map | combine({ item_group: (groups_map[item_group] | default([])) + [item_name] }) }}"
|
||||||
|
loop: "{{ hosts | subelements('groups', skip_missing=True) }}"
|
||||||
|
loop_control:
|
||||||
|
label: "{{ item.0.name }}"
|
||||||
|
vars:
|
||||||
|
item_name: "{{ item.0.name }}"
|
||||||
|
item_group: "{{ item.1 }}"
|
||||||
|
|
||||||
|
# Render inventory
|
||||||
|
- name: Render inventory ini
|
||||||
|
set_fact:
|
||||||
|
inv_content: |
|
||||||
|
[all:vars]
|
||||||
|
ansible_connection=community.docker.docker
|
||||||
|
ansible_remote_tmp=/tmp/.ansible-tmp
|
||||||
|
|
||||||
|
{% for group, members in (groups_map | dictsort) %}
|
||||||
|
[{{ group }}]
|
||||||
|
{% for h in members %}{{ h }}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
[all]
|
||||||
|
{% for h in hosts %}{{ h.name }}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{# Группа с Debian-based системами (Debian, Ubuntu, Alt) - используем /usr/bin/python3 #}
|
||||||
|
{% set debian_hosts = [] %}
|
||||||
|
{% for h in hosts %}
|
||||||
|
{% if h.family in ['ubuntu', 'debian', 'alt'] %}
|
||||||
|
{% set _ = debian_hosts.append(h.name) %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% if debian_hosts %}
|
||||||
|
[debian_family:vars]
|
||||||
|
ansible_python_interpreter=/usr/bin/python3
|
||||||
|
|
||||||
|
[debian_family]
|
||||||
|
{% for h in debian_hosts %}{{ h }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{# Группа с RHEL-based системами (RHEL, CentOS, Alma, Rocky, RedOS) #}
|
||||||
|
{% set rhel_hosts = [] %}
|
||||||
|
{% for h in hosts %}
|
||||||
|
{% if h.family in ['rhel', 'centos', 'alma', 'rocky', 'redos'] %}
|
||||||
|
{% set _ = rhel_hosts.append(h.name) %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% if rhel_hosts %}
|
||||||
|
[rhel_family:vars]
|
||||||
|
ansible_python_interpreter=/usr/bin/python3
|
||||||
|
|
||||||
|
[rhel_family]
|
||||||
|
{% for h in rhel_hosts %}{{ h }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{# Astra Linux - используем /usr/bin/python3 #}
|
||||||
|
{% set astra_hosts = [] %}
|
||||||
|
{% for h in hosts %}
|
||||||
|
{% if h.family == 'astra' %}
|
||||||
|
{% set _ = astra_hosts.append(h.name) %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% if astra_hosts %}
|
||||||
|
[astra_family:vars]
|
||||||
|
ansible_python_interpreter=/usr/bin/python3
|
||||||
|
|
||||||
|
[astra_family]
|
||||||
|
{% for h in astra_hosts %}{{ h }}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{# Глобальный fallback для остальных хостов #}
|
||||||
|
[unmatched_hosts:vars]
|
||||||
|
ansible_python_interpreter=auto_silent
|
||||||
|
|
||||||
|
- name: Write inventory file
|
||||||
|
copy:
|
||||||
|
dest: "{{ generated_inventory }}"
|
||||||
|
content: "{{ inv_content }}"
|
||||||
|
mode: "0644"
|
||||||
|
|
||||||
|
- name: Display inventory summary
|
||||||
|
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 }}
|
||||||
@@ -1,8 +1,83 @@
|
|||||||
- name: Destroy containers on interrupt
|
---
|
||||||
hosts: localhost
|
- hosts: localhost
|
||||||
|
gather_facts: false
|
||||||
|
vars:
|
||||||
|
# Получаем preset из переменной окружения или используем default
|
||||||
|
preset_name: "{{ lookup('env', 'MOLECULE_PRESET') | default('default') }}"
|
||||||
|
preset_file: "/workspace/molecule/presets/{{ preset_name }}.yml"
|
||||||
|
|
||||||
|
# Fallback значения если preset файл не найден
|
||||||
|
docker_network: labnet
|
||||||
|
hosts:
|
||||||
|
- name: u1
|
||||||
|
family: debian
|
||||||
|
groups: [test]
|
||||||
|
|
||||||
tasks:
|
tasks:
|
||||||
- name: Ensure containers are destroyed
|
- name: Load preset configuration
|
||||||
docker_container:
|
include_vars: "{{ preset_file }}"
|
||||||
|
when: preset_file is file
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: Stop and remove containers
|
||||||
|
community.docker.docker_container:
|
||||||
name: "{{ item.name }}"
|
name: "{{ item.name }}"
|
||||||
state: absent
|
state: absent
|
||||||
loop: "{{ molecule_yml.platforms }}"
|
force_kill: true
|
||||||
|
cleanup: true
|
||||||
|
loop: "{{ hosts }}"
|
||||||
|
loop_control: { label: "{{ item.name }}" }
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: Force remove any remaining containers
|
||||||
|
shell: |
|
||||||
|
docker ps -a --filter "name={{ item.name }}" --format "{{ '{{' }}.ID{{ '}}' }}" | xargs -r docker rm -f
|
||||||
|
loop: "{{ hosts }}"
|
||||||
|
loop_control: { label: "{{ item.name }}" }
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- 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 }}"
|
||||||
|
state: absent
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: Force cleanup all project containers
|
||||||
|
shell: |
|
||||||
|
# Удаляем все контейнеры из загруженного пресета
|
||||||
|
{% for host in hosts %}
|
||||||
|
docker ps -a --filter "name={{ host.name }}" --format "{{ '{{' }}.ID{{ '}}' }}" | xargs -r docker rm -f 2>/dev/null || true
|
||||||
|
{% endfor %}
|
||||||
|
# Удаляем все контейнеры с образами ansible-lab
|
||||||
|
docker ps -a --filter "ancestor=inecs/ansible-lab" --format "{{ '{{' }}.ID{{ '}}' }}" | xargs -r docker rm -f 2>/dev/null || true
|
||||||
|
# Удаляем все контейнеры с сетью labnet
|
||||||
|
docker ps -a --filter "network=labnet" --format "{{ '{{' }}.ID{{ '}}' }}" | xargs -r docker rm -f 2>/dev/null || true
|
||||||
|
ignore_errors: true
|
||||||
|
vars:
|
||||||
|
# Используем переменную hosts из загруженного пресета
|
||||||
|
hosts: "{{ hosts }}"
|
||||||
|
|
||||||
|
- name: Display cleanup summary
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
🧹 Cleanup Summary:
|
||||||
|
- Removed containers: {{ hosts | length }}
|
||||||
|
- Removed DinD volumes: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list | length }}
|
||||||
|
- Network: {{ docker_network }}
|
||||||
@@ -1,61 +1,73 @@
|
|||||||
---
|
---
|
||||||
dependency:
|
# Универсальная конфигурация Molecule
|
||||||
name: galaxy
|
# Автор: Сергей Антропов
|
||||||
enabled: false
|
# Сайт: https://devops.org.ru
|
||||||
options:
|
|
||||||
requirements-file: requirements.yml
|
|
||||||
|
|
||||||
driver:
|
driver:
|
||||||
name: docker
|
name: docker
|
||||||
|
|
||||||
platforms:
|
platforms:
|
||||||
|
# Платформы будут созданы динамически через preset файлы
|
||||||
|
# Поддержка собственных образов AnsibleLab
|
||||||
|
- name: placeholder
|
||||||
|
image: ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy
|
||||||
|
pre_build_image: true
|
||||||
|
# Собственные образы (будут использоваться через presets)
|
||||||
|
- name: ansible-controller
|
||||||
|
image: inecs/ansible-lab:ansible-controller-latest
|
||||||
|
pre_build_image: true
|
||||||
|
- name: alt-linux
|
||||||
|
image: inecs/ansible-lab:alt-linux-latest
|
||||||
|
pre_build_image: true
|
||||||
|
- name: astra-linux
|
||||||
|
image: inecs/ansible-lab:astra-linux-latest
|
||||||
|
pre_build_image: true
|
||||||
|
- name: redos
|
||||||
|
image: inecs/ansible-lab:redos-latest
|
||||||
|
pre_build_image: true
|
||||||
|
- name: rhel
|
||||||
|
image: inecs/ansible-lab:rhel-latest
|
||||||
|
pre_build_image: true
|
||||||
- name: centos
|
- name: centos
|
||||||
image: "inecs/ansible:centos"
|
image: inecs/ansible-lab:centos-latest
|
||||||
privileged: true
|
pre_build_image: true
|
||||||
|
- name: alma
|
||||||
|
image: inecs/ansible-lab:alma-latest
|
||||||
|
pre_build_image: true
|
||||||
|
- name: rocky
|
||||||
|
image: inecs/ansible-lab:rocky-latest
|
||||||
pre_build_image: true
|
pre_build_image: true
|
||||||
volumes:
|
|
||||||
- /sys/fs/cgroup:/sys/fs/cgroup:ro
|
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
|
||||||
tmpfs:
|
|
||||||
- /tmp
|
|
||||||
- /run
|
|
||||||
- name: ubuntu
|
- name: ubuntu
|
||||||
image: "inecs/ansible:ubuntu"
|
image: inecs/ansible-lab:ubuntu-latest
|
||||||
privileged: true
|
pre_build_image: true
|
||||||
|
- name: debian
|
||||||
|
image: inecs/ansible-lab:debian-latest
|
||||||
pre_build_image: true
|
pre_build_image: true
|
||||||
volumes:
|
|
||||||
- /sys/fs/cgroup:/sys/fs/cgroup:ro
|
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
|
||||||
tmpfs:
|
|
||||||
- /tmp
|
|
||||||
- /run
|
|
||||||
|
|
||||||
provisioner:
|
provisioner:
|
||||||
name: ansible
|
name: ansible
|
||||||
connection_options:
|
config_options:
|
||||||
ansible_connection: docker
|
defaults:
|
||||||
ansible_user: root
|
stdout_callback: yaml
|
||||||
|
remote_tmp: /tmp/.ansible-tmp
|
||||||
|
interpreter_python: auto_silent
|
||||||
env:
|
env:
|
||||||
ANSIBLE_PYTHON_INTERPRETER: /usr/bin/python3
|
ANSIBLE_STDOUT_CALLBACK: yaml
|
||||||
lint:
|
ANSIBLE_REMOTE_TMP: /tmp/.ansible-tmp
|
||||||
name: ansible-lint
|
inventory:
|
||||||
|
links:
|
||||||
|
hosts: "${MOLECULE_EPHEMERAL_DIRECTORY}/inventory/hosts.ini"
|
||||||
|
playbooks:
|
||||||
|
create: create.yml
|
||||||
|
converge: converge.yml
|
||||||
|
destroy: destroy.yml
|
||||||
|
|
||||||
|
dependency:
|
||||||
|
name: galaxy
|
||||||
|
|
||||||
verifier:
|
verifier:
|
||||||
name: ansible
|
name: ansible
|
||||||
|
|
||||||
scenario:
|
lint: |-
|
||||||
name: default
|
set -e
|
||||||
test_sequence:
|
ansible-lint /workspace/roles/
|
||||||
- dependency
|
|
||||||
- cleanup
|
|
||||||
- destroy
|
|
||||||
- syntax
|
|
||||||
- create
|
|
||||||
- prepare
|
|
||||||
- converge
|
|
||||||
- idempotence
|
|
||||||
- side_effect
|
|
||||||
- verify
|
|
||||||
- cleanup
|
|
||||||
- destroy
|
|
||||||
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
- name: Prepare
|
|
||||||
hosts: all
|
|
||||||
tasks:
|
|
||||||
- name: Detect OS family
|
|
||||||
ansible.builtin.setup:
|
|
||||||
gather_subset:
|
|
||||||
- "min"
|
|
||||||
|
|
||||||
- name: Обновляем пакеты для работы с Ansible в RockyLinux (Centos/RedHat)
|
|
||||||
when: ansible_facts['os_family'] == "RedHat"
|
|
||||||
block:
|
|
||||||
- name: Устанавливаем репозиторий AppStream (если его нет)
|
|
||||||
ansible.builtin.raw: dnf config-manager --set-enabled appstream
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: Установить rsync
|
|
||||||
ansible.builtin.raw: dnf install -y rsync
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: Устанавливаем Python 3.8
|
|
||||||
ansible.builtin.raw: dnf install -y python38 python38-pip
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: Обновляем символическую ссылку python3
|
|
||||||
ansible.builtin.raw: alternatives --set python /usr/bin/python3.8
|
|
||||||
changed_when: false
|
|
||||||
# - name: Fix repository URLs
|
|
||||||
# ansible.builtin.command:
|
|
||||||
# cmd: sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
|
|
||||||
# changed_when: false
|
|
||||||
|
|
||||||
# - name: Update baseurl
|
|
||||||
# ansible.builtin.command:
|
|
||||||
# cmd: sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
|
|
||||||
# changed_when: false
|
|
||||||
|
|
||||||
# - name: Install required packages
|
|
||||||
# ansible.builtin.yum:
|
|
||||||
# name:
|
|
||||||
# - epel-release
|
|
||||||
# - python3
|
|
||||||
# - python3-pip
|
|
||||||
# state: present
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
---
|
|
||||||
- name: Prepare
|
|
||||||
hosts: all
|
|
||||||
tasks:
|
|
||||||
- name: Reun verify
|
|
||||||
debug:
|
|
||||||
msg: "Hello, Verify!"
|
|
||||||
216
molecule/default/site.yml
Normal file
216
molecule/default/site.yml
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
---
|
||||||
|
# Универсальный 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
|
||||||
@@ -1,132 +1,123 @@
|
|||||||
---
|
---
|
||||||
# Проверка работы systemd, docker и docker-compose в образах
|
- hosts: localhost
|
||||||
# Автор: Сергей Антропов
|
gather_facts: false
|
||||||
# Сайт: https://devops.org.ru
|
vars:
|
||||||
|
# Получаем preset из переменной окружения или используем default
|
||||||
|
preset_name: "{{ lookup('env', 'MOLECULE_PRESET') | default('default') }}"
|
||||||
|
preset_file: "/workspace/molecule/presets/{{ preset_name }}.yml"
|
||||||
|
|
||||||
|
# Fallback значения если preset файл не найден
|
||||||
|
docker_network: labnet
|
||||||
|
hosts:
|
||||||
|
- name: u1
|
||||||
|
family: debian
|
||||||
|
groups: [test]
|
||||||
|
|
||||||
- name: Verify systemd, docker and docker-compose services
|
|
||||||
hosts: all
|
|
||||||
gather_facts: true
|
|
||||||
tasks:
|
tasks:
|
||||||
- name: Display OS information
|
- name: Load preset configuration
|
||||||
debug:
|
include_vars: "{{ preset_file }}"
|
||||||
msg: "Тестирование на {{ ansible_distribution }} {{ ansible_distribution_version }}"
|
when: preset_file is file
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
- name: Check if systemd is available and running
|
# Проверка systemd узлов
|
||||||
systemd:
|
- name: Check systemd nodes status
|
||||||
name: systemd
|
community.docker.docker_container_exec:
|
||||||
state: started
|
container: "{{ item.name }}"
|
||||||
|
command: systemctl is-system-running
|
||||||
|
loop: "{{ hosts | selectattr('type','undefined') | list }}"
|
||||||
|
loop_control: { label: "{{ item.name }}" }
|
||||||
register: systemd_status
|
register: systemd_status
|
||||||
failed_when: false
|
ignore_errors: true
|
||||||
|
|
||||||
- name: Display systemd status
|
- name: Display systemd nodes status
|
||||||
debug:
|
debug:
|
||||||
msg: "Systemd статус: {{ 'Доступен и запущен' if systemd_status is succeeded else 'Недоступен или не запущен' }}"
|
msg: "Systemd node {{ item.0.name }}: {{ item.1.stdout | default('unknown') }}"
|
||||||
|
loop: "{{ systemd_status.results | default([]) }}"
|
||||||
|
when: systemd_status is defined
|
||||||
|
|
||||||
- name: Check systemd version
|
# Проверка DinD узлов
|
||||||
command: systemd --version
|
- name: Check DinD nodes docker daemon
|
||||||
register: systemd_version
|
community.docker.docker_container_exec:
|
||||||
failed_when: false
|
container: "{{ item.name }}"
|
||||||
changed_when: false
|
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 systemd version
|
- name: Display DinD nodes status
|
||||||
debug:
|
debug:
|
||||||
msg: "Версия systemd: {{ systemd_version.stdout_lines[0] if systemd_version.stdout_lines else 'Не определена' }}"
|
msg: "DinD node {{ item.0.name }}: Docker {{ item.1.stdout | default('not running') }}"
|
||||||
|
loop: "{{ dind_status.results | default([]) }}"
|
||||||
|
when: dind_status is defined
|
||||||
|
|
||||||
- name: Check if docker service exists
|
# Проверка DOoD узлов
|
||||||
stat:
|
- name: Check DOoD nodes docker access
|
||||||
path: /usr/bin/docker
|
community.docker.docker_container_exec:
|
||||||
register: docker_binary
|
container: "{{ item.name }}"
|
||||||
|
command: docker 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: Check if docker service exists (alternative path)
|
- name: Display DOoD nodes status
|
||||||
stat:
|
|
||||||
path: /usr/local/bin/docker
|
|
||||||
register: docker_binary_alt
|
|
||||||
|
|
||||||
- name: Display docker binary status
|
|
||||||
debug:
|
debug:
|
||||||
msg: "Docker binary: {{ 'Найден в /usr/bin/docker' if docker_binary.stat.exists else ('Найден в /usr/local/bin/docker' if docker_binary_alt.stat.exists else 'Не найден') }}"
|
msg: "DOoD 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: Check docker version
|
# Проверка сетевого подключения
|
||||||
command: docker --version
|
- name: Test network connectivity between nodes
|
||||||
register: docker_version
|
community.docker.docker_container_exec:
|
||||||
failed_when: false
|
container: "{{ item.0.name }}"
|
||||||
changed_when: false
|
command: 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
|
||||||
|
register: ping_results
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
- name: Display docker version
|
- name: Display network connectivity results
|
||||||
debug:
|
debug:
|
||||||
msg: "Версия Docker: {{ docker_version.stdout if docker_version.stdout else 'Docker не установлен' }}"
|
msg: "Network test {{ item.0.name }} -> {{ item.1.name }}: {{ 'OK' if item.2.rc == 0 else 'FAILED' }}"
|
||||||
|
loop: "{{ ping_results.results | default([]) }}"
|
||||||
|
when: ping_results is defined
|
||||||
|
|
||||||
- name: Check if docker daemon is running
|
# Проверка портов
|
||||||
command: docker info
|
- name: Check published ports
|
||||||
register: docker_info
|
community.docker.docker_container_exec:
|
||||||
failed_when: false
|
container: "{{ item.name }}"
|
||||||
changed_when: false
|
command: netstat -tlnp
|
||||||
|
loop: "{{ hosts | selectattr('publish','defined') | list }}"
|
||||||
|
loop_control: { label: "{{ item.name }}" }
|
||||||
|
register: port_status
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
- name: Display docker daemon status
|
- name: Display port status
|
||||||
debug:
|
debug:
|
||||||
msg: "Docker daemon: {{ 'Запущен' if docker_info is succeeded else 'Не запущен или недоступен' }}"
|
msg: "Node {{ item.0.name }} ports: {{ item.1.stdout_lines | select('match', 'LISTEN') | list | length }} listening"
|
||||||
|
loop: "{{ port_status.results | default([]) }}"
|
||||||
|
when: port_status is defined
|
||||||
|
|
||||||
- name: Check if docker-compose binary exists
|
# Проверка групп
|
||||||
stat:
|
- name: Display inventory groups
|
||||||
path: /usr/local/bin/docker-compose
|
|
||||||
register: docker_compose_binary
|
|
||||||
|
|
||||||
- name: Check if docker-compose binary exists (alternative path)
|
|
||||||
stat:
|
|
||||||
path: /usr/bin/docker-compose
|
|
||||||
register: docker_compose_binary_alt
|
|
||||||
|
|
||||||
- name: Check if docker compose plugin exists
|
|
||||||
command: docker compose version
|
|
||||||
register: docker_compose_plugin
|
|
||||||
failed_when: false
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: Display docker-compose status
|
|
||||||
debug:
|
|
||||||
msg: "Docker Compose: {{ 'Найден как binary' if docker_compose_binary.stat.exists or docker_compose_binary_alt.stat.exists else ('Найден как plugin' if docker_compose_plugin is succeeded else 'Не найден') }}"
|
|
||||||
|
|
||||||
- name: Display docker-compose version
|
|
||||||
debug:
|
|
||||||
msg: "Версия Docker Compose: {{ docker_compose_plugin.stdout if docker_compose_plugin is succeeded else 'Docker Compose не установлен' }}"
|
|
||||||
|
|
||||||
- name: Test docker functionality
|
|
||||||
command: docker run --rm hello-world
|
|
||||||
register: docker_test
|
|
||||||
failed_when: false
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: Display docker test result
|
|
||||||
debug:
|
|
||||||
msg: "Тест Docker: {{ 'Успешно' if docker_test is succeeded else 'Ошибка - ' + docker_test.stderr }}"
|
|
||||||
|
|
||||||
- name: Check systemd services status
|
|
||||||
command: systemctl list-units --type=service --state=running
|
|
||||||
register: running_services
|
|
||||||
failed_when: false
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: Display running services count
|
|
||||||
debug:
|
|
||||||
msg: "Количество запущенных сервисов: {{ running_services.stdout_lines | length }}"
|
|
||||||
|
|
||||||
- name: Check for docker-related systemd services
|
|
||||||
command: systemctl list-units --type=service | grep -i docker
|
|
||||||
register: docker_services
|
|
||||||
failed_when: false
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: Display docker services
|
|
||||||
debug:
|
|
||||||
msg: "Docker сервисы: {{ docker_services.stdout_lines if docker_services.stdout_lines else 'Не найдены' }}"
|
|
||||||
|
|
||||||
- name: Final summary
|
|
||||||
debug:
|
debug:
|
||||||
msg: |
|
msg: |
|
||||||
========================================
|
📋 Inventory Groups:
|
||||||
РЕЗУЛЬТАТЫ ПРОВЕРКИ ОБРАЗА {{ ansible_distribution }}:
|
{% for group, members in (groups_map | default({}) | dictsort) %}
|
||||||
========================================
|
- {{ group }}: {{ members | join(', ') }}
|
||||||
Systemd: {{ '✓ Работает' if systemd_status is succeeded else '✗ Не работает' }}
|
{% endfor %}
|
||||||
Docker: {{ '✓ Установлен и работает' if docker_info is succeeded else '✗ Не установлен или не работает' }}
|
|
||||||
Docker Compose: {{ '✓ Доступен' if (docker_compose_binary.stat.exists or docker_compose_binary_alt.stat.exists or docker_compose_plugin is succeeded) else '✗ Недоступен' }}
|
# Финальная сводка
|
||||||
========================================
|
- name: Display verification summary
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
✅ Verification Summary:
|
||||||
|
- 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 }}
|
||||||
|
- Groups: {{ groups_map.keys() | list | join(', ') }}
|
||||||
|
- Network: {{ docker_network }}
|
||||||
|
|
||||||
|
|||||||
43
molecule/presets/default.yml
Normal file
43
molecule/presets/default.yml
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
---
|
||||||
|
#description: Стандартный пресет по умолчанию для тестирования с 2 хостами (Ubuntu + Debian)
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: 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"]
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
# Стандартный набор - 2 хоста для базового тестирования (стабильные ОС)
|
||||||
|
- name: u1
|
||||||
|
family: ubuntu22
|
||||||
|
groups: [test, web]
|
||||||
|
- name: u2
|
||||||
|
family: debian12
|
||||||
|
groups: [test, web]
|
||||||
184
molecule/presets/examples/all-images.yml
Normal file
184
molecule/presets/examples/all-images.yml
Normal file
@@ -0,0 +1,184 @@
|
|||||||
|
---
|
||||||
|
#description: Пресет для тестирования всех доступных образов (9 хостов)
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
# Примечание: Astra Linux и RedOS поддерживают только linux/amd64
|
||||||
|
|
||||||
|
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"]
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
# Debian-based системы
|
||||||
|
- name: ubuntu20-test
|
||||||
|
family: ubuntu2220
|
||||||
|
groups: [test, debian, ubuntu]
|
||||||
|
publish:
|
||||||
|
- "8080:80"
|
||||||
|
env:
|
||||||
|
TEST_OS: "Ubuntu 20.04"
|
||||||
|
TEST_FAMILY: "Debian"
|
||||||
|
|
||||||
|
- name: ubuntu22-test
|
||||||
|
family: ubuntu22
|
||||||
|
groups: [test, debian, ubuntu]
|
||||||
|
publish:
|
||||||
|
- "8081:80"
|
||||||
|
env:
|
||||||
|
TEST_OS: "Ubuntu 22.04"
|
||||||
|
TEST_FAMILY: "Debian"
|
||||||
|
|
||||||
|
- name: ubuntu24-test
|
||||||
|
family: ubuntu2224
|
||||||
|
groups: [test, debian, ubuntu]
|
||||||
|
publish:
|
||||||
|
- "8082:80"
|
||||||
|
env:
|
||||||
|
TEST_OS: "Ubuntu 24.04"
|
||||||
|
TEST_FAMILY: "Debian"
|
||||||
|
|
||||||
|
- name: debian9-test
|
||||||
|
family: debian129
|
||||||
|
groups: [test, debian]
|
||||||
|
publish:
|
||||||
|
- "8083:80"
|
||||||
|
env:
|
||||||
|
TEST_OS: "Debian 9"
|
||||||
|
TEST_FAMILY: "Debian"
|
||||||
|
|
||||||
|
- name: debian10-test
|
||||||
|
family: debian1210
|
||||||
|
groups: [test, debian]
|
||||||
|
publish:
|
||||||
|
- "8084:80"
|
||||||
|
env:
|
||||||
|
TEST_OS: "Debian 10"
|
||||||
|
TEST_FAMILY: "Debian"
|
||||||
|
|
||||||
|
- name: debian11-test
|
||||||
|
family: debian1211
|
||||||
|
groups: [test, debian]
|
||||||
|
publish:
|
||||||
|
- "8085:80"
|
||||||
|
env:
|
||||||
|
TEST_OS: "Debian 11"
|
||||||
|
TEST_FAMILY: "Debian"
|
||||||
|
|
||||||
|
- name: debian12-test
|
||||||
|
family: debian12
|
||||||
|
groups: [test, debian]
|
||||||
|
publish:
|
||||||
|
- "8086:80"
|
||||||
|
env:
|
||||||
|
TEST_OS: "Debian 12"
|
||||||
|
TEST_FAMILY: "Debian"
|
||||||
|
|
||||||
|
- name: alt-test
|
||||||
|
family: alt
|
||||||
|
groups: [test, altlinux]
|
||||||
|
publish:
|
||||||
|
- "8082:80"
|
||||||
|
env:
|
||||||
|
TEST_OS: "Alt Linux"
|
||||||
|
TEST_FAMILY: "Altlinux"
|
||||||
|
|
||||||
|
- name: astra-test
|
||||||
|
family: astra
|
||||||
|
groups: [test, astra]
|
||||||
|
supported_platforms: ["linux/amd64"] # Только amd64
|
||||||
|
publish:
|
||||||
|
- "8083:80"
|
||||||
|
env:
|
||||||
|
TEST_OS: "Astra Linux"
|
||||||
|
TEST_FAMILY: "Astra Linux"
|
||||||
|
|
||||||
|
# RHEL-based системы
|
||||||
|
- name: centos7-test
|
||||||
|
family: centos97
|
||||||
|
groups: [test, rhel, centos]
|
||||||
|
publish:
|
||||||
|
- "8090:80"
|
||||||
|
env:
|
||||||
|
TEST_OS: "CentOS 7"
|
||||||
|
TEST_FAMILY: "RedHat"
|
||||||
|
|
||||||
|
- name: centos8-test
|
||||||
|
family: centos98
|
||||||
|
groups: [test, rhel, centos]
|
||||||
|
publish:
|
||||||
|
- "8091:80"
|
||||||
|
env:
|
||||||
|
TEST_OS: "CentOS 8"
|
||||||
|
TEST_FAMILY: "RedHat"
|
||||||
|
|
||||||
|
- name: centos9-test
|
||||||
|
family: centos99
|
||||||
|
groups: [test, rhel, centos]
|
||||||
|
publish:
|
||||||
|
- "8092:80"
|
||||||
|
env:
|
||||||
|
TEST_OS: "CentOS 9"
|
||||||
|
TEST_FAMILY: "RedHat"
|
||||||
|
|
||||||
|
- name: rhel-test
|
||||||
|
family: rhel
|
||||||
|
groups: [test, rhel]
|
||||||
|
publish:
|
||||||
|
- "8085:80"
|
||||||
|
env:
|
||||||
|
TEST_OS: "RHEL"
|
||||||
|
TEST_FAMILY: "RedHat"
|
||||||
|
|
||||||
|
- name: alma-test
|
||||||
|
family: alma
|
||||||
|
groups: [test, rhel]
|
||||||
|
publish:
|
||||||
|
- "8086:80"
|
||||||
|
env:
|
||||||
|
TEST_OS: "AlmaLinux"
|
||||||
|
TEST_FAMILY: "RedHat"
|
||||||
|
|
||||||
|
- name: rocky-test
|
||||||
|
family: rocky
|
||||||
|
groups: [test, rhel]
|
||||||
|
publish:
|
||||||
|
- "8087:80"
|
||||||
|
env:
|
||||||
|
TEST_OS: "Rocky Linux"
|
||||||
|
TEST_FAMILY: "RedHat"
|
||||||
|
|
||||||
|
- name: redos-test
|
||||||
|
family: redos
|
||||||
|
groups: [test, rhel]
|
||||||
|
supported_platforms: ["linux/amd64"] # Только amd64
|
||||||
|
publish:
|
||||||
|
- "8088:80"
|
||||||
|
env:
|
||||||
|
TEST_OS: "RedOS"
|
||||||
|
TEST_FAMILY: "RedHat"
|
||||||
52
molecule/presets/examples/centos-all.yml
Normal file
52
molecule/presets/examples/centos-all.yml
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
---
|
||||||
|
#description: Пресет со всеми версиями CentOS (7, 8, 9)
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
|
||||||
|
# systemd-ready образы CentOS
|
||||||
|
images:
|
||||||
|
centos7: "inecs/ansible-lab:centos7-latest"
|
||||||
|
centos8: "inecs/ansible-lab:centos8-latest"
|
||||||
|
centos9: "inecs/ansible-lab:centos9-latest"
|
||||||
|
|
||||||
|
systemd_defaults:
|
||||||
|
privileged: true
|
||||||
|
command: "/sbin/init"
|
||||||
|
volumes:
|
||||||
|
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
|
||||||
|
tmpfs: ["/run", "/run/lock"]
|
||||||
|
capabilities: ["SYS_ADMIN"]
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
# CentOS 7
|
||||||
|
- name: centos7-1
|
||||||
|
family: centos7
|
||||||
|
groups: [centos, test, web]
|
||||||
|
publish: ["7007:80"]
|
||||||
|
- name: centos7-2
|
||||||
|
family: centos7
|
||||||
|
groups: [centos, test, db]
|
||||||
|
publish: ["7008:80"]
|
||||||
|
|
||||||
|
# CentOS 8
|
||||||
|
- name: centos8-1
|
||||||
|
family: centos8
|
||||||
|
groups: [centos, test, web]
|
||||||
|
publish: ["7009:80"]
|
||||||
|
- name: centos8-2
|
||||||
|
family: centos8
|
||||||
|
groups: [centos, test, db]
|
||||||
|
publish: ["7010:80"]
|
||||||
|
|
||||||
|
# CentOS 9 Stream
|
||||||
|
- name: centos9-1
|
||||||
|
family: centos9
|
||||||
|
groups: [centos, test, web]
|
||||||
|
publish: ["7011:80"]
|
||||||
|
- name: centos9-2
|
||||||
|
family: centos9
|
||||||
|
groups: [centos, test, db]
|
||||||
|
publish: ["7012:80"]
|
||||||
34
molecule/presets/examples/centos7.yml
Normal file
34
molecule/presets/examples/centos7.yml
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
#description: Пресет для CentOS 7
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
|
||||||
|
# systemd-ready образ CentOS 7
|
||||||
|
images:
|
||||||
|
centos7: "inecs/ansible-lab:centos7-latest"
|
||||||
|
|
||||||
|
systemd_defaults:
|
||||||
|
privileged: true
|
||||||
|
command: "/sbin/init"
|
||||||
|
volumes:
|
||||||
|
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
|
||||||
|
tmpfs: ["/run", "/run/lock"]
|
||||||
|
capabilities: ["SYS_ADMIN"]
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
# CentOS 7 хосты
|
||||||
|
- name: centos7-web
|
||||||
|
family: centos7
|
||||||
|
groups: [centos, test, web]
|
||||||
|
publish: ["7070:80"]
|
||||||
|
- name: centos7-db
|
||||||
|
family: centos7
|
||||||
|
groups: [centos, test, db]
|
||||||
|
publish: ["7071:80"]
|
||||||
|
- name: centos7-app
|
||||||
|
family: centos7
|
||||||
|
groups: [centos, test, app]
|
||||||
|
publish: ["7072:80"]
|
||||||
34
molecule/presets/examples/centos8.yml
Normal file
34
molecule/presets/examples/centos8.yml
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
#description: Пресет для CentOS 8
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
|
||||||
|
# systemd-ready образ CentOS 8
|
||||||
|
images:
|
||||||
|
centos8: "inecs/ansible-lab:centos8-latest"
|
||||||
|
|
||||||
|
systemd_defaults:
|
||||||
|
privileged: true
|
||||||
|
command: "/sbin/init"
|
||||||
|
volumes:
|
||||||
|
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
|
||||||
|
tmpfs: ["/run", "/run/lock"]
|
||||||
|
capabilities: ["SYS_ADMIN"]
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
# CentOS 8 хосты
|
||||||
|
- name: centos8-web
|
||||||
|
family: centos8
|
||||||
|
groups: [centos, test, web]
|
||||||
|
publish: ["7080:80"]
|
||||||
|
- name: centos8-db
|
||||||
|
family: centos8
|
||||||
|
groups: [centos, test, db]
|
||||||
|
publish: ["7081:80"]
|
||||||
|
- name: centos8-app
|
||||||
|
family: centos8
|
||||||
|
groups: [centos, test, app]
|
||||||
|
publish: ["7082:80"]
|
||||||
34
molecule/presets/examples/centos9.yml
Normal file
34
molecule/presets/examples/centos9.yml
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
#description: Пресет для CentOS 9 Stream
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
|
||||||
|
# systemd-ready образ CentOS 9
|
||||||
|
images:
|
||||||
|
centos9: "inecs/ansible-lab:centos9-latest"
|
||||||
|
|
||||||
|
systemd_defaults:
|
||||||
|
privileged: true
|
||||||
|
command: "/sbin/init"
|
||||||
|
volumes:
|
||||||
|
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
|
||||||
|
tmpfs: ["/run", "/run/lock"]
|
||||||
|
capabilities: ["SYS_ADMIN"]
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
# CentOS 9 Stream хосты
|
||||||
|
- name: centos9-web
|
||||||
|
family: centos9
|
||||||
|
groups: [centos, test, web]
|
||||||
|
publish: ["7090:80"]
|
||||||
|
- name: centos9-db
|
||||||
|
family: centos9
|
||||||
|
groups: [centos, test, db]
|
||||||
|
publish: ["7091:80"]
|
||||||
|
- name: centos9-app
|
||||||
|
family: centos9
|
||||||
|
groups: [centos, test, app]
|
||||||
|
publish: ["7092:80"]
|
||||||
63
molecule/presets/examples/debian-all.yml
Normal file
63
molecule/presets/examples/debian-all.yml
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
---
|
||||||
|
#description: Пресет со всеми версиями Debian (9, 10, 11, 12)
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
|
||||||
|
# systemd-ready образы Debian
|
||||||
|
images:
|
||||||
|
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:
|
||||||
|
# Debian 9 Stretch
|
||||||
|
- name: debian9-1
|
||||||
|
family: debian9
|
||||||
|
groups: [debian, test, web]
|
||||||
|
publish: ["9009:80"]
|
||||||
|
- name: debian9-2
|
||||||
|
family: debian9
|
||||||
|
groups: [debian, test, db]
|
||||||
|
publish: ["9010:80"]
|
||||||
|
|
||||||
|
# Debian 10 Buster
|
||||||
|
- name: debian10-1
|
||||||
|
family: debian10
|
||||||
|
groups: [debian, test, web]
|
||||||
|
publish: ["9011:80"]
|
||||||
|
- name: debian10-2
|
||||||
|
family: debian10
|
||||||
|
groups: [debian, test, db]
|
||||||
|
publish: ["9012:80"]
|
||||||
|
|
||||||
|
# Debian 11 Bullseye
|
||||||
|
- name: debian11-1
|
||||||
|
family: debian11
|
||||||
|
groups: [debian, test, web]
|
||||||
|
publish: ["9013:80"]
|
||||||
|
- name: debian11-2
|
||||||
|
family: debian11
|
||||||
|
groups: [debian, test, db]
|
||||||
|
publish: ["9014:80"]
|
||||||
|
|
||||||
|
# Debian 12 Bookworm
|
||||||
|
- name: debian12-1
|
||||||
|
family: debian12
|
||||||
|
groups: [debian, test, web]
|
||||||
|
publish: ["9015:80"]
|
||||||
|
- name: debian12-2
|
||||||
|
family: debian12
|
||||||
|
groups: [debian, test, db]
|
||||||
|
publish: ["9016:80"]
|
||||||
34
molecule/presets/examples/debian10.yml
Normal file
34
molecule/presets/examples/debian10.yml
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
#description: Пресет для Debian 10 Buster
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
|
||||||
|
# systemd-ready образ Debian 10
|
||||||
|
images:
|
||||||
|
debian10: "inecs/ansible-lab:debian10-latest"
|
||||||
|
|
||||||
|
systemd_defaults:
|
||||||
|
privileged: true
|
||||||
|
command: "/sbin/init"
|
||||||
|
volumes:
|
||||||
|
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
|
||||||
|
tmpfs: ["/run", "/run/lock"]
|
||||||
|
capabilities: ["SYS_ADMIN"]
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
# Debian 10 Buster хосты
|
||||||
|
- name: debian10-web
|
||||||
|
family: debian10
|
||||||
|
groups: [debian, test, web]
|
||||||
|
publish: ["9100:80"]
|
||||||
|
- name: debian10-db
|
||||||
|
family: debian10
|
||||||
|
groups: [debian, test, db]
|
||||||
|
publish: ["9101:80"]
|
||||||
|
- name: debian10-app
|
||||||
|
family: debian10
|
||||||
|
groups: [debian, test, app]
|
||||||
|
publish: ["9102:80"]
|
||||||
34
molecule/presets/examples/debian11.yml
Normal file
34
molecule/presets/examples/debian11.yml
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
#description: Пресет для Debian 11 Bullseye
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
|
||||||
|
# systemd-ready образ Debian 11
|
||||||
|
images:
|
||||||
|
debian11: "inecs/ansible-lab:debian11-latest"
|
||||||
|
|
||||||
|
systemd_defaults:
|
||||||
|
privileged: true
|
||||||
|
command: "/sbin/init"
|
||||||
|
volumes:
|
||||||
|
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
|
||||||
|
tmpfs: ["/run", "/run/lock"]
|
||||||
|
capabilities: ["SYS_ADMIN"]
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
# Debian 11 Bullseye хосты
|
||||||
|
- name: debian11-web
|
||||||
|
family: debian11
|
||||||
|
groups: [debian, test, web]
|
||||||
|
publish: ["9110:80"]
|
||||||
|
- name: debian11-db
|
||||||
|
family: debian11
|
||||||
|
groups: [debian, test, db]
|
||||||
|
publish: ["9111:80"]
|
||||||
|
- name: debian11-app
|
||||||
|
family: debian11
|
||||||
|
groups: [debian, test, app]
|
||||||
|
publish: ["9112:80"]
|
||||||
34
molecule/presets/examples/debian12.yml
Normal file
34
molecule/presets/examples/debian12.yml
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
#description: Пресет для Debian 12 Bookworm
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
|
||||||
|
# systemd-ready образ Debian 12
|
||||||
|
images:
|
||||||
|
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:
|
||||||
|
# Debian 12 Bookworm хосты
|
||||||
|
- name: debian12-web
|
||||||
|
family: debian12
|
||||||
|
groups: [debian, test, web]
|
||||||
|
publish: ["9120:80"]
|
||||||
|
- name: debian12-db
|
||||||
|
family: debian12
|
||||||
|
groups: [debian, test, db]
|
||||||
|
publish: ["9121:80"]
|
||||||
|
- name: debian12-app
|
||||||
|
family: debian12
|
||||||
|
groups: [debian, test, app]
|
||||||
|
publish: ["9122:80"]
|
||||||
34
molecule/presets/examples/debian9.yml
Normal file
34
molecule/presets/examples/debian9.yml
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
#description: Пресет для Debian 9 Stretch
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
|
||||||
|
# systemd-ready образ Debian 9
|
||||||
|
images:
|
||||||
|
debian9: "inecs/ansible-lab:debian9-latest"
|
||||||
|
|
||||||
|
systemd_defaults:
|
||||||
|
privileged: true
|
||||||
|
command: "/sbin/init"
|
||||||
|
volumes:
|
||||||
|
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
|
||||||
|
tmpfs: ["/run", "/run/lock"]
|
||||||
|
capabilities: ["SYS_ADMIN"]
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
# Debian 9 Stretch хосты
|
||||||
|
- name: debian9-web
|
||||||
|
family: debian9
|
||||||
|
groups: [debian, test, web]
|
||||||
|
publish: ["9090:80"]
|
||||||
|
- name: debian9-db
|
||||||
|
family: debian9
|
||||||
|
groups: [debian, test, db]
|
||||||
|
publish: ["9091:80"]
|
||||||
|
- name: debian9-app
|
||||||
|
family: debian9
|
||||||
|
groups: [debian, test, app]
|
||||||
|
publish: ["9092:80"]
|
||||||
58
molecule/presets/examples/docker-full.yml
Normal file
58
molecule/presets/examples/docker-full.yml
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
---
|
||||||
|
#description: Полный пресет с Docker функциональностью (DinD + DOoD)
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: 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"]
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
# Базовые хосты (стабильные ОС)
|
||||||
|
- name: u1
|
||||||
|
family: ubuntu22
|
||||||
|
groups: [test, web]
|
||||||
|
- name: u2
|
||||||
|
family: debian12
|
||||||
|
groups: [test, web]
|
||||||
|
|
||||||
|
# DinD узел (Docker-in-Docker)
|
||||||
|
- name: docker1
|
||||||
|
type: dind
|
||||||
|
groups: [docker]
|
||||||
|
publish: ["8080:8080"]
|
||||||
|
|
||||||
|
# DOoD узел (Docker-out-of-Docker)
|
||||||
|
- name: dood1
|
||||||
|
type: dood
|
||||||
|
family: ubuntu22
|
||||||
|
groups: [dood]
|
||||||
|
publish: ["8081:8081"]
|
||||||
|
env:
|
||||||
|
DOCKER_HOST: unix:///var/run/docker.sock
|
||||||
58
molecule/presets/examples/docker-test.yml
Normal file
58
molecule/presets/examples/docker-test.yml
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
---
|
||||||
|
#description: Пресет с Docker контейнерами (DinD + DOoD) для тестирования Docker-задач
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: 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"]
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
# Тестовые хосты
|
||||||
|
- name: test1
|
||||||
|
family: debian12
|
||||||
|
groups: [test]
|
||||||
|
- name: test2
|
||||||
|
family: rhel
|
||||||
|
groups: [test]
|
||||||
|
|
||||||
|
# DinD узел (Docker-in-Docker)
|
||||||
|
- name: docker1
|
||||||
|
type: dind
|
||||||
|
groups: [docker]
|
||||||
|
publish: ["8080:8080"]
|
||||||
|
|
||||||
|
# DOoD узел (Docker-out-of-Docker)
|
||||||
|
- name: dood1
|
||||||
|
type: dood
|
||||||
|
family: debian12
|
||||||
|
groups: [dood]
|
||||||
|
publish: ["8081:8081"]
|
||||||
|
env:
|
||||||
|
DOCKER_HOST: unix:///var/run/docker.sock
|
||||||
76
molecule/presets/examples/etcd-patroni.yml
Normal file
76
molecule/presets/examples/etcd-patroni.yml
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
---
|
||||||
|
#description: Пресет для тестирования кластера etcd + PostgreSQL + Patroni (9 хостов)
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
|
||||||
|
# systemd-ready образы
|
||||||
|
images:
|
||||||
|
alt: "inecs/ansible-lab:alt-linux-latest"
|
||||||
|
astra: "inecs/ansible-lab:astra-linux-latest"
|
||||||
|
rhel: "inecs/ansible-lab:rhel-latest"
|
||||||
|
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"]
|
||||||
|
|
||||||
|
# Описание кластера etcd + Patroni + HAProxy
|
||||||
|
hosts:
|
||||||
|
# ETCD кластер (5 узлов для высокой доступности)
|
||||||
|
- name: etcd1
|
||||||
|
family: debian12
|
||||||
|
groups: [etcd, cluster]
|
||||||
|
- name: etcd2
|
||||||
|
family: rhel
|
||||||
|
groups: [etcd, cluster]
|
||||||
|
- name: etcd3
|
||||||
|
family: debian12
|
||||||
|
groups: [etcd, cluster]
|
||||||
|
- name: etcd4
|
||||||
|
family: rhel
|
||||||
|
groups: [etcd, cluster]
|
||||||
|
- name: etcd5
|
||||||
|
family: debian12
|
||||||
|
groups: [etcd, cluster]
|
||||||
|
|
||||||
|
# Patroni кластер (3 узла PostgreSQL)
|
||||||
|
- name: patroni1
|
||||||
|
family: rhel
|
||||||
|
groups: [patroni, database, cluster]
|
||||||
|
- name: patroni2
|
||||||
|
family: debian12
|
||||||
|
groups: [patroni, database, cluster]
|
||||||
|
- name: patroni3
|
||||||
|
family: rhel
|
||||||
|
groups: [patroni, database, cluster]
|
||||||
|
|
||||||
|
# HAProxy для балансировки
|
||||||
|
- name: haproxy
|
||||||
|
family: debian12
|
||||||
|
groups: [haproxy, loadbalancer]
|
||||||
|
publish: ["5000:5000", "5001:5001"] # RW и RO порты
|
||||||
|
|
||||||
|
# DinD узел для тестирования Docker Compose внутри
|
||||||
|
- name: app-dind
|
||||||
|
type: dind
|
||||||
|
groups: [apps, docker]
|
||||||
|
publish: ["8080:8080"]
|
||||||
44
molecule/presets/examples/minimal.yml
Normal file
44
molecule/presets/examples/minimal.yml
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
---
|
||||||
|
#description: Минимальный пресет для быстрого тестирования с 1 хостом (Debian)
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: 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"]
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
# Минимальный набор - один хост
|
||||||
|
- name: u1
|
||||||
|
family: astra
|
||||||
|
groups: [test]
|
||||||
|
supported_platforms: ["linux/amd64"] # Только amd64
|
||||||
|
- name: u2
|
||||||
|
family: alt
|
||||||
|
groups: [test]
|
||||||
84
molecule/presets/examples/multi-os.yml
Normal file
84
molecule/presets/examples/multi-os.yml
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
---
|
||||||
|
#description: Пресет для тестирования на разных ОС с 12 хостами (Debian + RHEL)
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: 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"]
|
||||||
|
|
||||||
|
# Описание кластера с разными ОС
|
||||||
|
hosts:
|
||||||
|
# Debian серверы
|
||||||
|
- name: debian1
|
||||||
|
family: debian12
|
||||||
|
groups: [debian, servers, web]
|
||||||
|
- name: debian2
|
||||||
|
family: debian12
|
||||||
|
groups: [debian, servers, web]
|
||||||
|
- name: debian3
|
||||||
|
family: debian12
|
||||||
|
groups: [debian, servers, app]
|
||||||
|
- name: debian4
|
||||||
|
family: debian12
|
||||||
|
groups: [debian, servers, app]
|
||||||
|
|
||||||
|
# RHEL серверы
|
||||||
|
- name: rhel1
|
||||||
|
family: rhel
|
||||||
|
groups: [rhel, servers, web]
|
||||||
|
- name: rhel2
|
||||||
|
family: rhel
|
||||||
|
groups: [rhel, servers, web]
|
||||||
|
- name: rhel3
|
||||||
|
family: rhel
|
||||||
|
groups: [rhel, servers, app]
|
||||||
|
- name: rhel4
|
||||||
|
family: rhel
|
||||||
|
groups: [rhel, servers, app]
|
||||||
|
|
||||||
|
# База данных на разных ОС
|
||||||
|
- name: db-debian
|
||||||
|
family: debian12
|
||||||
|
groups: [database, debian, db]
|
||||||
|
- name: db-rhel
|
||||||
|
family: rhel
|
||||||
|
groups: [database, rhel, db]
|
||||||
|
|
||||||
|
# Load balancer
|
||||||
|
- name: lb-mixed
|
||||||
|
family: debian12
|
||||||
|
groups: [loadbalancer, haproxy]
|
||||||
|
publish: ["80:80", "443:443"]
|
||||||
|
|
||||||
|
# DinD узел для тестирования Docker
|
||||||
|
- name: docker-mixed
|
||||||
|
type: dind
|
||||||
|
groups: [docker, apps]
|
||||||
|
publish: ["8080:8080"]
|
||||||
87
molecule/presets/examples/performance.yml
Normal file
87
molecule/presets/examples/performance.yml
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
---
|
||||||
|
#description: Пресет для нагрузочного тестирования с 12 хостами (серверы + БД + кэш)
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: 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"]
|
||||||
|
|
||||||
|
# Описание кластера для нагрузочного тестирования
|
||||||
|
hosts:
|
||||||
|
# Основные серверы (5 узлов)
|
||||||
|
- name: server1
|
||||||
|
family: debian12
|
||||||
|
groups: [servers, web, app]
|
||||||
|
- name: server2
|
||||||
|
family: rhel
|
||||||
|
groups: [servers, web, app]
|
||||||
|
- name: server3
|
||||||
|
family: debian12
|
||||||
|
groups: [servers, web, app]
|
||||||
|
- name: server4
|
||||||
|
family: rhel
|
||||||
|
groups: [servers, web, app]
|
||||||
|
- name: server5
|
||||||
|
family: debian12
|
||||||
|
groups: [servers, web, app]
|
||||||
|
|
||||||
|
# База данных (3 узла)
|
||||||
|
- name: db1
|
||||||
|
family: rhel
|
||||||
|
groups: [database, db]
|
||||||
|
- name: db2
|
||||||
|
family: debian12
|
||||||
|
groups: [database, db]
|
||||||
|
- name: db3
|
||||||
|
family: rhel
|
||||||
|
groups: [database, db]
|
||||||
|
|
||||||
|
# Кэш (3 узла Redis)
|
||||||
|
- name: cache1
|
||||||
|
family: debian12
|
||||||
|
groups: [cache, redis]
|
||||||
|
- name: cache2
|
||||||
|
family: rhel
|
||||||
|
groups: [cache, redis]
|
||||||
|
- name: cache3
|
||||||
|
family: debian12
|
||||||
|
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"]
|
||||||
90
molecule/presets/examples/security.yml
Normal file
90
molecule/presets/examples/security.yml
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
---
|
||||||
|
#description: Пресет для тестирования безопасности с 10 хостами (bastion + internal + monitoring)
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: 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"]
|
||||||
|
|
||||||
|
# Описание кластера для тестирования безопасности
|
||||||
|
hosts:
|
||||||
|
# Bastion хосты (точки входа)
|
||||||
|
- name: bastion1
|
||||||
|
family: rhel
|
||||||
|
groups: [bastion, security, jump]
|
||||||
|
publish: ["2222:22"]
|
||||||
|
- name: bastion2
|
||||||
|
family: debian12
|
||||||
|
groups: [bastion, security, jump]
|
||||||
|
publish: ["2223:22"]
|
||||||
|
|
||||||
|
# Внутренние серверы (без внешнего доступа)
|
||||||
|
- name: internal1
|
||||||
|
family: rhel
|
||||||
|
groups: [internal, servers, app]
|
||||||
|
- name: internal2
|
||||||
|
family: debian12
|
||||||
|
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: debian12
|
||||||
|
groups: [database, secure, internal]
|
||||||
|
|
||||||
|
# Мониторинг и логирование
|
||||||
|
- name: monitor1
|
||||||
|
family: debian12
|
||||||
|
groups: [monitoring, security, logs]
|
||||||
|
- name: monitor2
|
||||||
|
family: rhel
|
||||||
|
groups: [monitoring, security, logs]
|
||||||
|
|
||||||
|
# Firewall и сетевые компоненты
|
||||||
|
- name: fw1
|
||||||
|
family: rhel
|
||||||
|
groups: [firewall, network, security]
|
||||||
|
- name: fw2
|
||||||
|
family: debian12
|
||||||
|
groups: [firewall, network, security]
|
||||||
|
|
||||||
|
# DOoD узел для тестирования Docker безопасности
|
||||||
|
- name: docker-secure
|
||||||
|
type: dood
|
||||||
|
family: debian12
|
||||||
|
groups: [docker, security, apps]
|
||||||
|
publish: ["8080:8080"]
|
||||||
|
env:
|
||||||
|
DOCKER_HOST: "unix:///var/run/docker.sock"
|
||||||
43
molecule/presets/examples/stable.yml
Normal file
43
molecule/presets/examples/stable.yml
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
---
|
||||||
|
#description: Стабильный пресет для тестирования с Ubuntu и Debian (проверенные ОС)
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: 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"]
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
# Стабильные ОС для надежного тестирования
|
||||||
|
- name: u1
|
||||||
|
family: ubuntu22
|
||||||
|
groups: [test, web]
|
||||||
|
- name: u2
|
||||||
|
family: debian12
|
||||||
|
groups: [test, web]
|
||||||
46
molecule/presets/examples/standart.yml
Normal file
46
molecule/presets/examples/standart.yml
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
---
|
||||||
|
#description: Стандартный пресет для тестирования с 3 хостами (Debian + RHEL)
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: 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"]
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
# Стандартный набор - 3 хоста
|
||||||
|
- name: u1
|
||||||
|
family: debian12
|
||||||
|
groups: [test]
|
||||||
|
- name: u2
|
||||||
|
family: rhel
|
||||||
|
groups: [test]
|
||||||
|
- name: u3
|
||||||
|
family: debian12
|
||||||
|
groups: [test]
|
||||||
40
molecule/presets/examples/test.yml
Normal file
40
molecule/presets/examples/test.yml
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
---
|
||||||
|
#description: Минимальный пресет для быстрого тестирования с 1 хостом (Debian)
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: 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"]
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
# Минимальный набор - один хост
|
||||||
|
- name: u1
|
||||||
|
family: debian12
|
||||||
|
groups: [test]
|
||||||
52
molecule/presets/examples/ubuntu-all.yml
Normal file
52
molecule/presets/examples/ubuntu-all.yml
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
---
|
||||||
|
#description: Пресет со всеми версиями Ubuntu (20.04, 22.04, 24.04)
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
|
||||||
|
# systemd-ready образы Ubuntu
|
||||||
|
images:
|
||||||
|
ubuntu20: "inecs/ansible-lab:ubuntu20-latest"
|
||||||
|
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
|
||||||
|
ubuntu24: "inecs/ansible-lab:ubuntu24-latest"
|
||||||
|
|
||||||
|
systemd_defaults:
|
||||||
|
privileged: true
|
||||||
|
command: "/sbin/init"
|
||||||
|
volumes:
|
||||||
|
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
|
||||||
|
tmpfs: ["/run", "/run/lock"]
|
||||||
|
capabilities: ["SYS_ADMIN"]
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
# Ubuntu 20.04 LTS
|
||||||
|
- name: ubuntu20-1
|
||||||
|
family: ubuntu20
|
||||||
|
groups: [ubuntu, test, web]
|
||||||
|
publish: ["8020:80"]
|
||||||
|
- name: ubuntu20-2
|
||||||
|
family: ubuntu20
|
||||||
|
groups: [ubuntu, test, db]
|
||||||
|
publish: ["8026:80"]
|
||||||
|
|
||||||
|
# Ubuntu 22.04 LTS
|
||||||
|
- name: ubuntu22-1
|
||||||
|
family: ubuntu22
|
||||||
|
groups: [ubuntu, test, web]
|
||||||
|
publish: ["8022:80"]
|
||||||
|
- name: ubuntu22-2
|
||||||
|
family: ubuntu22
|
||||||
|
groups: [ubuntu, test, db]
|
||||||
|
publish: ["8023:80"]
|
||||||
|
|
||||||
|
# Ubuntu 24.04 LTS
|
||||||
|
- name: ubuntu24-1
|
||||||
|
family: ubuntu24
|
||||||
|
groups: [ubuntu, test, web]
|
||||||
|
publish: ["8024:80"]
|
||||||
|
- name: ubuntu24-2
|
||||||
|
family: ubuntu24
|
||||||
|
groups: [ubuntu, test, db]
|
||||||
|
publish: ["8025:80"]
|
||||||
34
molecule/presets/examples/ubuntu20.yml
Normal file
34
molecule/presets/examples/ubuntu20.yml
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
#description: Пресет для Ubuntu 20.04 LTS
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
|
||||||
|
# systemd-ready образ Ubuntu 20.04
|
||||||
|
images:
|
||||||
|
ubuntu20: "inecs/ansible-lab:ubuntu20-latest"
|
||||||
|
|
||||||
|
systemd_defaults:
|
||||||
|
privileged: true
|
||||||
|
command: "/sbin/init"
|
||||||
|
volumes:
|
||||||
|
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
|
||||||
|
tmpfs: ["/run", "/run/lock"]
|
||||||
|
capabilities: ["SYS_ADMIN"]
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
# Ubuntu 20.04 LTS хосты
|
||||||
|
- name: ubuntu20-web
|
||||||
|
family: ubuntu20
|
||||||
|
groups: [ubuntu, test, web]
|
||||||
|
publish: ["8020:80"]
|
||||||
|
- name: ubuntu20-db
|
||||||
|
family: ubuntu20
|
||||||
|
groups: [ubuntu, test, db]
|
||||||
|
publish: ["8021:80"]
|
||||||
|
- name: ubuntu20-app
|
||||||
|
family: ubuntu20
|
||||||
|
groups: [ubuntu, test, app]
|
||||||
|
publish: ["8022:80"]
|
||||||
34
molecule/presets/examples/ubuntu22.yml
Normal file
34
molecule/presets/examples/ubuntu22.yml
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
#description: Пресет для Ubuntu 22.04 LTS
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
|
||||||
|
# systemd-ready образ Ubuntu 22.04
|
||||||
|
images:
|
||||||
|
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
|
||||||
|
|
||||||
|
systemd_defaults:
|
||||||
|
privileged: true
|
||||||
|
command: "/sbin/init"
|
||||||
|
volumes:
|
||||||
|
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
|
||||||
|
tmpfs: ["/run", "/run/lock"]
|
||||||
|
capabilities: ["SYS_ADMIN"]
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
# Ubuntu 22.04 LTS хосты
|
||||||
|
- name: ubuntu22-web
|
||||||
|
family: ubuntu22
|
||||||
|
groups: [ubuntu, test, web]
|
||||||
|
publish: ["8220:80"]
|
||||||
|
- name: ubuntu22-db
|
||||||
|
family: ubuntu22
|
||||||
|
groups: [ubuntu, test, db]
|
||||||
|
publish: ["8221:80"]
|
||||||
|
- name: ubuntu22-app
|
||||||
|
family: ubuntu22
|
||||||
|
groups: [ubuntu, test, app]
|
||||||
|
publish: ["8222:80"]
|
||||||
34
molecule/presets/examples/ubuntu24.yml
Normal file
34
molecule/presets/examples/ubuntu24.yml
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
---
|
||||||
|
#description: Пресет для Ubuntu 24.04 LTS
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
|
||||||
|
# systemd-ready образ Ubuntu 24.04
|
||||||
|
images:
|
||||||
|
ubuntu24: "inecs/ansible-lab:ubuntu24-latest"
|
||||||
|
|
||||||
|
systemd_defaults:
|
||||||
|
privileged: true
|
||||||
|
command: "/sbin/init"
|
||||||
|
volumes:
|
||||||
|
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
|
||||||
|
tmpfs: ["/run", "/run/lock"]
|
||||||
|
capabilities: ["SYS_ADMIN"]
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
# Ubuntu 24.04 LTS хосты
|
||||||
|
- name: ubuntu24-web
|
||||||
|
family: ubuntu24
|
||||||
|
groups: [ubuntu, test, web]
|
||||||
|
publish: ["8240:80"]
|
||||||
|
- name: ubuntu24-db
|
||||||
|
family: ubuntu24
|
||||||
|
groups: [ubuntu, test, db]
|
||||||
|
publish: ["8241:80"]
|
||||||
|
- name: ubuntu24-app
|
||||||
|
family: ubuntu24
|
||||||
|
groups: [ubuntu, test, app]
|
||||||
|
publish: ["8242:80"]
|
||||||
46
molecule/presets/mytest.yml
Normal file
46
molecule/presets/mytest.yml
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
---
|
||||||
|
#description: Стандартный пресет по умолчанию для тестирования с 2 хостами (Ubuntu + Debian)
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: 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"]
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
# Стандартный набор - 2 хоста для базового тестирования (стабильные ОС)
|
||||||
|
- name: u1
|
||||||
|
family: ubuntu22
|
||||||
|
groups: [test]
|
||||||
|
- name: u2
|
||||||
|
family: debian12
|
||||||
|
groups: [test]
|
||||||
|
- name: u3
|
||||||
|
family: centos9
|
||||||
|
groups: [test]
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
collections:
|
|
||||||
- name: maxhoesel.proxmox
|
|
||||||
version: 5.0.1
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user