Compare commits
35 Commits
98af514e2c
...
lab
| Author | SHA1 | Date | |
|---|---|---|---|
| 3550678b0c | |||
| f12bbc626d | |||
| 2d8d770b3f | |||
| 4f9b3029cc | |||
| 8dd066f752 | |||
| 102003bb32 | |||
| c59edae00d | |||
| a9fcee13ef | |||
| 1909746098 | |||
| f45ae8b64e | |||
| 3fe419f38e | |||
| c8dbc5356f | |||
| 82c532fcf1 | |||
| eb61afb35a | |||
| a88c85d164 | |||
| 2ee52d22ef | |||
| f48ed43bcc | |||
| b1f681fb30 | |||
| 0eb717ad82 | |||
| 111efd7d92 | |||
| d6bc3f1f31 | |||
| a875a874e9 | |||
| e6287769d6 | |||
| 51c76fb859 | |||
| dc255d006a | |||
| 26a09cd637 | |||
| df97e9d3d4 | |||
| 09ca55539f | |||
| 9c55c8f615 | |||
| f2a0f46813 | |||
| 8071fba25f | |||
| d32ca54f7b | |||
| b1bae8af9f | |||
| 33ada54c12 | |||
| b4881da7c5 |
@@ -4,4 +4,8 @@ skip_list:
|
||||
- yaml[truthy]
|
||||
- yaml[line-length]
|
||||
- var-naming[no-role-prefix]
|
||||
- 'ignore-errors'
|
||||
- 'ignore-errors'
|
||||
|
||||
exclude_paths:
|
||||
- molecule/universal/
|
||||
- files/playbooks/
|
||||
@@ -1,2 +0,0 @@
|
||||
.github
|
||||
|
||||
39
.gitignore
vendored
39
.gitignore
vendored
@@ -1,12 +1,6 @@
|
||||
# ---> Ansible
|
||||
*.retry
|
||||
|
||||
# ---> Vault (секретные файлы)
|
||||
vault/.vault
|
||||
vault/secrets/*.yml
|
||||
# Зашифрованные vault файлы (если не нужно коммитить)
|
||||
# vault/*.yml
|
||||
|
||||
# ---> Python
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
@@ -177,9 +171,36 @@ cython_debug/
|
||||
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
||||
.idea/
|
||||
|
||||
# Cursor IDE
|
||||
# ---> Ansible Template Project Specific
|
||||
# Vault password files
|
||||
.vault
|
||||
vault/.vault
|
||||
vault-password.txt
|
||||
|
||||
# IDE directories
|
||||
.cursor/
|
||||
.idea/
|
||||
.vscode/
|
||||
|
||||
# Kubernetes kubeconfig
|
||||
kubeconfig
|
||||
# Project specific
|
||||
.env
|
||||
*.log
|
||||
*.tmp
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
|
||||
# Docker
|
||||
.docker/
|
||||
|
||||
# Reports and snapshots (keep structure but ignore content)
|
||||
reports/*.html
|
||||
reports/*.json
|
||||
snapshots/*.tar.gz
|
||||
snapshots/*.zip
|
||||
|
||||
# Temporary files
|
||||
*.retry
|
||||
*.backup
|
||||
*.bak
|
||||
|
||||
|
||||
8
ansible.cfg
Normal file
8
ansible.cfg
Normal file
@@ -0,0 +1,8 @@
|
||||
[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
|
||||
89
ci-cd/.gitlab-ci.yml
Normal file
89
ci-cd/.gitlab-ci.yml
Normal file
@@ -0,0 +1,89 @@
|
||||
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 "Работа пайплайна завершена"
|
||||
|
||||
123
ci-cd/README.md
Normal file
123
ci-cd/README.md
Normal file
@@ -0,0 +1,123 @@
|
||||
# CI/CD для Ansible ролей
|
||||
|
||||
Этот раздел содержит примеры настройки CI/CD для Ansible ролей с использованием GitLab CI/CD.
|
||||
|
||||
## Структура
|
||||
|
||||
```
|
||||
ci-cd/
|
||||
├── README.md # Эта документация
|
||||
├── .gitlab-ci.yml # GitLab CI/CD конфигурация
|
||||
├── gitlab/ # GitLab Runner конфигурация
|
||||
│ ├── config.json # Docker registry конфигурация
|
||||
│ ├── docker-compose.yaml # GitLab Runner в Docker
|
||||
│ └── runner/
|
||||
│ └── config.toml # Runner конфигурация
|
||||
└── dockerfiles/ # Dockerfile'ы для разных ОС
|
||||
├── Dockerfile # Базовый Dockerfile
|
||||
├── Dockerfile-CentOS # Dockerfile для CentOS
|
||||
└── Dockerfile-Ubuntu # Dockerfile для Ubuntu
|
||||
```
|
||||
|
||||
## GitLab CI/CD
|
||||
|
||||
### Основные этапы
|
||||
|
||||
1. **Lint** - проверка синтаксиса Ansible
|
||||
2. **Test** - запуск тестов через Molecule
|
||||
3. **Deploy** - развертывание в продакшн
|
||||
4. **Notify** - уведомления о результатах
|
||||
|
||||
### Настройка
|
||||
|
||||
1. **Переменные окружения:**
|
||||
- `CI_REGISTRY_USER` - пользователь Docker registry
|
||||
- `CI_REGISTRY_PASSWORD` - пароль Docker registry
|
||||
- `SSH_PRIVATE_KEY` - SSH ключ для доступа к серверам
|
||||
- `TELEGRAM_BOT_TOKEN` - токен Telegram бота
|
||||
- `TELEGRAM_CHAT_ID` - ID чата для уведомлений
|
||||
|
||||
2. **Docker Registry:**
|
||||
- Настроен доступ к `hub.cism-ms.ru`
|
||||
- Используется образ `hub.cism-ms.ru/ansible/ansible:latest`
|
||||
|
||||
3. **Vault:**
|
||||
- Автоматическое расшифрование/шифрование секретов
|
||||
- Используется `vault-password.txt` для доступа
|
||||
|
||||
## GitLab Runner
|
||||
|
||||
### Конфигурация
|
||||
|
||||
- **Executor:** Docker
|
||||
- **Image:** `hub.cism-ms.ru/ansible/ansible:latest`
|
||||
- **Privileged:** true
|
||||
- **Volumes:** Docker socket для DinD
|
||||
|
||||
### Настройка Runner
|
||||
|
||||
1. Зарегистрировать Runner:
|
||||
```bash
|
||||
docker-compose -f ci-cd/gitlab/docker-compose.yaml up -d
|
||||
```
|
||||
|
||||
2. Настроить переменные в `ci-cd/gitlab/runner/config.toml`
|
||||
|
||||
## Dockerfile'ы
|
||||
|
||||
### Базовый Dockerfile
|
||||
- Основан на Ubuntu
|
||||
- Установлены Ansible, Molecule, Docker
|
||||
- Настроен systemd для тестирования
|
||||
|
||||
### Dockerfile-CentOS
|
||||
- Основан на CentOS
|
||||
- Адаптирован для RHEL-семейства
|
||||
- Установлены необходимые пакеты
|
||||
|
||||
### Dockerfile-Ubuntu
|
||||
- Основан на Ubuntu
|
||||
- Оптимизирован для Debian-семейства
|
||||
- Включены дополнительные инструменты
|
||||
|
||||
## Использование
|
||||
|
||||
### Локальная разработка
|
||||
|
||||
```bash
|
||||
# Создать роль
|
||||
make role create NAME=my-role
|
||||
|
||||
# Тестировать роль
|
||||
make role test NAME=my-role
|
||||
|
||||
# Проверить синтаксис
|
||||
make role lint
|
||||
```
|
||||
|
||||
### CI/CD Pipeline
|
||||
|
||||
1. **Автоматический запуск** при push в ветки
|
||||
2. **Lint проверка** всех ролей
|
||||
3. **Molecule тесты** для каждой роли
|
||||
4. **Deploy** в продакшн (ручной запуск)
|
||||
5. **Уведомления** в Telegram
|
||||
|
||||
### Настройка для своего проекта
|
||||
|
||||
1. Скопировать `.gitlab-ci.yml` в корень проекта
|
||||
2. Настроить переменные в GitLab
|
||||
3. Обновить Docker registry URL
|
||||
4. Настроить SSH ключи для деплоя
|
||||
|
||||
## Безопасность
|
||||
|
||||
- Все секреты хранятся в Ansible Vault
|
||||
- SSH ключи используются только для деплоя
|
||||
- Docker registry требует аутентификации
|
||||
- Vault файлы автоматически шифруются после использования
|
||||
|
||||
## Автор
|
||||
|
||||
Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
40
ci-cd/dockerfiles/Dockerfile
Normal file
40
ci-cd/dockerfiles/Dockerfile
Normal file
@@ -0,0 +1,40 @@
|
||||
# Используем готовый образ с 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"]
|
||||
54
ci-cd/dockerfiles/Dockerfile-CentOS
Normal file
54
ci-cd/dockerfiles/Dockerfile-CentOS
Normal file
@@ -0,0 +1,54 @@
|
||||
# Сборка контейнера с 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"]
|
||||
62
ci-cd/dockerfiles/Dockerfile-Ubuntu
Normal file
62
ci-cd/dockerfiles/Dockerfile-Ubuntu
Normal file
@@ -0,0 +1,62 @@
|
||||
# Сборка контейнера с 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"]
|
||||
@@ -1,51 +0,0 @@
|
||||
# GitLab CI для DevOpsLab
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: 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
|
||||
@@ -1,167 +0,0 @@
|
||||
# Azure DevOps Pipeline для DevOpsLab
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: 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'
|
||||
@@ -1,172 +0,0 @@
|
||||
# GitHub Actions Workflow для DevOpsLab
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
|
||||
name: DevOpsLab 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
|
||||
@@ -1,153 +0,0 @@
|
||||
# GitLab CI Pipeline для DevOpsLab
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: 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
138
cicd/jenkins/Jenkinsfile
vendored
@@ -1,138 +0,0 @@
|
||||
// Jenkins Pipeline для DevOpsLab
|
||||
// Автор: Сергей Антропов
|
||||
// Сайт: 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'
|
||||
}
|
||||
}
|
||||
}
|
||||
138
create_role_fixed.sh
Executable file
138
create_role_fixed.sh
Executable file
@@ -0,0 +1,138 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Исправленная команда создания роли
|
||||
ROLE_NAME="$1"
|
||||
ROLE_DESC="$2"
|
||||
ROLE_PACKAGE="$3"
|
||||
ROLE_SERVICE="$4"
|
||||
ROLE_TAGS="$5"
|
||||
|
||||
if [ -z "$ROLE_NAME" ]; then
|
||||
echo "Использование: $0 ROLE_NAME ROLE_DESC ROLE_PACKAGE ROLE_SERVICE ROLE_TAGS"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Создание роли: $ROLE_NAME"
|
||||
mkdir -p ./roles/${ROLE_NAME}/{tasks,handlers,templates,files,vars,defaults,meta,tests,playbooks}
|
||||
|
||||
# Создаем main.yml
|
||||
cat > ./roles/${ROLE_NAME}/tasks/main.yml << 'MAIN_EOF'
|
||||
---
|
||||
# Основные задачи роли ROLE_NAME_PLACEHOLDER
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
|
||||
- name: Включить задачи для Debian/Ubuntu
|
||||
import_tasks: debian.yml
|
||||
when: ansible_os_family == 'Debian'
|
||||
|
||||
- name: Включить задачи для RHEL/CentOS
|
||||
import_tasks: redhat.yml
|
||||
when: ansible_os_family == 'RedHat'
|
||||
MAIN_EOF
|
||||
|
||||
# Создаем debian.yml
|
||||
cat > ./roles/${ROLE_NAME}/tasks/debian.yml << 'DEBIAN_EOF'
|
||||
---
|
||||
# Задачи для Debian/Ubuntu
|
||||
|
||||
- name: Обновить кэш пакетов
|
||||
apt:
|
||||
update_cache: yes
|
||||
cache_valid_time: 3600
|
||||
|
||||
- name: Установить пакет PACKAGE_PLACEHOLDER
|
||||
apt:
|
||||
name: "{{ ROLE_NAME_PLACEHOLDER_package }}"
|
||||
state: present
|
||||
|
||||
- name: Запустить и включить сервис SERVICE_PLACEHOLDER
|
||||
systemd:
|
||||
name: "{{ ROLE_NAME_PLACEHOLDER_service }}"
|
||||
enabled: "{{ ROLE_NAME_PLACEHOLDER_enabled }}"
|
||||
state: "{{ 'started' if ROLE_NAME_PLACEHOLDER_started else 'stopped' }}"
|
||||
DEBIAN_EOF
|
||||
|
||||
# Создаем redhat.yml
|
||||
cat > ./roles/${ROLE_NAME}/tasks/redhat.yml << 'REDHAT_EOF'
|
||||
---
|
||||
# Задачи для RHEL/CentOS
|
||||
|
||||
- name: Установить пакет PACKAGE_PLACEHOLDER
|
||||
yum:
|
||||
name: "{{ ROLE_NAME_PLACEHOLDER_package }}"
|
||||
state: present
|
||||
|
||||
- name: Запустить и включить сервис SERVICE_PLACEHOLDER
|
||||
systemd:
|
||||
name: "{{ ROLE_NAME_PLACEHOLDER_service }}"
|
||||
enabled: "{{ ROLE_NAME_PLACEHOLDER_enabled }}"
|
||||
state: "{{ 'started' if ROLE_NAME_PLACEHOLDER_started else 'stopped' }}"
|
||||
REDHAT_EOF
|
||||
|
||||
# Создаем defaults/main.yml
|
||||
cat > ./roles/${ROLE_NAME}/defaults/main.yml << 'DEFAULTS_EOF'
|
||||
---
|
||||
# Переменные по умолчанию для роли ROLE_NAME_PLACEHOLDER
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
|
||||
ROLE_NAME_PLACEHOLDER_package: PACKAGE_PLACEHOLDER
|
||||
ROLE_NAME_PLACEHOLDER_service: SERVICE_PLACEHOLDER
|
||||
ROLE_NAME_PLACEHOLDER_enabled: true
|
||||
ROLE_NAME_PLACEHOLDER_started: true
|
||||
DEFAULTS_EOF
|
||||
|
||||
# Создаем meta/main.yml
|
||||
cat > ./roles/${ROLE_NAME}/meta/main.yml << 'META_EOF'
|
||||
---
|
||||
galaxy_info:
|
||||
author: Сергей Антропов
|
||||
description: ROLE_DESC_PLACEHOLDER
|
||||
company: https://devops.org.ru
|
||||
license: MIT
|
||||
min_ansible_version: 2.9
|
||||
platforms:
|
||||
- name: Ubuntu
|
||||
versions: [18.04, 20.04, 22.04]
|
||||
- name: Debian
|
||||
versions: [10, 11, 12]
|
||||
- name: EL
|
||||
versions: [7, 8, 9]
|
||||
galaxy_tags: [TAGS_PLACEHOLDER]
|
||||
|
||||
dependencies: []
|
||||
META_EOF
|
||||
|
||||
# Создаем handlers/main.yml
|
||||
cat > ./roles/${ROLE_NAME}/handlers/main.yml << 'HANDLERS_EOF'
|
||||
---
|
||||
# Обработчики роли ROLE_NAME_PLACEHOLDER
|
||||
|
||||
- name: Перезапустить SERVICE_PLACEHOLDER
|
||||
systemd:
|
||||
name: "{{ ROLE_NAME_PLACEHOLDER_service }}"
|
||||
state: restarted
|
||||
HANDLERS_EOF
|
||||
|
||||
# Заменяем плейсхолдеры
|
||||
sed -i '' "s/ROLE_NAME_PLACEHOLDER/${ROLE_NAME}/g" ./roles/${ROLE_NAME}/tasks/main.yml
|
||||
sed -i '' "s/ROLE_NAME_PLACEHOLDER/${ROLE_NAME}/g" ./roles/${ROLE_NAME}/tasks/debian.yml
|
||||
sed -i '' "s/ROLE_NAME_PLACEHOLDER/${ROLE_NAME}/g" ./roles/${ROLE_NAME}/tasks/redhat.yml
|
||||
sed -i '' "s/ROLE_NAME_PLACEHOLDER/${ROLE_NAME}/g" ./roles/${ROLE_NAME}/defaults/main.yml
|
||||
sed -i '' "s/ROLE_NAME_PLACEHOLDER/${ROLE_NAME}/g" ./roles/${ROLE_NAME}/meta/main.yml
|
||||
sed -i '' "s/ROLE_NAME_PLACEHOLDER/${ROLE_NAME}/g" ./roles/${ROLE_NAME}/handlers/main.yml
|
||||
|
||||
sed -i '' "s/PACKAGE_PLACEHOLDER/${ROLE_PACKAGE}/g" ./roles/${ROLE_NAME}/tasks/debian.yml
|
||||
sed -i '' "s/PACKAGE_PLACEHOLDER/${ROLE_PACKAGE}/g" ./roles/${ROLE_NAME}/tasks/redhat.yml
|
||||
sed -i '' "s/PACKAGE_PLACEHOLDER/${ROLE_PACKAGE}/g" ./roles/${ROLE_NAME}/defaults/main.yml
|
||||
|
||||
sed -i '' "s/SERVICE_PLACEHOLDER/${ROLE_SERVICE}/g" ./roles/${ROLE_NAME}/tasks/debian.yml
|
||||
sed -i '' "s/SERVICE_PLACEHOLDER/${ROLE_SERVICE}/g" ./roles/${ROLE_NAME}/tasks/redhat.yml
|
||||
sed -i '' "s/SERVICE_PLACEHOLDER/${ROLE_SERVICE}/g" ./roles/${ROLE_NAME}/handlers/main.yml
|
||||
|
||||
sed -i '' "s/ROLE_DESC_PLACEHOLDER/${ROLE_DESC}/g" ./roles/${ROLE_NAME}/meta/main.yml
|
||||
sed -i '' "s/TAGS_PLACEHOLDER/${ROLE_TAGS}/g" ./roles/${ROLE_NAME}/meta/main.yml
|
||||
|
||||
echo "Роль ${ROLE_NAME} создана успешно!"
|
||||
echo "Структура: ./roles/${ROLE_NAME}/"
|
||||
36
docker-compose.yaml
Normal file
36
docker-compose.yaml
Normal file
@@ -0,0 +1,36 @@
|
||||
version: "3.9"
|
||||
|
||||
services:
|
||||
ansible-controller:
|
||||
image: quay.io/ansible/creator-ee: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
|
||||
- ./molecule:/ansible/molecule
|
||||
- ./files:/ansible/files
|
||||
- ./scripts:/ansible/scripts
|
||||
- ./reports:/ansible/reports
|
||||
- ./snapshots:/ansible/snapshots
|
||||
- ./vault:/ansible/vault
|
||||
- ./.ansible-lint:/ansible/.ansible-lint
|
||||
# каталог с ролями (локальный или внешний)
|
||||
- ${ROLES_DIR:-./roles}:/ansible/roles:ro
|
||||
working_dir: /ansible
|
||||
|
||||
# Обратная совместимость
|
||||
# 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
|
||||
@@ -1,790 +0,0 @@
|
||||
# Docker образы для универсальной системы тестирования DevOpsLab
|
||||
|
||||
**Автор:** Сергей Антропов
|
||||
**Сайт:** https://devops.org.ru
|
||||
**Версия:** 3.0.0
|
||||
|
||||
## 🐳 Обзор
|
||||
|
||||
Эта директория содержит Docker образы для различных операционных систем и компонентов, используемых в универсальной системе тестирования Ansible ролей. Все образы поддерживают multi-arch сборку (amd64, arm64, riscv64, ppc64le, s390x, 386, arm/v7, arm/v6) и автоматически публикуются в Docker Hub.
|
||||
|
||||
## 📁 Структура
|
||||
|
||||
```
|
||||
dockerfiles/
|
||||
├── ansible-controller/ # Ansible контроллер с предустановленными коллекциями
|
||||
│ ├── Dockerfile
|
||||
│ ├── docker-compose.yml
|
||||
│ ├── requirements.txt
|
||||
│ └── requirements.yml
|
||||
├── k8s/ # Kubernetes контроллер (Kind, kubectl, Helm, Istio)
|
||||
│ └── Dockerfile
|
||||
├── k8s-portforward/ # Port-forward контейнер (устаревший)
|
||||
│ ├── Dockerfile
|
||||
│ └── portforward-container.py
|
||||
├── alt-linux/ # ALT Linux P9 с systemd
|
||||
│ └── Dockerfile
|
||||
├── astra-linux/ # Astra Linux 1.7 с systemd
|
||||
│ └── Dockerfile
|
||||
├── redos/ # RED OS 9 с systemd
|
||||
│ └── Dockerfile
|
||||
├── rhel/ # Red Hat Enterprise Linux 8 с systemd
|
||||
│ └── Dockerfile
|
||||
├── centos7/ # CentOS 7 с systemd
|
||||
│ └── Dockerfile
|
||||
├── centos8/ # CentOS 8 Stream с systemd
|
||||
│ └── Dockerfile
|
||||
├── centos9/ # CentOS 9 Stream с systemd
|
||||
│ └── Dockerfile
|
||||
├── alma/ # AlmaLinux 8 с systemd
|
||||
│ └── Dockerfile
|
||||
├── rocky/ # Rocky Linux 8 с systemd
|
||||
│ └── Dockerfile
|
||||
├── ubuntu20/ # Ubuntu 20.04 LTS (focal) с systemd
|
||||
│ └── Dockerfile
|
||||
├── ubuntu22/ # Ubuntu 22.04 LTS (jammy) с systemd
|
||||
│ └── Dockerfile
|
||||
├── ubuntu24/ # Ubuntu 24.04 LTS (noble) с systemd
|
||||
│ └── Dockerfile
|
||||
├── debian9/ # Debian 9 (stretch) с systemd
|
||||
│ └── Dockerfile
|
||||
├── debian10/ # Debian 10 (buster) с systemd
|
||||
│ └── Dockerfile
|
||||
├── debian11/ # Debian 11 (bullseye) с systemd
|
||||
│ └── Dockerfile
|
||||
├── debian12/ # Debian 12 (bookworm) с systemd
|
||||
│ └── Dockerfile
|
||||
└── README.md # Этот файл
|
||||
```
|
||||
|
||||
## 🚀 Доступные образы
|
||||
|
||||
### 1. ansible-controller
|
||||
|
||||
**Базовый образ:** `ubuntu:22.04`
|
||||
**Тег:** `inecs/ansible-lab:ansible-controller-latest`
|
||||
**Описание:** Ansible контроллер с предустановленными коллекциями и инструментами
|
||||
|
||||
#### Компоненты:
|
||||
- **Ansible Core** с последними коллекциями
|
||||
- **Docker CLI** для работы с контейнерами
|
||||
- **yq** для работы с YAML
|
||||
- **jq** для работы с JSON
|
||||
|
||||
**Примечание:** Kubernetes инструменты (kubectl, Helm, Kind, Istio) были перенесены в отдельный образ `k8s`.
|
||||
|
||||
#### Предустановленные коллекции:
|
||||
```yaml
|
||||
collections:
|
||||
- name: community.docker
|
||||
version: ">=3.0.0"
|
||||
- name: community.general
|
||||
version: ">=7.0.0"
|
||||
- name: ansible.posix
|
||||
version: ">=1.5.4"
|
||||
```
|
||||
|
||||
#### Предустановленные роли:
|
||||
- `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. k8s
|
||||
|
||||
**Базовый образ:** `ubuntu:22.04`
|
||||
**Тег:** `inecs/ansible-lab:k8s-latest`
|
||||
**Описание:** Kubernetes контроллер с инструментами для работы с Kubernetes, Helm, Istio и Kind кластерами
|
||||
|
||||
#### Компоненты:
|
||||
- **Docker CLI** (20.10.24) для работы с контейнерами
|
||||
- **kubectl** (1.34.1) для управления Kubernetes
|
||||
- **Helm** (latest) для управления пакетами Kubernetes
|
||||
- **Kind** (0.30.0) для локальных Kubernetes кластеров
|
||||
- **Istio CLI** (1.22.1) для управления Service Mesh
|
||||
- **Python 3** с модулем yaml для выполнения скриптов
|
||||
|
||||
#### Использование:
|
||||
```bash
|
||||
# Создание Kind кластера
|
||||
docker run -it --rm \
|
||||
--name k8s-controller \
|
||||
--network kind \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock:rw \
|
||||
inecs/ansible-lab:k8s-latest \
|
||||
kind create cluster --name lab
|
||||
|
||||
# Выполнение kubectl команд
|
||||
docker exec k8s-controller kubectl get nodes
|
||||
|
||||
# Установка Helm релиза
|
||||
docker exec k8s-controller helm install prometheus prometheus-community/kube-prometheus-stack
|
||||
```
|
||||
|
||||
**Примечание:** Этот образ используется автоматически при выполнении `make k8s` команд. Контейнер запускается с именем `k8s-controller` и подключен к Docker daemon хоста.
|
||||
|
||||
### 3. Ubuntu
|
||||
|
||||
#### Ubuntu 20.04 (focal)
|
||||
|
||||
**Базовый образ:** `ubuntu:20.04`
|
||||
**Тег:** `inecs/ansible-lab:ubuntu20`
|
||||
**Описание:** Ubuntu 20.04 LTS с systemd
|
||||
|
||||
**Компоненты:**
|
||||
- Ubuntu 20.04 LTS (Focal Fossa)
|
||||
- systemd, Python 3, базовые утилиты
|
||||
- Пользователь ansible с sudo правами
|
||||
|
||||
#### Ubuntu 22.04 (jammy) - основная версия
|
||||
|
||||
**Базовый образ:** `ubuntu:22.04`
|
||||
**Тег:** `inecs/ansible-lab:ubuntu-latest` или `inecs/ansible-lab:ubuntu22`
|
||||
**Описание:** Ubuntu 22.04 LTS с systemd
|
||||
|
||||
**Компоненты:**
|
||||
- Ubuntu 22.04 LTS (Jammy Jellyfish)
|
||||
- systemd, Python 3, базовые утилиты
|
||||
- Пользователь ansible с sudo правами
|
||||
|
||||
#### Ubuntu 24.04 (noble)
|
||||
|
||||
**Базовый образ:** `ubuntu:24.04`
|
||||
**Тег:** `inecs/ansible-lab:ubuntu24`
|
||||
**Описание:** Ubuntu 24.04 LTS с systemd
|
||||
|
||||
**Компоненты:**
|
||||
- Ubuntu 24.04 LTS (Noble Numbat)
|
||||
- systemd, Python 3, базовые утилиты
|
||||
- Пользователь ansible с sudo правами
|
||||
|
||||
**Примечание:** Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
|
||||
|
||||
**Использование:**
|
||||
```bash
|
||||
# Запуск Ubuntu контейнера
|
||||
docker run -d --privileged \
|
||||
--name ubuntu-test \
|
||||
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
|
||||
--tmpfs /run --tmpfs /run/lock \
|
||||
--cap-add SYS_ADMIN \
|
||||
inecs/ansible-lab:ubuntu22
|
||||
```
|
||||
|
||||
### 4. Debian
|
||||
|
||||
#### Debian 9 (stretch)
|
||||
|
||||
**Базовый образ:** `debian:stretch`
|
||||
**Тег:** `inecs/ansible-lab:debian9`
|
||||
**Описание:** Debian 9 Stretch с systemd
|
||||
|
||||
**Компоненты:**
|
||||
- Debian 9 (Stretch)
|
||||
- systemd, Python 3, базовые утилиты
|
||||
- Пользователь ansible с sudo правами
|
||||
|
||||
#### Debian 10 (buster)
|
||||
|
||||
**Базовый образ:** `debian:buster`
|
||||
**Тег:** `inecs/ansible-lab:debian10`
|
||||
**Описание:** Debian 10 Buster с systemd
|
||||
|
||||
**Компоненты:**
|
||||
- Debian 10 (Buster)
|
||||
- systemd, Python 3, базовые утилиты
|
||||
- Пользователь ansible с sudo правами
|
||||
|
||||
#### Debian 11 (bullseye)
|
||||
|
||||
**Базовый образ:** `debian:bullseye`
|
||||
**Тег:** `inecs/ansible-lab:debian11`
|
||||
**Описание:** Debian 11 Bullseye с systemd
|
||||
|
||||
**Компоненты:**
|
||||
- Debian 11 (Bullseye)
|
||||
- systemd, Python 3, базовые утилиты
|
||||
- Пользователь ansible с sudo правами
|
||||
|
||||
#### Debian 12 (bookworm) - основная версия
|
||||
|
||||
**Базовый образ:** `debian:bookworm`
|
||||
**Тег:** `inecs/ansible-lab:debian-latest` или `inecs/ansible-lab:debian12`
|
||||
**Описание:** Debian 12 Bookworm с systemd
|
||||
|
||||
**Компоненты:**
|
||||
- Debian 12 (Bookworm)
|
||||
- systemd, Python 3, базовые утилиты
|
||||
- Пользователь ansible с sudo правами
|
||||
|
||||
**Примечание:** Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
|
||||
|
||||
**Использование:**
|
||||
```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:debian12
|
||||
```
|
||||
|
||||
### 5. RHEL (Red Hat Enterprise Linux)
|
||||
|
||||
**Базовый образ:** `registry.access.redhat.com/ubi8/ubi`
|
||||
**Тег:** `inecs/ansible-lab:rhel-latest`
|
||||
**Описание:** Red Hat Enterprise Linux 8 с systemd
|
||||
|
||||
**Компоненты:**
|
||||
- RHEL 8 (Universal Base Image)
|
||||
- systemd, Python 3, базовые утилиты
|
||||
- Пользователь ansible с sudo правами
|
||||
|
||||
**Примечание:** Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
|
||||
|
||||
**Использование:**
|
||||
```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
|
||||
```
|
||||
|
||||
### 6. CentOS
|
||||
|
||||
#### CentOS 7
|
||||
|
||||
**Базовый образ:** `centos:7`
|
||||
**Тег:** `inecs/ansible-lab:centos7`
|
||||
**Описание:** CentOS 7 с systemd
|
||||
|
||||
**Компоненты:**
|
||||
- CentOS 7
|
||||
- systemd, Python 3, базовые утилиты
|
||||
- Пользователь ansible с sudo правами
|
||||
|
||||
#### CentOS 8
|
||||
|
||||
**Базовый образ:** `quay.io/centos/centos:stream8`
|
||||
**Тег:** `inecs/ansible-lab:centos8`
|
||||
**Описание:** CentOS 8 Stream с systemd
|
||||
|
||||
**Компоненты:**
|
||||
- CentOS 8 Stream
|
||||
- systemd, Python 3, базовые утилиты
|
||||
- Пользователь ansible с sudo правами
|
||||
|
||||
#### CentOS 9 (stream) - основная версия
|
||||
|
||||
**Базовый образ:** `quay.io/centos/centos:stream9`
|
||||
**Тег:** `inecs/ansible-lab:centos-latest` или `inecs/ansible-lab:centos9`
|
||||
**Описание:** CentOS Stream 9 с systemd
|
||||
|
||||
**Компоненты:**
|
||||
- CentOS Stream 9
|
||||
- systemd, Python 3, базовые утилиты
|
||||
- Пользователь ansible с sudo правами
|
||||
|
||||
**Примечание:** Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
|
||||
|
||||
**Использование:**
|
||||
```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:centos9
|
||||
```
|
||||
|
||||
#### Настройки 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
|
||||
```
|
||||
|
||||
### 7. alma
|
||||
|
||||
**Базовый образ:** `almalinux:8`
|
||||
**Тег:** `inecs/ansible-lab:alma-latest`
|
||||
**Описание:** AlmaLinux 8 с systemd и Docker
|
||||
|
||||
#### Компоненты:
|
||||
- **AlmaLinux 8**
|
||||
- **systemd** для управления сервисами
|
||||
|
||||
- **Python 3** с pip
|
||||
- **Пользователь ansible** с sudo правами
|
||||
|
||||
#### Установленные пакеты:
|
||||
- **Примечание**: Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
|
||||
```bash
|
||||
systemd systemd-sysv dbus
|
||||
curl wget git vim nano jq
|
||||
python3 python3-pip
|
||||
```
|
||||
|
||||
#### Настройки 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
|
||||
```
|
||||
|
||||
### 8. rocky
|
||||
|
||||
**Базовый образ:** `rockylinux:8`
|
||||
**Тег:** `inecs/ansible-lab:rocky-latest`
|
||||
**Описание:** Rocky Linux 8 с systemd и Docker
|
||||
|
||||
#### Компоненты:
|
||||
- **Rocky Linux 8**
|
||||
- **systemd** для управления сервисами
|
||||
|
||||
- **Python 3** с pip
|
||||
- **Пользователь ansible** с sudo правами
|
||||
|
||||
#### Установленные пакеты:
|
||||
- **Примечание**: Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
|
||||
```bash
|
||||
systemd systemd-sysv dbus
|
||||
curl wget git vim nano jq
|
||||
python3 python3-pip
|
||||
```
|
||||
|
||||
#### Настройки 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
|
||||
```
|
||||
|
||||
### 9. alt-linux
|
||||
|
||||
**Базовый образ:** `altlinux/p9`
|
||||
**Тег:** `inecs/ansible-lab:alt-linux-latest`
|
||||
**Описание:** ALT Linux 9 с systemd и Docker
|
||||
|
||||
#### Компоненты:
|
||||
- **ALT Linux 9** (Platform 9)
|
||||
- **systemd** для управления сервисами
|
||||
|
||||
- **Python 3** с pip
|
||||
- **Пользователь ansible** с sudo правами
|
||||
|
||||
#### Установленные пакеты:
|
||||
- **Примечание**: Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
|
||||
```bash
|
||||
systemd systemd-sysv dbus
|
||||
curl wget git vim nano htop tree jq
|
||||
python3 python3-pip
|
||||
```
|
||||
|
||||
#### Настройки 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
|
||||
```
|
||||
|
||||
### 10. astra-linux
|
||||
|
||||
**Базовый образ:** `astralinux/astra-1.7`
|
||||
**Тег:** `inecs/ansible-lab:astra-linux-latest`
|
||||
**Описание:** Astra Linux 1.7 с systemd и Docker
|
||||
|
||||
#### Компоненты:
|
||||
- **Astra Linux 1.7**
|
||||
- **systemd** для управления сервисами
|
||||
|
||||
- **Python 3** с pip
|
||||
- **Пользователь ansible** с sudo правами
|
||||
|
||||
#### Установленные пакеты:
|
||||
- **Примечание**: Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
|
||||
```bash
|
||||
systemd systemd-sysv dbus
|
||||
curl wget git vim nano htop tree jq
|
||||
python3 python3-pip
|
||||
```
|
||||
|
||||
#### Настройки 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
|
||||
```
|
||||
|
||||
### 11. redos
|
||||
|
||||
**Базовый образ:** `redos/redos:9`
|
||||
**Тег:** `inecs/ansible-lab:redos-latest`
|
||||
**Описание:** RED OS 9 с systemd и Docker
|
||||
|
||||
#### Компоненты:
|
||||
- **RED OS 9**
|
||||
- **systemd** для управления сервисами
|
||||
|
||||
- **Python 3** с pip
|
||||
- **Пользователь ansible** с sudo правами
|
||||
|
||||
#### Установленные пакеты:
|
||||
- **Примечание**: Docker CE и Docker Compose НЕ установлены (закомментированы в Dockerfile)
|
||||
```bash
|
||||
systemd systemd-sysv dbus
|
||||
curl wget git vim nano htop tree jq
|
||||
python3 python3-pip
|
||||
```
|
||||
|
||||
#### Настройки 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 с собственными образами DevOpsLab
|
||||
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
|
||||
@@ -1,52 +0,0 @@
|
||||
# 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"]
|
||||
@@ -1,53 +0,0 @@
|
||||
# ALT Linux 10 (Platform 10) с systemd
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
# https://hub.docker.com/_/alt/tags
|
||||
# Тег: inecs/ansible-lab:alt10-latest
|
||||
|
||||
FROM alt:p10
|
||||
|
||||
# Обновляем систему
|
||||
RUN apt-get update && apt-get dist-upgrade -y
|
||||
|
||||
# Устанавливаем systemd и необходимые пакеты
|
||||
RUN apt-get install -y \
|
||||
systemd \
|
||||
dbus \
|
||||
curl \
|
||||
wget \
|
||||
nano \
|
||||
python3 \
|
||||
sudo \
|
||||
&& apt-get clean
|
||||
|
||||
# Устанавливаем pip для Python 3.11
|
||||
RUN curl -sS https://bootstrap.pypa.io/pip/get-pip.py | python3
|
||||
|
||||
# Устанавливаем yq
|
||||
# RUN wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_arm64 \
|
||||
# && chmod +x /usr/local/bin/yq
|
||||
|
||||
# Устанавливаем Docker вручную для ALT Linux
|
||||
# RUN apt-get update && apt-get install -y \
|
||||
# ca-certificates \
|
||||
# curl \
|
||||
# gnupg \
|
||||
# && apt-get clean
|
||||
|
||||
# Устанавливаем Docker Compose
|
||||
# RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \
|
||||
# && chmod +x /usr/local/bin/docker-compose
|
||||
|
||||
# Настраиваем systemd
|
||||
RUN systemctl set-default multi-user.target
|
||||
|
||||
# Настраиваем sudoers для root и пользователей
|
||||
RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
|
||||
echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test
|
||||
|
||||
# Создаем пользователя для Ansible
|
||||
RUN useradd -m -s /bin/bash ansible \
|
||||
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
|
||||
|
||||
# Команда по умолчанию (система запускается от root для systemd)
|
||||
CMD ["/sbin/init"]
|
||||
@@ -1,53 +0,0 @@
|
||||
# ALT Linux 9 (Platform 9) с systemd
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
# https://hub.docker.com/_/alt/tags
|
||||
# Тег: inecs/ansible-lab:alt9-latest
|
||||
|
||||
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"]
|
||||
@@ -1,93 +0,0 @@
|
||||
# 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"]
|
||||
@@ -1,22 +0,0 @@
|
||||
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
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
# Python зависимости для Ansible Controller
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
|
||||
# Основные зависимости для работы с паролями
|
||||
passlib>=1.7.4
|
||||
|
||||
# Дополнительные зависимости для безопасности
|
||||
bcrypt>=4.0.1
|
||||
@@ -1,9 +0,0 @@
|
||||
---
|
||||
# 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"
|
||||
@@ -1,70 +0,0 @@
|
||||
# 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"]
|
||||
@@ -1,50 +0,0 @@
|
||||
# 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"]
|
||||
@@ -1,50 +0,0 @@
|
||||
# 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"]
|
||||
@@ -1,46 +0,0 @@
|
||||
# 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"]
|
||||
@@ -1,62 +0,0 @@
|
||||
# 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"]
|
||||
@@ -1,56 +0,0 @@
|
||||
# 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"]
|
||||
@@ -1,56 +0,0 @@
|
||||
# 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"]
|
||||
@@ -1,62 +0,0 @@
|
||||
# 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"]
|
||||
@@ -1,43 +0,0 @@
|
||||
# Kubernetes Port-Forward Container
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
|
||||
ARG TARGETARCH
|
||||
|
||||
FROM ubuntu:22.04
|
||||
|
||||
# Обновляем систему
|
||||
RUN apt-get update && apt-get upgrade -y && apt-get clean
|
||||
|
||||
# Устанавливаем базовые пакеты + socat для форвардинга портов
|
||||
RUN apt-get install -y \
|
||||
wget \
|
||||
curl \
|
||||
bash \
|
||||
ca-certificates \
|
||||
python3 \
|
||||
python3-yaml \
|
||||
socat \
|
||||
netcat-openbsd \
|
||||
&& apt-get clean
|
||||
|
||||
# Устанавливаем kubectl
|
||||
RUN if [ "${TARGETARCH}" = "amd64" ]; then \
|
||||
wget -O kubectl "https://dl.k8s.io/release/v1.34.1/bin/linux/amd64/kubectl"; \
|
||||
else \
|
||||
wget -O kubectl "https://dl.k8s.io/release/v1.34.1/bin/linux/arm64/kubectl"; \
|
||||
fi && \
|
||||
chmod +x kubectl && \
|
||||
mv kubectl /usr/local/bin/
|
||||
|
||||
# Создаем рабочий каталог
|
||||
WORKDIR /portforward
|
||||
|
||||
# Копируем скрипт порт-форвардинга
|
||||
COPY portforward-container.py /portforward/portforward-container.py
|
||||
|
||||
# Делаем скрипт исполняемым
|
||||
RUN chmod +x /portforward/portforward-container.py
|
||||
|
||||
# Команда по умолчанию
|
||||
CMD ["python3", "/portforward/portforward-container.py"]
|
||||
@@ -1,145 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Скрипт для работы внутри контейнера k8s-portforward
|
||||
Автор: Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
"""
|
||||
import sys
|
||||
import yaml
|
||||
import subprocess
|
||||
import time
|
||||
import os
|
||||
import signal
|
||||
import json
|
||||
|
||||
def run_kubectl_portforward(cluster_name, namespace, service, remote_port, local_port):
|
||||
"""Запускает kubectl port-forward внутри контейнера"""
|
||||
cmd = [
|
||||
"kubectl",
|
||||
f"--server=https://{cluster_name}-control-plane:6443",
|
||||
"--insecure-skip-tls-verify",
|
||||
"port-forward",
|
||||
"-n", namespace,
|
||||
service,
|
||||
f"{local_port}:{remote_port}"
|
||||
]
|
||||
|
||||
print(f"[portforward] Запуск: {' '.join(cmd)}")
|
||||
process = subprocess.Popen(
|
||||
cmd,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
text=True
|
||||
)
|
||||
|
||||
return process
|
||||
|
||||
def main():
|
||||
"""Главная функция"""
|
||||
# Загружаем preset
|
||||
preset_file = "/workspace/molecule/presets/k8s/kubernetes.yml"
|
||||
|
||||
if not os.path.exists(preset_file):
|
||||
print(f"❌ Файл {preset_file} не найден")
|
||||
print("💡 Убедитесь, что workspace подключен в контейнер")
|
||||
sys.exit(1)
|
||||
|
||||
with open(preset_file, 'r') as f:
|
||||
preset = yaml.safe_load(f)
|
||||
|
||||
cluster_name = preset['kind_clusters'][0]['name']
|
||||
addon_ports = preset['kind_clusters'][0].get('addon_ports', {})
|
||||
|
||||
print(f"🔌 Запуск порт-форвардинга для кластера: {cluster_name}")
|
||||
|
||||
processes = []
|
||||
|
||||
# Ingress HTTP
|
||||
if addon_ports.get('ingress_http'):
|
||||
port = addon_ports['ingress_http']
|
||||
print(f" - Ingress HTTP: {port} -> ingress-nginx-controller:80")
|
||||
proc = run_kubectl_portforward(
|
||||
cluster_name, "ingress-nginx",
|
||||
"svc/ingress-nginx-controller", 80, port
|
||||
)
|
||||
processes.append(proc)
|
||||
|
||||
# Ingress HTTPS
|
||||
if addon_ports.get('ingress_https'):
|
||||
port = addon_ports['ingress_https']
|
||||
print(f" - Ingress HTTPS: {port} -> ingress-nginx-controller:443")
|
||||
proc = run_kubectl_portforward(
|
||||
cluster_name, "ingress-nginx",
|
||||
"svc/ingress-nginx-controller", 443, port
|
||||
)
|
||||
processes.append(proc)
|
||||
|
||||
# Prometheus
|
||||
if addon_ports.get('prometheus'):
|
||||
port = addon_ports['prometheus']
|
||||
print(f" - Prometheus: {port} -> monitoring-kube-prometheus-prometheus:9090")
|
||||
proc = run_kubectl_portforward(
|
||||
cluster_name, "monitoring",
|
||||
"svc/monitoring-kube-prometheus-prometheus", 9090, port
|
||||
)
|
||||
processes.append(proc)
|
||||
|
||||
# Grafana
|
||||
if addon_ports.get('grafana'):
|
||||
port = addon_ports['grafana']
|
||||
print(f" - Grafana: {port} -> monitoring-grafana:80")
|
||||
proc = run_kubectl_portforward(
|
||||
cluster_name, "monitoring",
|
||||
"svc/monitoring-grafana", 80, port
|
||||
)
|
||||
processes.append(proc)
|
||||
|
||||
# Kiali
|
||||
if addon_ports.get('kiali'):
|
||||
port = addon_ports['kiali']
|
||||
print(f" - Kiali: {port} -> kiali:20001")
|
||||
proc = run_kubectl_portforward(
|
||||
cluster_name, "istio-system",
|
||||
"svc/kiali", 20001, port
|
||||
)
|
||||
processes.append(proc)
|
||||
|
||||
# Metrics Server
|
||||
if addon_ports.get('metrics_server'):
|
||||
port = addon_ports['metrics_server']
|
||||
print(f" - Metrics Server: {port} -> metrics-server:4443")
|
||||
proc = run_kubectl_portforward(
|
||||
cluster_name, "kube-system",
|
||||
"svc/metrics-server", 4443, port
|
||||
)
|
||||
processes.append(proc)
|
||||
|
||||
print("✅ Все порты запущены. Ожидание завершения...")
|
||||
print("💡 Контейнер будет работать, пока все port-forward активны")
|
||||
|
||||
# Ожидание завершения процессов
|
||||
try:
|
||||
while True:
|
||||
time.sleep(1)
|
||||
# Проверяем, что все процессы еще работают
|
||||
alive = [p for p in processes if p.poll() is None]
|
||||
if not alive:
|
||||
print("⚠️ Все port-forward завершились")
|
||||
break
|
||||
except KeyboardInterrupt:
|
||||
print("\n🛑 Получен сигнал завершения...")
|
||||
|
||||
# Завершаем все процессы
|
||||
print("🗑️ Завершение port-forward...")
|
||||
for proc in processes:
|
||||
if proc.poll() is None:
|
||||
proc.terminate()
|
||||
try:
|
||||
proc.wait(timeout=5)
|
||||
except subprocess.TimeoutExpired:
|
||||
proc.kill()
|
||||
|
||||
print("✅ Завершено")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,73 +0,0 @@
|
||||
# Kubernetes Kind Container - Multi-Arch
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
|
||||
ARG TARGETARCH
|
||||
|
||||
FROM ubuntu:22.04
|
||||
|
||||
# Обновляем систему
|
||||
RUN apt-get update && apt-get upgrade -y && apt-get clean
|
||||
|
||||
# Устанавливаем базовые пакеты
|
||||
RUN apt-get install -y \
|
||||
wget \
|
||||
curl \
|
||||
git \
|
||||
vim \
|
||||
bash \
|
||||
ca-certificates \
|
||||
python3 \
|
||||
python3-yaml \
|
||||
file \
|
||||
apt-transport-https \
|
||||
gnupg \
|
||||
lsb-release \
|
||||
&& apt-get clean
|
||||
|
||||
# Устанавливаем Docker CLI
|
||||
RUN DOCKER_VERSION=20.10.24 && \
|
||||
if [ "${TARGETARCH}" = "amd64" ]; then \
|
||||
wget -O /tmp/docker-cli.tgz "https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz" && \
|
||||
tar -xz -C /tmp -f /tmp/docker-cli.tgz && \
|
||||
mv /tmp/docker/docker /usr/local/bin/ && \
|
||||
rm -rf /tmp/docker-cli.tgz /tmp/docker; \
|
||||
else \
|
||||
wget -O /tmp/docker-cli.tgz "https://download.docker.com/linux/static/stable/aarch64/docker-${DOCKER_VERSION}.tgz" && \
|
||||
tar -xz -C /tmp -f /tmp/docker-cli.tgz && \
|
||||
mv /tmp/docker/docker /usr/local/bin/ && \
|
||||
rm -rf /tmp/docker-cli.tgz /tmp/docker; \
|
||||
fi && \
|
||||
chmod +x /usr/local/bin/docker
|
||||
|
||||
# Устанавливаем kubectl
|
||||
RUN if [ "${TARGETARCH}" = "amd64" ]; then \
|
||||
wget -O kubectl "https://dl.k8s.io/release/v1.34.1/bin/linux/amd64/kubectl"; \
|
||||
else \
|
||||
wget -O kubectl "https://dl.k8s.io/release/v1.34.1/bin/linux/arm64/kubectl"; \
|
||||
fi && \
|
||||
chmod +x kubectl && \
|
||||
mv kubectl /usr/local/bin/
|
||||
|
||||
# Устанавливаем Helm
|
||||
RUN wget https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 -O - | bash
|
||||
|
||||
# Устанавливаем Kind v0.30.0
|
||||
RUN if [ "${TARGETARCH}" = "amd64" ]; then \
|
||||
wget -O /usr/local/bin/kind "https://github.com/kubernetes-sigs/kind/releases/download/v0.30.0/kind-linux-amd64"; \
|
||||
else \
|
||||
wget -O /usr/local/bin/kind "https://github.com/kubernetes-sigs/kind/releases/download/v0.30.0/kind-linux-arm64"; \
|
||||
fi && \
|
||||
chmod +x /usr/local/bin/kind && \
|
||||
ls -lh /usr/local/bin/kind && \
|
||||
file /usr/local/bin/kind
|
||||
|
||||
# Устанавливаем Istio CLI
|
||||
RUN ARCH=$(echo ${TARGETARCH} | sed 's/amd64/x86_64/; s/arm64/aarch64/') && \
|
||||
ISTIO_VERSION=1.22.1 && \
|
||||
wget -qO- https://istio.io/downloadIstio | ISTIO_VERSION=${ISTIO_VERSION} TARGET_ARCH=${ARCH} sh - && \
|
||||
mv istio-${ISTIO_VERSION}/bin/istioctl /usr/local/bin/ && \
|
||||
rm -rf istio-${ISTIO_VERSION}
|
||||
|
||||
# Команда по умолчанию
|
||||
CMD ["sleep", "infinity"]
|
||||
@@ -1,54 +0,0 @@
|
||||
# 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"]
|
||||
@@ -1,49 +0,0 @@
|
||||
# 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"]
|
||||
@@ -1,54 +0,0 @@
|
||||
# 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"]
|
||||
@@ -1,56 +0,0 @@
|
||||
# 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"]
|
||||
@@ -1,56 +0,0 @@
|
||||
# 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"]
|
||||
@@ -1,56 +0,0 @@
|
||||
# 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"]
|
||||
@@ -1,169 +0,0 @@
|
||||
# Пресет 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-окружений с разнородной инфраструктурой.
|
||||
616
docs/api.md
Normal file
616
docs/api.md
Normal file
@@ -0,0 +1,616 @@
|
||||
# API Reference
|
||||
|
||||
## Автор
|
||||
Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
|
||||
## Описание
|
||||
|
||||
Этот документ содержит справочник по API универсальной лаборатории, включая все доступные команды, параметры и конфигурации.
|
||||
|
||||
## Содержание
|
||||
|
||||
- [Makefile команды](#makefile-команды)
|
||||
- [Пресеты API](#пресеты-api)
|
||||
- [Kubernetes API](#kubernetes-api)
|
||||
- [Docker API](#docker-api)
|
||||
- [Molecule API](#molecule-api)
|
||||
- [Отчеты API](#отчеты-api)
|
||||
- [Скрипты API](#скрипты-api)
|
||||
|
||||
## Makefile команды
|
||||
|
||||
### Основные команды
|
||||
|
||||
| Команда | Описание | Параметры |
|
||||
|---------|----------|-----------|
|
||||
| `make lab-up` | Поднять контроллер | - |
|
||||
| `make lab-down` | Погасить контроллер | - |
|
||||
| `make lab-sh` | Войти в контроллер | - |
|
||||
| `make lab-test` | Полный цикл Molecule | `SCENARIO=universal` |
|
||||
| `make lab-create` | Создать инфраструктуру | - |
|
||||
| `make lab-converge` | Запустить роли | - |
|
||||
| `make lab-verify` | Проверить работу | - |
|
||||
| `make lab-destroy` | Уничтожить инфраструктуру | - |
|
||||
| `make lab-reset` | Полный сброс | - |
|
||||
|
||||
### Kubernetes команды
|
||||
|
||||
| Команда | Описание | Параметры |
|
||||
|---------|----------|-----------|
|
||||
| `make kube-sh` | Shell с kubectl | - |
|
||||
| `make kube-cmd` | Выполнить kubectl команду | `CLUSTER=lab CMD="get pods"` |
|
||||
| `make kube-enter` | Войти в кластер | `CLUSTER=lab` |
|
||||
| `make kiali-port-forward` | Port-forward Kiali | `CLUSTER=lab` |
|
||||
| `make istio-gw-port-forward` | Port-forward Istio Gateway | `CLUSTER=lab` |
|
||||
| `make grafana-port-forward` | Port-forward Grafana | `CLUSTER=lab` |
|
||||
| `make prom-port-forward` | Port-forward Prometheus | `CLUSTER=lab` |
|
||||
| `make kube-pf-stop` | Остановить все port-forward | - |
|
||||
|
||||
### Отчеты и мониторинг
|
||||
|
||||
| Команда | Описание | Параметры |
|
||||
|---------|----------|-----------|
|
||||
| `make lab-report` | Сгенерировать HTML отчет | - |
|
||||
| `make lab-snapshot` | Сохранить снапшот | - |
|
||||
| `make lab-restore` | Восстановить из снапшота | - |
|
||||
| `make lab-cleanup` | Очистить лабораторию | - |
|
||||
| `make bookinfo-url` | Получить URL Bookinfo | - |
|
||||
| `make grafana-open` | Открыть Grafana | - |
|
||||
|
||||
### Pre-commit команды
|
||||
|
||||
| Команда | Описание | Параметры |
|
||||
|---------|----------|-----------|
|
||||
| `make pre-commit-install` | Установить pre-commit хуки | - |
|
||||
| `make pre-commit-run` | Запустить pre-commit | - |
|
||||
|
||||
## Пресеты API
|
||||
|
||||
### Структура пресета
|
||||
|
||||
```yaml
|
||||
---
|
||||
# ПРЕСЕТ: Название (количество машин)
|
||||
#
|
||||
# Описание: Подробное описание пресета
|
||||
#
|
||||
# Использование: make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/your-preset.yml
|
||||
#
|
||||
# Автор: Ваше имя
|
||||
# Сайт: https://your-site.com
|
||||
|
||||
# Сеть для лаборатории
|
||||
docker_network: labnet
|
||||
|
||||
# Kind кластеры (опционально)
|
||||
kind_clusters:
|
||||
- name: cluster-name
|
||||
workers: 2
|
||||
api_port: 6443
|
||||
addons:
|
||||
ingress_nginx: true
|
||||
metrics_server: true
|
||||
istio: true
|
||||
kiali: true
|
||||
prometheus_stack: true
|
||||
ingress_host_http_port: 8081
|
||||
ingress_host_https_port: 8443
|
||||
|
||||
# Образы для разных семейств ОС
|
||||
images:
|
||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
||||
|
||||
# Настройки по умолчанию для 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: host-name
|
||||
family: debian|rhel
|
||||
type: systemd|dind|dood
|
||||
group: group-name
|
||||
publish:
|
||||
- "host-port:container-port"
|
||||
env:
|
||||
KEY: value
|
||||
volumes:
|
||||
- "host-path:container-path"
|
||||
tmpfs:
|
||||
- "/tmp"
|
||||
capabilities:
|
||||
- "SYS_ADMIN"
|
||||
```
|
||||
|
||||
### Параметры хостов
|
||||
|
||||
| Параметр | Тип | Описание | Обязательный |
|
||||
|----------|-----|----------|--------------|
|
||||
| `name` | string | Имя хоста | Да |
|
||||
| `family` | string | Семейство ОС (debian/rhel) | Нет |
|
||||
| `type` | string | Тип контейнера (systemd/dind/dood) | Нет |
|
||||
| `group` | string | Группа хоста | Нет |
|
||||
| `publish` | array | Публикация портов | Нет |
|
||||
| `env` | object | Переменные окружения | Нет |
|
||||
| `volumes` | array | Монтирование томов | Нет |
|
||||
| `tmpfs` | array | Временные файловые системы | Нет |
|
||||
| `capabilities` | array | Capabilities | Нет |
|
||||
|
||||
### Параметры Kind кластеров
|
||||
|
||||
| Параметр | Тип | Описание | Обязательный |
|
||||
|----------|-----|----------|--------------|
|
||||
| `name` | string | Имя кластера | Да |
|
||||
| `workers` | integer | Количество worker узлов | Нет |
|
||||
| `api_port` | integer | Порт API сервера | Нет |
|
||||
| `addons` | object | Включенные аддоны | Нет |
|
||||
| `ingress_host_http_port` | integer | HTTP порт для ingress | Нет |
|
||||
| `ingress_host_https_port` | integer | HTTPS порт для ingress | Нет |
|
||||
|
||||
### Аддоны Kind кластеров
|
||||
|
||||
| Аддон | Тип | Описание |
|
||||
|-------|-----|----------|
|
||||
| `ingress_nginx` | boolean | Ingress NGINX контроллер |
|
||||
| `metrics_server` | boolean | Metrics Server для метрик |
|
||||
| `istio` | boolean | Istio service mesh |
|
||||
| `kiali` | boolean | Kiali для визуализации |
|
||||
| `prometheus_stack` | boolean | Prometheus + Grafana |
|
||||
|
||||
## Kubernetes API
|
||||
|
||||
### kubectl команды
|
||||
|
||||
```bash
|
||||
# Получить информацию о кластере
|
||||
kubectl cluster-info
|
||||
|
||||
# Получить ноды
|
||||
kubectl get nodes
|
||||
|
||||
# Получить поды
|
||||
kubectl get pods -A
|
||||
|
||||
# Получить сервисы
|
||||
kubectl get svc -A
|
||||
|
||||
# Получить события
|
||||
kubectl get events --sort-by=.metadata.creationTimestamp
|
||||
|
||||
# Описать ресурс
|
||||
kubectl describe pod <pod-name>
|
||||
|
||||
# Логи пода
|
||||
kubectl logs <pod-name>
|
||||
|
||||
# Войти в под
|
||||
kubectl exec -it <pod-name> -- /bin/sh
|
||||
```
|
||||
|
||||
### Ansible-lint команды
|
||||
|
||||
```bash
|
||||
# Проверить весь проект
|
||||
make lint
|
||||
|
||||
# Проверить роли
|
||||
make role lint
|
||||
|
||||
# Проверить конкретную роль
|
||||
ansible-lint --config-file .ansible-lint roles/my-role/
|
||||
|
||||
# Проверить playbook
|
||||
ansible-lint --config-file .ansible-lint files/playbooks/site.yml
|
||||
```
|
||||
|
||||
### Настройки ansible-lint (.ansible-lint)
|
||||
|
||||
```yaml
|
||||
skip_list:
|
||||
- fqcn # Полные имена модулей
|
||||
- yaml[new-line-at-end-of-file] # Новая строка в конце файла
|
||||
- yaml[truthy] # Булевы значения
|
||||
- yaml[line-length] # Длина строки
|
||||
- var-naming[no-role-prefix] # Префиксы переменных
|
||||
- 'ignore-errors' # Игнорирование ошибок
|
||||
|
||||
exclude_paths:
|
||||
- molecule/universal/ # Исключить файлы Molecule
|
||||
- files/playbooks/ # Исключить playbooks с Docker модулями
|
||||
```
|
||||
|
||||
**Описание пропускаемых правил:**
|
||||
- `fqcn` - позволяет использовать короткие имена модулей (например, `yum` вместо `ansible.builtin.yum`)
|
||||
- `yaml[new-line-at-end-of-file]` - не требует новой строки в конце YAML файлов
|
||||
- `yaml[truthy]` - позволяет использовать `yes/no` вместо `true/false`
|
||||
- `yaml[line-length]` - не ограничивает длину строк в YAML
|
||||
- `var-naming[no-role-prefix]` - не требует префиксов для переменных ролей
|
||||
- `ignore-errors` - позволяет использовать `ignore_errors: yes`
|
||||
|
||||
**Исключенные пути:**
|
||||
- `molecule/universal/` - файлы Molecule с Docker модулями
|
||||
- `files/playbooks/` - playbooks с Docker Compose модулями
|
||||
|
||||
### Port-forward команды
|
||||
|
||||
```bash
|
||||
# Port-forward сервиса
|
||||
kubectl port-forward svc/<service-name> <local-port>:<remote-port>
|
||||
|
||||
# Port-forward пода
|
||||
kubectl port-forward pod/<pod-name> <local-port>:<remote-port>
|
||||
|
||||
# Port-forward в фоне
|
||||
kubectl port-forward svc/<service-name> <local-port>:<remote-port> &
|
||||
|
||||
# Остановить все port-forward
|
||||
pkill -f "kubectl .* port-forward"
|
||||
```
|
||||
|
||||
### Istio команды
|
||||
|
||||
```bash
|
||||
# Проверить Istio
|
||||
istioctl version
|
||||
|
||||
# Установить Istio
|
||||
istioctl install --set profile=demo
|
||||
|
||||
# Удалить Istio
|
||||
istioctl uninstall --purge
|
||||
|
||||
# Проверить статус
|
||||
istioctl proxy-status
|
||||
|
||||
# Получить конфигурацию
|
||||
istioctl proxy-config cluster <pod-name>
|
||||
```
|
||||
|
||||
## Docker API
|
||||
|
||||
### Docker команды
|
||||
|
||||
```bash
|
||||
# Список контейнеров
|
||||
docker ps
|
||||
|
||||
# Список образов
|
||||
docker images
|
||||
|
||||
# Список сетей
|
||||
docker network ls
|
||||
|
||||
# Список томов
|
||||
docker volume ls
|
||||
|
||||
# Информация о контейнере
|
||||
docker inspect <container-name>
|
||||
|
||||
# Логи контейнера
|
||||
docker logs <container-name>
|
||||
|
||||
# Войти в контейнер
|
||||
docker exec -it <container-name> /bin/sh
|
||||
```
|
||||
|
||||
### Docker Compose команды
|
||||
|
||||
```bash
|
||||
# Запустить стек
|
||||
docker-compose up -d
|
||||
|
||||
# Остановить стек
|
||||
docker-compose down
|
||||
|
||||
# Логи стека
|
||||
docker-compose logs
|
||||
|
||||
# Масштабирование
|
||||
docker-compose up --scale service=3
|
||||
```
|
||||
|
||||
### Docker Swarm команды
|
||||
|
||||
```bash
|
||||
# Инициализировать Swarm
|
||||
docker swarm init
|
||||
|
||||
# Присоединиться к Swarm
|
||||
docker swarm join --token <token> <manager-ip>:2377
|
||||
|
||||
# Список нод
|
||||
docker node ls
|
||||
|
||||
# Создать сервис
|
||||
docker service create --name <service-name> <image>
|
||||
|
||||
# Масштабировать сервис
|
||||
docker service scale <service-name>=3
|
||||
```
|
||||
|
||||
## Molecule API
|
||||
|
||||
### Molecule команды
|
||||
|
||||
```bash
|
||||
# Создать сценарий
|
||||
molecule init scenario <scenario-name>
|
||||
|
||||
# Создать роль
|
||||
molecule init role <role-name>
|
||||
|
||||
# Проверить синтаксис
|
||||
molecule syntax
|
||||
|
||||
# Проверить конфигурацию
|
||||
molecule lint
|
||||
|
||||
# Валидация
|
||||
molecule validate
|
||||
|
||||
# Создать инфраструктуру
|
||||
molecule create
|
||||
|
||||
# Запустить роли
|
||||
molecule converge
|
||||
|
||||
# Проверить работу
|
||||
molecule verify
|
||||
|
||||
# Уничтожить инфраструктуру
|
||||
molecule destroy
|
||||
|
||||
# Полный цикл
|
||||
molecule test
|
||||
```
|
||||
|
||||
### Конфигурация molecule.yml
|
||||
|
||||
```yaml
|
||||
---
|
||||
driver:
|
||||
name: docker
|
||||
|
||||
platforms:
|
||||
- name: instance
|
||||
image: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
||||
privileged: true
|
||||
pre_build_image: true
|
||||
command: "/sbin/init"
|
||||
volumes:
|
||||
- "/sys/fs/cgroup:/sys/fs/cgroup:ro"
|
||||
capabilities:
|
||||
- "SYS_ADMIN"
|
||||
tmpfs:
|
||||
- "/run"
|
||||
- "/run/lock"
|
||||
|
||||
provisioner:
|
||||
name: ansible
|
||||
config_options:
|
||||
defaults:
|
||||
stdout_callback: default
|
||||
callbacks_enabled: profile_tasks
|
||||
env:
|
||||
ANSIBLE_STDOUT_CALLBACK: default
|
||||
|
||||
dependency:
|
||||
name: galaxy
|
||||
enabled: false
|
||||
|
||||
verifier:
|
||||
name: ansible
|
||||
|
||||
lint: |-
|
||||
set -e
|
||||
ansible-lint
|
||||
```
|
||||
|
||||
## Отчеты API
|
||||
|
||||
### HTML отчет
|
||||
|
||||
```bash
|
||||
# Генерация отчета
|
||||
python3 scripts/report_html.py <input.json> <output.html>
|
||||
|
||||
# Параметры
|
||||
# input.json - JSON файл с данными
|
||||
# output.html - HTML файл для вывода
|
||||
```
|
||||
|
||||
### JSON структура
|
||||
|
||||
```json
|
||||
{
|
||||
"timestamp": "2024-01-01T00:00:00Z",
|
||||
"idempotence_raw": "changed=0",
|
||||
"haproxy_select1": "1",
|
||||
"helm_ingress_toolbox_raw": "ingress ready",
|
||||
"istio_kiali_raw": "istio-system pods running",
|
||||
"istio_bookinfo_raw": "bookinfo deployed",
|
||||
"k8s_overview_raw": "nodes ready"
|
||||
}
|
||||
```
|
||||
|
||||
### HTML структура
|
||||
|
||||
```html
|
||||
<!doctype html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Lab Report</title>
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<style>
|
||||
/* CSS стили */
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="hdr">
|
||||
<h1>Ansible Lab Report</h1>
|
||||
<div class="time">generated: timestamp</div>
|
||||
</div>
|
||||
<div class="grid">
|
||||
<!-- Отчеты -->
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
## Скрипты API
|
||||
|
||||
### snapshot.sh
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Создание снапшотов лаборатории (запускается через Docker)
|
||||
|
||||
# Параметры
|
||||
OUT_DIR="/ansible/snapshots"
|
||||
|
||||
# Создать директорию
|
||||
mkdir -p "$OUT_DIR"
|
||||
|
||||
# Получить ID контейнеров
|
||||
ids=$(docker ps -q --filter "label=ansible.lab=true")
|
||||
|
||||
# Создать снапшоты
|
||||
for id in $ids; do
|
||||
name=$(docker inspect --format '{{.Name}}' "$id" | sed 's#^/##')
|
||||
img="lab-snap-$name:latest"
|
||||
echo "[snapshot] $name -> $img"
|
||||
docker commit "$id" "$img" >/dev/null
|
||||
echo "$img" > "$OUT_DIR/$name.image"
|
||||
done
|
||||
```
|
||||
|
||||
### restore.sh
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Восстановление из снапшотов (запускается через Docker)
|
||||
|
||||
# Параметры
|
||||
IN_DIR="/ansible/snapshots"
|
||||
|
||||
# Проверить директорию
|
||||
[ -d "$IN_DIR" ] || { echo "No snapshots dir"; exit 1; }
|
||||
|
||||
# Восстановить контейнеры
|
||||
for f in "$IN_DIR"/*.image; do
|
||||
[ -f "$f" ] || continue
|
||||
name=$(basename "$f" .image)
|
||||
img=$(cat "$f")
|
||||
echo "[restore] $name from $img"
|
||||
docker rm -f "$name" >/dev/null 2>&1 || true
|
||||
docker run -d --name "$name" "$img" >/dev/null
|
||||
done
|
||||
```
|
||||
|
||||
### cleanup.sh
|
||||
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# Очистка лаборатории (запускается через Docker)
|
||||
|
||||
echo "[cleanup] removing lab containers/volumes/networks"
|
||||
|
||||
# Удалить контейнеры
|
||||
docker ps -aq --filter "label=ansible.lab=true" | xargs -r docker rm -f
|
||||
|
||||
# Удалить тома
|
||||
docker volume ls -q --filter "name=_docker$" | xargs -r docker volume rm
|
||||
|
||||
# Удалить сеть
|
||||
docker network rm labnet >/dev/null 2>&1 || true
|
||||
|
||||
echo "done."
|
||||
```
|
||||
|
||||
## Переменные окружения
|
||||
|
||||
### Основные переменные
|
||||
|
||||
| Переменная | Описание | Значение по умолчанию |
|
||||
|------------|----------|----------------------|
|
||||
| `LAB_SPEC` | Путь к пресету | `molecule/presets/minimal.yml` |
|
||||
| `SCENARIO` | Сценарий Molecule | `universal` |
|
||||
| `COMPOSE` | Docker Compose команда | `docker compose` |
|
||||
| `ROLES_DIR` | Директория с ролями | `./roles` |
|
||||
| `LAB_PAUSE_MINUTES` | Пауза для ручной проверки | `10` |
|
||||
|
||||
### Kubernetes переменные
|
||||
|
||||
| Переменная | Описание | Значение по умолчанию |
|
||||
|------------|----------|----------------------|
|
||||
| `KUBECONFIG` | Путь к kubeconfig | `~/.kube/config` |
|
||||
| `KUBE_CONTEXT` | Контекст Kubernetes | `kind-lab` |
|
||||
| `ISTIO_VERSION` | Версия Istio | `1.22.1` |
|
||||
| `KIND_VERSION` | Версия Kind | `v0.23.0` |
|
||||
|
||||
### Docker переменные
|
||||
|
||||
| Переменная | Описание | Значение по умолчанию |
|
||||
|------------|----------|----------------------|
|
||||
| `DOCKER_HOST` | Docker daemon адрес | `unix:///var/run/docker.sock` |
|
||||
| `DOCKER_TLS_CERTDIR` | Директория TLS сертификатов | `""` |
|
||||
| `DOCKER_BUILDKIT` | Использовать BuildKit | `1` |
|
||||
|
||||
## Конфигурационные файлы
|
||||
|
||||
### docker-compose.yaml
|
||||
|
||||
```yaml
|
||||
version: "3.9"
|
||||
|
||||
services:
|
||||
ansible-controller:
|
||||
image: quay.io/ansible/creator-ee:latest
|
||||
container_name: ansible-controller
|
||||
privileged: true
|
||||
command: sleep infinity
|
||||
environment:
|
||||
DOCKER_HOST: unix:///var/run/docker.sock
|
||||
ANSIBLE_VAULT_PASSWORD_FILE: /ansible/vault-password.txt
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
- ./molecule:/ansible/molecule
|
||||
- ./files:/ansible/files
|
||||
- ./vault-password.txt:/ansible/vault-password.txt
|
||||
- ${ROLES_DIR:-./roles}:/ansible/roles:ro
|
||||
working_dir: /ansible
|
||||
```
|
||||
|
||||
### .pre-commit-config.yaml
|
||||
|
||||
```yaml
|
||||
repos:
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v4.4.0
|
||||
hooks:
|
||||
- id: trailing-whitespace
|
||||
- id: end-of-file-fixer
|
||||
- id: check-yaml
|
||||
- id: check-added-large-files
|
||||
- repo: https://github.com/ansible/ansible-lint
|
||||
rev: v6.17.2
|
||||
hooks:
|
||||
- id: ansible-lint
|
||||
```
|
||||
|
||||
## Заключение
|
||||
|
||||
Этот справочник содержит все необходимые API для работы с универсальной лабораторией. Для получения дополнительной информации обратитесь к [основной документации](universal-lab.md) и [примерам использования](examples.md).
|
||||
@@ -1,98 +0,0 @@
|
||||
# Исправления проблем с 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
|
||||
@@ -1,913 +0,0 @@
|
||||
# Настройка CI/CD для DevOpsLab
|
||||
|
||||
**Автор:** Сергей Антропов
|
||||
**Сайт:** 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 для DevOpsLab..."
|
||||
|
||||
# Создание директории .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
|
||||
@@ -1,538 +0,0 @@
|
||||
# Создание и разработка ролей для DevOpsLab
|
||||
|
||||
**Автор:** Сергей Антропов
|
||||
**Сайт:** https://devops.org.ru
|
||||
**Версия:** 3.0.0
|
||||
|
||||
## 🚀 Быстрый старт
|
||||
|
||||
### Интерактивное управление ролями
|
||||
|
||||
```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
|
||||
# Введите имя роли: my-role
|
||||
|
||||
# Система автоматически:
|
||||
# - Создаст структуру папок
|
||||
# - Создаст все необходимые файлы
|
||||
# - Обновит 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
|
||||
|
||||
# Добавление роли в roles/deploy.yml вручную
|
||||
```
|
||||
|
||||
## 📝 Разработка роли
|
||||
|
||||
### 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: Моя кастомная роль для DevOpsLab
|
||||
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,520 +0,0 @@
|
||||
# Кастомизация 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)
|
||||
@@ -1,455 +0,0 @@
|
||||
# Docker образы DevOpsLab
|
||||
|
||||
**Автор:** Сергей Антропов
|
||||
**Сайт:** https://devops.org.ru
|
||||
**Версия:** 3.0.0
|
||||
|
||||
## 🐳 Обзор
|
||||
|
||||
DevOpsLab использует предварительно собранные Docker образы для различных операционных систем с полной поддержкой systemd. Все образы поддерживают multi-arch сборку и автоматически публикуются в Docker Hub под namespace `inecs/ansible-lab`.
|
||||
|
||||
## 📁 Структура dockerfiles/
|
||||
|
||||
```
|
||||
dockerfiles/
|
||||
├── ansible-controller/ # Ansible контроллер
|
||||
│ ├── Dockerfile
|
||||
│ ├── docker-compose.yml
|
||||
│ ├── requirements.txt
|
||||
│ └── requirements.yml
|
||||
├── k8s/ # Kubernetes контроллер (Kind, kubectl, Helm, Istio)
|
||||
│ └── Dockerfile
|
||||
├── k8s-portforward/ # Port-forward контейнер (устаревший)
|
||||
│ ├── Dockerfile
|
||||
│ └── portforward-container.py
|
||||
├── alt-linux/ # ALT Linux P9
|
||||
├── astra-linux/ # Astra Linux 1.7
|
||||
├── redos/ # RED OS 9
|
||||
├── rhel/ # Red Hat Enterprise Linux 8
|
||||
├── centos7/ # CentOS 7
|
||||
├── centos8/ # CentOS 8
|
||||
├── centos9/ # CentOS Stream 9
|
||||
├── alma/ # AlmaLinux 8
|
||||
├── rocky/ # Rocky Linux 8
|
||||
├── ubuntu20/ # Ubuntu 20.04 LTS
|
||||
├── ubuntu22/ # Ubuntu 22.04 LTS
|
||||
├── ubuntu24/ # Ubuntu 24.04 LTS
|
||||
├── debian9/ # Debian 9 Stretch
|
||||
├── debian10/ # Debian 10 Buster
|
||||
├── debian11/ # Debian 11 Bullseye
|
||||
├── debian12/ # Debian 12 Bookworm
|
||||
└── README.md # Документация по Dockerfiles
|
||||
```
|
||||
|
||||
## 🚀 Доступные образы
|
||||
|
||||
### ansible-controller
|
||||
|
||||
**Базовый образ:** `ubuntu:22.04`
|
||||
**Теги:** `inecs/ansible-lab:ansible-controller-latest`
|
||||
**Платформы:** linux/amd64, linux/arm64
|
||||
|
||||
Ansible контроллер с предустановленными коллекциями и инструментами для разработки и тестирования.
|
||||
|
||||
#### Компоненты:
|
||||
- Ansible Core с последними коллекциями
|
||||
- Docker CLI для работы с контейнерами
|
||||
- yq для работы с YAML
|
||||
- jq для работы с JSON
|
||||
- Molecule для тестирования ролей
|
||||
|
||||
**Примечание:** Kubernetes инструменты (kubectl, Helm, Kind, Istio) были перенесены в отдельный образ `k8s`.
|
||||
|
||||
#### Предустановленные коллекции:
|
||||
```yaml
|
||||
collections:
|
||||
- name: community.docker
|
||||
version: ">=3.0.0"
|
||||
- name: community.general
|
||||
version: ">=7.0.0"
|
||||
- name: ansible.posix
|
||||
version: ">=1.5.4"
|
||||
- name: kubernetes.core
|
||||
version: ">=2.0.0"
|
||||
```
|
||||
|
||||
#### Использование:
|
||||
```bash
|
||||
# Запуск контроллера
|
||||
docker run -it --rm \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||
-v $(pwd):/workspace \
|
||||
-w /workspace \
|
||||
inecs/ansible-lab:ansible-controller-latest
|
||||
|
||||
# Выполнение команды
|
||||
docker run --rm \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||
-v $(pwd):/workspace \
|
||||
-w /workspace \
|
||||
inecs/ansible-lab:ansible-controller-latest \
|
||||
ansible-playbook site.yml
|
||||
```
|
||||
|
||||
### k8s
|
||||
|
||||
**Базовый образ:** `ubuntu:22.04`
|
||||
**Теги:** `inecs/ansible-lab:k8s-latest`
|
||||
**Платформы:** linux/amd64, linux/arm64
|
||||
|
||||
Kubernetes контроллер с инструментами для работы с Kubernetes, Helm, Istio и Kind кластерами.
|
||||
|
||||
#### Компоненты:
|
||||
- **Docker CLI** (20.10.24) для работы с контейнерами
|
||||
- **kubectl** (1.34.1) для управления Kubernetes
|
||||
- **Helm** (latest) для управления пакетами Kubernetes
|
||||
- **Kind** (0.30.0) для локальных Kubernetes кластеров
|
||||
- **Istio CLI** (1.22.1) для управления Service Mesh
|
||||
- Python 3 с модулем yaml для выполнения скриптов
|
||||
|
||||
#### Использование:
|
||||
```bash
|
||||
# Создание Kind кластера
|
||||
docker run -it --rm \
|
||||
--name k8s-controller \
|
||||
--network kind \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock:rw \
|
||||
inecs/ansible-lab:k8s-latest \
|
||||
kind create cluster --name lab
|
||||
|
||||
# Выполнение kubectl команд
|
||||
docker exec k8s-controller kubectl get nodes
|
||||
|
||||
# Установка Helm релиза
|
||||
docker exec k8s-controller helm install prometheus prometheus-community/kube-prometheus-stack
|
||||
```
|
||||
|
||||
**Примечание:** Этот образ используется автоматически при выполнении `make k8s` команд. Контейнер запускается с именем `k8s-controller` и подключен к Docker daemon хоста.
|
||||
|
||||
### Ubuntu
|
||||
|
||||
**Базовые образы:**
|
||||
- `ubuntu:20.04` → `inecs/ansible-lab:ubuntu20-latest`
|
||||
- `ubuntu:22.04` → `inecs/ansible-lab:ubuntu22-latest`
|
||||
- `ubuntu:24.04` → `inecs/ansible-lab:ubuntu24-latest`
|
||||
|
||||
**Платформы:** linux/amd64, linux/arm64
|
||||
|
||||
Ubuntu LTS с systemd.
|
||||
|
||||
#### Компоненты:
|
||||
- systemd для управления сервисами
|
||||
- Python 3 с pip
|
||||
- Пользователь ansible с sudo правами
|
||||
- Основные утилиты (curl, wget, git, vim, nano, htop, tree, jq)
|
||||
- **Примечание**: Docker CE и Docker Compose не установлены (закомментированы в Dockerfile)
|
||||
|
||||
#### Использование:
|
||||
```bash
|
||||
docker run -d --privileged \
|
||||
--name ubuntu-test \
|
||||
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
|
||||
--tmpfs /run --tmpfs /run/lock \
|
||||
--cap-add SYS_ADMIN \
|
||||
inecs/ansible-lab:ubuntu22-latest
|
||||
```
|
||||
|
||||
### Debian
|
||||
|
||||
**Базовые образы:**
|
||||
- `debian:9` → `inecs/ansible-lab:debian9-latest`
|
||||
- `debian:10` → `inecs/ansible-lab:debian10-latest`
|
||||
- `debian:11` → `inecs/ansible-lab:debian11-latest`
|
||||
- `debian:bookworm` → `inecs/ansible-lab:debian12-latest`
|
||||
|
||||
**Платформы:** linux/amd64, linux/arm64
|
||||
|
||||
Debian с systemd.
|
||||
|
||||
#### Компоненты:
|
||||
- systemd для управления сервисами
|
||||
- Python 3 с pip
|
||||
- Пользователь ansible с sudo правами
|
||||
- Основные утилиты
|
||||
- **Примечание**: Docker CE и Docker Compose не установлены
|
||||
|
||||
#### Использование:
|
||||
```bash
|
||||
docker run -d --privileged \
|
||||
--name debian-test \
|
||||
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
|
||||
--tmpfs /run --tmpfs /run/lock \
|
||||
--cap-add SYS_ADMIN \
|
||||
inecs/ansible-lab:debian12-latest
|
||||
```
|
||||
|
||||
### CentOS
|
||||
|
||||
**Базовые образы:**
|
||||
- `centos:7` → `inecs/ansible-lab:centos7-latest`
|
||||
- `quay.io/centos/centos:8` → `inecs/ansible-lab:centos8-latest`
|
||||
- `quay.io/centos/centos:stream9` → `inecs/ansible-lab:centos9-latest`
|
||||
|
||||
**Платформы:** linux/amd64, linux/arm64
|
||||
|
||||
CentOS с systemd.
|
||||
|
||||
#### Компоненты:
|
||||
- systemd для управления сервисами
|
||||
- Python 3 с pip
|
||||
- Пользователь ansible с sudo правами
|
||||
- Основные утилиты
|
||||
- **Примечание**: Docker CE и Docker Compose не установлены
|
||||
|
||||
#### Использование:
|
||||
```bash
|
||||
docker run -d --privileged \
|
||||
--name centos-test \
|
||||
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
|
||||
--tmpfs /run --tmpfs /run/lock \
|
||||
--cap-add SYS_ADMIN \
|
||||
inecs/ansible-lab:centos9-latest
|
||||
```
|
||||
|
||||
### AlmaLinux
|
||||
|
||||
**Базовый образ:** `almalinux:8`
|
||||
**Тег:** `inecs/ansible-lab:alma-latest`
|
||||
**Платформы:** linux/amd64, linux/arm64
|
||||
|
||||
AlmaLinux 8 с systemd.
|
||||
|
||||
### Rocky Linux
|
||||
|
||||
**Базовый образ:** `rockylinux:8`
|
||||
**Тег:** `inecs/ansible-lab:rocky-latest`
|
||||
**Платформы:** linux/amd64, linux/arm64
|
||||
|
||||
Rocky Linux 8 с systemd.
|
||||
|
||||
### Red Hat Enterprise Linux
|
||||
|
||||
**Базовый образ:** `registry.access.redhat.com/ubi8/ubi`
|
||||
**Тег:** `inecs/ansible-lab:rhel-latest`
|
||||
**Платформы:** linux/amd64, linux/arm64
|
||||
|
||||
Red Hat Enterprise Linux 8 с systemd.
|
||||
|
||||
### ALT Linux
|
||||
|
||||
**Базовый образ:** `altlinux/p9`
|
||||
**Тег:** `inecs/ansible-lab:alt-linux-latest`
|
||||
**Платформы:** linux/amd64 (ограничение базового образа)
|
||||
|
||||
ALT Linux P9 с systemd.
|
||||
|
||||
### Astra Linux
|
||||
|
||||
**Базовый образ:** `registry.astralinux.ru/library/astra/ubi17:1.7.6.uu2`
|
||||
**Тег:** `inecs/ansible-lab:astra-linux-latest`
|
||||
**Платформы:** linux/amd64 (ограничение базового образа)
|
||||
|
||||
Astra Linux 1.7 с systemd.
|
||||
|
||||
### RED OS
|
||||
|
||||
**Базовый образ:** `registry.red-soft.ru/ubi7/ubi`
|
||||
**Тег:** `inecs/ansible-lab:redos-latest`
|
||||
**Платформы:** linux/amd64 (ограничение базового образа)
|
||||
|
||||
RED OS 9 с systemd.
|
||||
|
||||
## 🔨 Сборка образов
|
||||
|
||||
### Сборка всех образов
|
||||
|
||||
```bash
|
||||
# Собрать все образы (multi-arch)
|
||||
make docker build
|
||||
|
||||
# Пересборка с очисткой кеша
|
||||
make docker rebuild
|
||||
|
||||
# Сборка конкретного образа
|
||||
make docker build-image IMAGE=centos7
|
||||
```
|
||||
|
||||
### Поддерживаемые платформы
|
||||
|
||||
По умолчанию все образы собираются для следующих платформ:
|
||||
- `linux/amd64` - 64-bit x86
|
||||
- `linux/arm64` - 64-bit ARM
|
||||
|
||||
Дополнительные платформы (опционально):
|
||||
- `linux/riscv64` - RISC-V 64-bit
|
||||
- `linux/ppc64le` - PowerPC 64-bit LE
|
||||
- `linux/s390x` - IBM Z
|
||||
- `linux/386` - 32-bit x86
|
||||
- `linux/arm/v7` - ARM v7
|
||||
- `linux/arm/v6` - ARM v6
|
||||
|
||||
### Тегирование
|
||||
|
||||
Все образы автоматически получают теги:
|
||||
- `inecs/ansible-lab:<имя>-<версия>` - версионированный тег
|
||||
- `inecs/ansible-lab:<имя>-latest` - последняя версия
|
||||
|
||||
Например:
|
||||
- `inecs/ansible-lab:centos9-9.0`
|
||||
- `inecs/ansible-lab:centos9-latest`
|
||||
- `inecs/ansible-lab:ubuntu22-22.04`
|
||||
- `inecs/ansible-lab:ubuntu22-latest`
|
||||
|
||||
## 📤 Публикация в Docker Hub
|
||||
|
||||
### Требования
|
||||
|
||||
1. Авторизация в Docker Hub:
|
||||
```bash
|
||||
docker login
|
||||
```
|
||||
|
||||
2. Настройка билд-ксер (buildx) для multi-arch:
|
||||
```bash
|
||||
make docker setup-builder
|
||||
```
|
||||
|
||||
### Публикация
|
||||
|
||||
```bash
|
||||
# Публикация всех образов
|
||||
make docker push
|
||||
|
||||
# Публикация конкретного образа
|
||||
make docker build-image IMAGE=centos7
|
||||
# (публикуется автоматически при сборке)
|
||||
```
|
||||
|
||||
## 🧪 Использование в Molecule
|
||||
|
||||
### Preset конфигурация
|
||||
|
||||
```yaml
|
||||
# molecule/presets/my-preset.yml
|
||||
images:
|
||||
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
|
||||
centos9: "inecs/ansible-lab:centos9-latest"
|
||||
debian12: "inecs/ansible-lab:debian12-latest"
|
||||
|
||||
hosts:
|
||||
- name: web1
|
||||
family: ubuntu22
|
||||
groups: [web, test]
|
||||
- name: db1
|
||||
family: centos9
|
||||
groups: [database, test]
|
||||
```
|
||||
|
||||
### Тестирование с preset
|
||||
|
||||
```bash
|
||||
# Использование preset в тестах
|
||||
MOLECULE_PRESET=my-preset make role test
|
||||
|
||||
# Или напрямую
|
||||
make role test my-preset
|
||||
```
|
||||
|
||||
## 🔧 Особенности образов
|
||||
|
||||
### Поддержка systemd
|
||||
|
||||
Все образы настроены для работы с systemd в контейнере:
|
||||
|
||||
```bash
|
||||
docker run -d --privileged \
|
||||
--tmpfs /run --tmpfs /run/lock \
|
||||
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
|
||||
--cap-add SYS_ADMIN \
|
||||
inecs/ansible-lab:ubuntu22-latest
|
||||
```
|
||||
|
||||
### Настройки по умолчанию
|
||||
|
||||
- **Пользователь ansible**: пароль `ansible`, sudo без пароля
|
||||
- **SSH доступ**: включен для пользователя ansible
|
||||
- **systemd**: multi-user.target по умолчанию
|
||||
- **Временные файловые системы**: `/run`, `/run/lock`
|
||||
- **Volumes**: `/sys/fs/cgroup`
|
||||
|
||||
### Docker внутри Docker
|
||||
|
||||
Все образы поддерживают запуск Docker внутри контейнера:
|
||||
|
||||
```bash
|
||||
docker run -d --privileged \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
|
||||
--tmpfs /run --tmpfs /run/lock \
|
||||
--cap-add SYS_ADMIN \
|
||||
inecs/ansible-lab:centos9-latest
|
||||
```
|
||||
|
||||
## 📋 Матрица совместимости
|
||||
|
||||
| Образ | Платформы | systemd | Docker | Python 3 | Kubernetes Tools |
|
||||
|-------|-----------|---------|--------|----------|------------------|
|
||||
| ansible-controller | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||
| k8s | amd64, arm64 | ❌ | ✅ | ✅ | ✅ (kubectl, Helm, Kind, Istio) |
|
||||
| ubuntu20/22/24 | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||
| debian9/10/11/12 | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||
| centos7/8/9 | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||
| alma | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||
| rocky | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||
| rhel | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||
| alt-linux | amd64 | ✅ | ✅ | ✅ | ❌ |
|
||||
| astra-linux | amd64 | ✅ | ✅ | ✅ | ❌ |
|
||||
| redos | amd64 | ✅ | ✅ | ✅ | ❌ |
|
||||
|
||||
## 🛠️ Управление образами
|
||||
|
||||
### Проверка наличия образов
|
||||
|
||||
```bash
|
||||
# Проверка локальных образов
|
||||
docker images | grep inecs/ansible-lab
|
||||
|
||||
# Проверка в Molecule
|
||||
make custom-images check
|
||||
```
|
||||
|
||||
### Обновление образов
|
||||
|
||||
```bash
|
||||
# Загрузить свежие образы
|
||||
make docker pull
|
||||
|
||||
# Пересобрать с обновлениями
|
||||
make docker rebuild
|
||||
|
||||
# Полное обновление
|
||||
make docker update
|
||||
```
|
||||
|
||||
### Очистка
|
||||
|
||||
```bash
|
||||
# Удалить локальные образы
|
||||
make docker clean
|
||||
|
||||
# Полная очистка
|
||||
make docker purge
|
||||
```
|
||||
|
||||
## 📚 Дополнительная информация
|
||||
|
||||
- [Структура dockerfiles/](../dockerfiles/)
|
||||
- [Makefile команды](../README.md#-управление-docker-образами)
|
||||
- [Preset система](molecule-guide.md#preset-система)
|
||||
- [CI/CD конфигурация](cicd-setup.md)
|
||||
|
||||
## 🔗 Полезные ссылки
|
||||
|
||||
- **Docker Hub**: https://hub.docker.com/r/inecs/ansible-lab
|
||||
- **DevOpsLab**: https://devops.org.ru
|
||||
- **Документация**: https://github.com/DevOpsLab/docs
|
||||
685
docs/examples.md
685
docs/examples.md
@@ -1,325 +1,462 @@
|
||||
# Примеры использования DevOpsLab
|
||||
# Примеры использования
|
||||
|
||||
**Автор:** Сергей Антропов
|
||||
**Сайт:** https://devops.org.ru
|
||||
**Версия:** 3.0.0
|
||||
## Автор
|
||||
Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
|
||||
## Быстрый старт
|
||||
## Описание
|
||||
|
||||
### Базовое тестирование роли
|
||||
Этот документ содержит практические примеры использования универсальной лаборатории для различных сценариев тестирования Ansible ролей.
|
||||
|
||||
## Содержание
|
||||
|
||||
- [Базовые примеры](#базовые-примеры)
|
||||
- [Kubernetes примеры](#kubernetes-примеры)
|
||||
- [Docker примеры](#docker-примеры)
|
||||
- [Смешанные примеры](#смешанные-примеры)
|
||||
- [Мониторинг и отчеты](#мониторинг-и-отчеты)
|
||||
- [Troubleshooting](#troubleshooting)
|
||||
|
||||
## Базовые примеры
|
||||
|
||||
### Пример 1: Тестирование веб-сервера
|
||||
|
||||
```bash
|
||||
# Тестирование роли ping с minimal preset (1 хост)
|
||||
make role test minimal
|
||||
# Запустить веб-приложение пресет
|
||||
make lab-test LAB_SPEC=molecule/presets/webapp.yml
|
||||
|
||||
# Тестирование роли docker с default preset (2 хоста)
|
||||
make role lint docker
|
||||
make role test docker
|
||||
# Проверить статус
|
||||
make lab-verify
|
||||
|
||||
# Посмотреть отчет
|
||||
make lab-report
|
||||
```
|
||||
|
||||
### Просмотр доступных preset'ов
|
||||
### Пример 2: Тестирование базы данных
|
||||
|
||||
```bash
|
||||
# Список всех preset'ов
|
||||
make presets list
|
||||
# Запустить пресет с базой данных
|
||||
make lab-test LAB_SPEC=molecule/presets/ha.yml
|
||||
|
||||
# Информация о конкретном preset'е
|
||||
make presets info PRESET=default
|
||||
make presets info PRESET=all-images
|
||||
# Проверить подключение к БД
|
||||
make kube-cmd CLUSTER=lab CMD="exec -it postgres-0 -- psql -U postgres -c 'SELECT 1;'"
|
||||
```
|
||||
|
||||
## Пример 1: Тестирование роли Docker
|
||||
|
||||
### Описание
|
||||
Тестирование универсальной роли Docker на разных ОС.
|
||||
### Пример 3: Тестирование микросервисов
|
||||
|
||||
```bash
|
||||
# Lint проверка
|
||||
make role lint docker
|
||||
# Запустить микросервисный пресет
|
||||
make lab-test LAB_SPEC=molecule/presets/microservices.yml
|
||||
|
||||
# Тестирование с minimal preset (1 хост Debian)
|
||||
make role test minimal
|
||||
|
||||
# Тестирование с default preset (Ubuntu + Debian)
|
||||
make role test default
|
||||
|
||||
# Тестирование с preset all-images (16 хостов, все ОС)
|
||||
make role test all-images
|
||||
# Проверить API Gateway
|
||||
curl http://localhost:8000/health
|
||||
```
|
||||
|
||||
### Проверка результатов
|
||||
## Kubernetes примеры
|
||||
|
||||
### Пример 1: Простой Kubernetes кластер
|
||||
|
||||
```bash
|
||||
# Просмотр созданных контейнеров
|
||||
docker ps -a --filter "network=labnet"
|
||||
# Запустить одиночный Kind кластер
|
||||
make lab-test LAB_SPEC=molecule/presets/k8s-single.yml
|
||||
|
||||
# Просмотр логов контейнера
|
||||
docker logs $(docker ps -aq --filter "network=labnet" | head -1)
|
||||
# Войти в кластер
|
||||
make kube-sh
|
||||
|
||||
# Вход в контейнер для проверки
|
||||
docker exec -it $(docker ps -aq --filter "network=labnet" | head -1) bash
|
||||
# Проверить ноды
|
||||
kubectl get nodes
|
||||
|
||||
# Проверить поды
|
||||
kubectl get pods -A
|
||||
```
|
||||
|
||||
## Пример 2: Создание собственной роли
|
||||
|
||||
### Создание роли
|
||||
### Пример 2: Мульти-кластерная конфигурация
|
||||
|
||||
```bash
|
||||
# Интерактивное создание новой роли
|
||||
make role create
|
||||
# Введите имя роли: nginx
|
||||
# Запустить мульти-кластер
|
||||
make lab-test LAB_SPEC=molecule/presets/k8s-multi.yml
|
||||
|
||||
# Редактирование роли
|
||||
cd roles/nginx
|
||||
nano tasks/main.yml
|
||||
# Переключиться между кластерами
|
||||
kubectl config use-context kind-dev
|
||||
kubectl get nodes
|
||||
|
||||
kubectl config use-context kind-staging
|
||||
kubectl get nodes
|
||||
|
||||
kubectl config use-context kind-prod
|
||||
kubectl get nodes
|
||||
```
|
||||
|
||||
### Разработка роли
|
||||
### Пример 3: Istio Service Mesh
|
||||
|
||||
**`roles/nginx/tasks/main.yml`:**
|
||||
```yaml
|
||||
```bash
|
||||
# Запустить полный Istio стек
|
||||
make lab-test LAB_SPEC=molecule/presets/k8s-istio-full.yml
|
||||
|
||||
# Port-forward Kiali
|
||||
make kiali-port-forward CLUSTER=istio-full
|
||||
|
||||
# Port-forward Istio Gateway
|
||||
make istio-gw-port-forward CLUSTER=istio-full
|
||||
|
||||
# Открыть Kiali
|
||||
open http://localhost:20001
|
||||
|
||||
# Открыть Bookinfo
|
||||
open http://localhost:8082/productpage
|
||||
```
|
||||
|
||||
### Пример 4: Мониторинг Kubernetes
|
||||
|
||||
```bash
|
||||
# Port-forward Grafana
|
||||
make grafana-port-forward CLUSTER=istio-full
|
||||
|
||||
# Port-forward Prometheus
|
||||
make prom-port-forward CLUSTER=istio-full
|
||||
|
||||
# Открыть Grafana
|
||||
open http://localhost:3000
|
||||
|
||||
# Открыть Prometheus
|
||||
open http://localhost:9090
|
||||
```
|
||||
|
||||
## Docker примеры
|
||||
|
||||
### Пример 1: Docker-in-Docker
|
||||
|
||||
```bash
|
||||
# Запустить DinD пресет
|
||||
make lab-test LAB_SPEC=molecule/presets/dind-simple.yml
|
||||
|
||||
# Войти в DinD контейнер
|
||||
docker exec -it dind1 sh
|
||||
|
||||
# Внутри контейнера проверить Docker
|
||||
docker ps
|
||||
docker images
|
||||
```
|
||||
|
||||
### Пример 2: Docker Swarm
|
||||
|
||||
```bash
|
||||
# Запустить Docker Swarm пресет
|
||||
make lab-test LAB_SPEC=molecule/presets/dind-swarm.yml
|
||||
|
||||
# Войти в manager
|
||||
docker exec -it swarm-manager sh
|
||||
|
||||
# Инициализировать Swarm
|
||||
docker swarm init
|
||||
|
||||
# Присоединить workers
|
||||
docker node ls
|
||||
```
|
||||
|
||||
### Пример 3: Docker Compose
|
||||
|
||||
```bash
|
||||
# Запустить Compose пресет
|
||||
make lab-test LAB_SPEC=molecule/presets/dind-compose.yml
|
||||
|
||||
# Войти в compose контейнер
|
||||
docker exec -it compose-web sh
|
||||
|
||||
# Создать docker-compose.yml
|
||||
cat > docker-compose.yml << EOF
|
||||
version: '3.8'
|
||||
services:
|
||||
web:
|
||||
image: nginx:alpine
|
||||
ports:
|
||||
- "80:80"
|
||||
api:
|
||||
image: node:alpine
|
||||
ports:
|
||||
- "3000:3000"
|
||||
EOF
|
||||
|
||||
# Запустить стек
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### Пример 4: Docker-outside-of-Docker
|
||||
|
||||
```bash
|
||||
# Запустить DOoD пресет
|
||||
make lab-test LAB_SPEC=molecule/presets/dood-simple.yml
|
||||
|
||||
# Войти в DOoD контейнер
|
||||
docker exec -it dood1 sh
|
||||
|
||||
# Проверить доступ к Docker daemon хоста
|
||||
docker ps
|
||||
docker images
|
||||
```
|
||||
|
||||
## Смешанные примеры
|
||||
|
||||
### Пример 1: Kubernetes + DinD
|
||||
|
||||
```bash
|
||||
# Запустить смешанный пресет
|
||||
make lab-test LAB_SPEC=molecule/presets/mixed-k8s-dind.yml
|
||||
|
||||
# Проверить Kubernetes
|
||||
make kube-cmd CLUSTER=hybrid CMD="get nodes"
|
||||
|
||||
# Проверить DinD
|
||||
docker exec -it dind-dev sh
|
||||
docker ps
|
||||
```
|
||||
|
||||
### Пример 2: Kubernetes + DOoD
|
||||
|
||||
```bash
|
||||
# Запустить смешанный пресет
|
||||
make lab-test LAB_SPEC=molecule/presets/mixed-k8s-dood.yml
|
||||
|
||||
# Проверить Kubernetes
|
||||
make kube-cmd CLUSTER=hybrid CMD="get pods -A"
|
||||
|
||||
# Проверить DOoD
|
||||
docker exec -it dood-web sh
|
||||
docker ps
|
||||
```
|
||||
|
||||
### Пример 3: Полная гибридная конфигурация
|
||||
|
||||
```bash
|
||||
# Запустить полный смешанный пресет
|
||||
make lab-test LAB_SPEC=molecule/presets/mixed-full.yml
|
||||
|
||||
# Проверить все компоненты
|
||||
make kube-cmd CLUSTER=full-stack CMD="get nodes"
|
||||
docker exec -it dind-dev sh
|
||||
docker exec -it dood-web sh
|
||||
```
|
||||
|
||||
## Мониторинг и отчеты
|
||||
|
||||
### Пример 1: Генерация HTML отчета
|
||||
|
||||
```bash
|
||||
# Запустить тест
|
||||
make lab-test LAB_SPEC=molecule/presets/enterprise.yml
|
||||
|
||||
# Сгенерировать отчет
|
||||
make lab-report
|
||||
|
||||
# Открыть отчет
|
||||
open reports/lab-report.html
|
||||
```
|
||||
|
||||
### Пример 2: Снапшоты
|
||||
|
||||
```bash
|
||||
# Создать снапшот
|
||||
make lab-snapshot
|
||||
|
||||
# Восстановить из снапшота
|
||||
make lab-restore
|
||||
|
||||
# Очистить лабораторию
|
||||
make lab-cleanup
|
||||
```
|
||||
|
||||
### Пример 3: Мониторинг в реальном времени
|
||||
|
||||
```bash
|
||||
# Port-forward всех сервисов мониторинга
|
||||
make grafana-port-forward CLUSTER=lab
|
||||
make prom-port-forward CLUSTER=lab
|
||||
make kiali-port-forward CLUSTER=lab
|
||||
|
||||
# Открыть все дашборды
|
||||
open http://localhost:3000 # Grafana
|
||||
open http://localhost:9090 # Prometheus
|
||||
open http://localhost:20001 # Kiali
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Пример 1: Проблемы с портами
|
||||
|
||||
```bash
|
||||
# Проверить занятые порты
|
||||
netstat -tulpn | grep :8080
|
||||
|
||||
# Остановить все port-forward
|
||||
make kube-pf-stop
|
||||
|
||||
# Перезапустить лабораторию
|
||||
make lab-reset
|
||||
```
|
||||
|
||||
### Пример 2: Проблемы с Docker
|
||||
|
||||
```bash
|
||||
# Проверить Docker daemon
|
||||
docker ps
|
||||
|
||||
# Перезапустить Docker
|
||||
sudo systemctl restart docker
|
||||
|
||||
# Очистить Docker
|
||||
docker system prune -a
|
||||
```
|
||||
|
||||
### Пример 3: Проблемы с Kubernetes
|
||||
|
||||
```bash
|
||||
# Проверить Kind кластеры
|
||||
kind get clusters
|
||||
|
||||
# Удалить проблемный кластер
|
||||
kind delete cluster --name lab
|
||||
|
||||
# Пересоздать кластер
|
||||
make lab-create
|
||||
```
|
||||
|
||||
### Пример 4: Проблемы с ресурсами
|
||||
|
||||
```bash
|
||||
# Проверить использование ресурсов
|
||||
docker stats
|
||||
|
||||
# Ограничить ресурсы
|
||||
docker run --memory=512m --cpus=1.0 your-image
|
||||
|
||||
# Очистить неиспользуемые ресурсы
|
||||
make lab-cleanup
|
||||
```
|
||||
|
||||
## Продвинутые примеры
|
||||
|
||||
### Пример 1: Создание собственного пресета
|
||||
|
||||
```bash
|
||||
# Создать новый пресет
|
||||
cat > molecule/presets/my-custom.yml << EOF
|
||||
---
|
||||
- name: Установка nginx
|
||||
# ПРЕСЕТ: Мой кастомный пресет
|
||||
#
|
||||
# Описание: Кастомная конфигурация для моих нужд
|
||||
#
|
||||
# Использование: make lab-test LAB_SPEC=molecule/presets/my-custom.yml
|
||||
|
||||
docker_network: labnet
|
||||
|
||||
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: my-web
|
||||
family: debian
|
||||
group: webservers
|
||||
publish:
|
||||
- "8080:80"
|
||||
|
||||
- name: my-db
|
||||
family: rhel
|
||||
group: databases
|
||||
publish:
|
||||
- "5432:5432"
|
||||
EOF
|
||||
|
||||
# Протестировать пресет
|
||||
make lab-test LAB_SPEC=molecule/presets/my-custom.yml
|
||||
```
|
||||
|
||||
### Пример 2: Создание собственной роли
|
||||
|
||||
```bash
|
||||
# Создать структуру роли
|
||||
mkdir -p roles/my-role/{tasks,handlers,templates,files,vars,defaults,meta}
|
||||
|
||||
# Создать основной task
|
||||
cat > roles/my-role/tasks/main.yml << EOF
|
||||
---
|
||||
- name: Install nginx
|
||||
package:
|
||||
name: nginx
|
||||
state: present
|
||||
when: ansible_os_family in ['Debian', 'RedHat']
|
||||
|
||||
- name: Запуск nginx
|
||||
systemd:
|
||||
- name: Start nginx
|
||||
service:
|
||||
name: nginx
|
||||
state: started
|
||||
enabled: yes
|
||||
enabled: true
|
||||
EOF
|
||||
|
||||
# Создать playbook
|
||||
cat > files/playbooks/my-playbook.yml << EOF
|
||||
---
|
||||
- name: Deploy my role
|
||||
hosts: webservers
|
||||
become: true
|
||||
roles:
|
||||
- my-role
|
||||
EOF
|
||||
|
||||
# Протестировать роль
|
||||
make lab-test LAB_SPEC=molecule/presets/webapp.yml
|
||||
```
|
||||
|
||||
### Тестирование роли
|
||||
### Пример 3: Интеграция с CI/CD
|
||||
|
||||
```bash
|
||||
# Lint проверка
|
||||
make role lint nginx
|
||||
# Создать GitHub Actions workflow
|
||||
cat > .github/workflows/test.yml << EOF
|
||||
name: Test Ansible Roles
|
||||
|
||||
# Тестирование с minimal preset
|
||||
make role test minimal
|
||||
|
||||
# Проверка работы nginx
|
||||
docker exec -it $(docker ps -aq --filter "network=labnet" | head -1) systemctl status nginx
|
||||
```
|
||||
|
||||
## Пример 3: Использование preset'ов
|
||||
|
||||
### Minimal preset (1 хост)
|
||||
|
||||
```bash
|
||||
# Быстрое тестирование на 1 хосте
|
||||
make role test minimal
|
||||
|
||||
# Проверка контейнера
|
||||
docker ps -a --filter "network=labnet"
|
||||
```
|
||||
|
||||
### Default preset (2 хоста)
|
||||
|
||||
```bash
|
||||
# Тестирование на Ubuntu + Debian
|
||||
make role test default
|
||||
|
||||
# Проверка нескольких контейнеров
|
||||
docker ps -a --filter "network=labnet"
|
||||
```
|
||||
|
||||
### All-images preset (16 хостов)
|
||||
|
||||
```bash
|
||||
# Полное тестирование всех ОС
|
||||
make role test all-images
|
||||
|
||||
# Проверка всех контейнеров
|
||||
docker ps -a --filter "network=labnet" --format "table {{.Names}}\t{{.Status}}"
|
||||
```
|
||||
|
||||
### Preset'ы по ОС
|
||||
|
||||
```bash
|
||||
# Тестирование на всех версиях Ubuntu
|
||||
make role test ubuntu-all
|
||||
|
||||
# Тестирование на всех версиях Debian
|
||||
make role test debian-all
|
||||
|
||||
# Тестирование на всех версиях CentOS
|
||||
make role test centos-all
|
||||
```
|
||||
|
||||
## Пример 4: Работа с Ansible Vault
|
||||
|
||||
### Создание секретов
|
||||
|
||||
```bash
|
||||
# Инициализация vault
|
||||
make vault init
|
||||
|
||||
# Создание нового файла секретов
|
||||
make vault create
|
||||
# Имя файла: secrets
|
||||
```
|
||||
|
||||
### Редактирование секретов
|
||||
|
||||
```bash
|
||||
# Редактирование
|
||||
make vault edit
|
||||
# Имя файла: secrets
|
||||
|
||||
# Просмотр секретов
|
||||
make vault show
|
||||
# Имя файла: secrets
|
||||
```
|
||||
|
||||
### Использование в тестировании
|
||||
|
||||
Секреты автоматически расшифровываются при запуске тестов и шифруются обратно после завершения.
|
||||
|
||||
## Пример 5: CI/CD интеграция
|
||||
|
||||
### GitHub Actions
|
||||
|
||||
```yaml
|
||||
name: Ansible Tests
|
||||
on: [push, pull_request]
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Run tests
|
||||
run: |
|
||||
make role lint
|
||||
make role test minimal
|
||||
```
|
||||
|
||||
### GitLab CI
|
||||
|
||||
```yaml
|
||||
test:
|
||||
script:
|
||||
- make role lint
|
||||
- make role test minimal
|
||||
only:
|
||||
- merge_requests
|
||||
- main
|
||||
```
|
||||
|
||||
## Пример 6: Диагностика и отладка
|
||||
|
||||
### Проверка линтинга
|
||||
|
||||
```bash
|
||||
# Линт всех ролей
|
||||
make role lint
|
||||
|
||||
# Линт конкретной роли
|
||||
make role lint docker
|
||||
|
||||
# Линт с подробным выводом
|
||||
ansible-lint roles/docker/ -vv
|
||||
```
|
||||
|
||||
### Диагностика тестов
|
||||
|
||||
```bash
|
||||
# Проверка preset'ов
|
||||
make presets list
|
||||
make presets info PRESET=default
|
||||
|
||||
# Проверка контейнеров
|
||||
docker ps -a --filter "network=labnet"
|
||||
docker network inspect labnet
|
||||
|
||||
# Просмотр логов
|
||||
docker logs -f $(docker ps -aq --filter "network=labnet" | head -1)
|
||||
```
|
||||
|
||||
### Очистка
|
||||
|
||||
```bash
|
||||
# Очистка контейнеров Molecule
|
||||
make clean-containers
|
||||
|
||||
# Очистка образов
|
||||
make docker clean
|
||||
|
||||
# Полная очистка
|
||||
make docker purge
|
||||
```
|
||||
|
||||
## Полезные команды
|
||||
|
||||
### Просмотр информации
|
||||
|
||||
```bash
|
||||
# Список всех ролей
|
||||
make role list
|
||||
|
||||
# Список preset'ов
|
||||
make presets list
|
||||
|
||||
# Информация об образах
|
||||
make docker info
|
||||
|
||||
# Справка по командам
|
||||
make help
|
||||
```
|
||||
|
||||
### Docker операции
|
||||
|
||||
```bash
|
||||
# Проверка builder'а
|
||||
make docker check-builder
|
||||
|
||||
# Диагностика buildx
|
||||
make docker diagnose
|
||||
|
||||
# Настройка builder'а
|
||||
make docker setup-builder
|
||||
|
||||
# Пересборка образов
|
||||
make docker rebuild
|
||||
```
|
||||
|
||||
### Vault операции
|
||||
|
||||
```bash
|
||||
# Создание vault
|
||||
make vault init
|
||||
|
||||
# Работа с секретами
|
||||
make vault create
|
||||
make vault edit
|
||||
make vault show
|
||||
|
||||
# Проверка vault
|
||||
make vault check
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Setup Docker
|
||||
run: |
|
||||
docker-compose up -d
|
||||
|
||||
- name: Run tests
|
||||
run: |
|
||||
make lab-test LAB_SPEC=molecule/presets/minimal.yml
|
||||
|
||||
- name: Generate report
|
||||
run: |
|
||||
make lab-report
|
||||
|
||||
- name: Upload report
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: lab-report
|
||||
path: reports/lab-report.html
|
||||
EOF
|
||||
```
|
||||
|
||||
## Заключение
|
||||
|
||||
Эти примеры демонстрируют основные возможности DevOpsLab:
|
||||
|
||||
1. **Быстрое тестирование** с minimal preset
|
||||
2. **Полное тестирование** с all-images preset
|
||||
3. **Создание ролей** через интерактивные команды
|
||||
4. **Работа с Vault** для секретов
|
||||
5. **Диагностика** и отладка тестов
|
||||
6. **Интеграция CI/CD** для автоматизации
|
||||
|
||||
Для получения дополнительной информации:
|
||||
- Используйте `make help` для списка команд
|
||||
- Читайте документацию в `docs/` директории
|
||||
- Изучайте примеры в `roles/docker/`
|
||||
|
||||
---
|
||||
|
||||
**Автор:** Сергей Антропов
|
||||
**Сайт:** https://devops.org.ru
|
||||
|
||||
Эти примеры демонстрируют основные возможности универсальной лаборатории. Для получения дополнительной информации обратитесь к [основной документации](universal-lab.md) и [описанию пресетов](presets.md).
|
||||
|
||||
@@ -1,235 +0,0 @@
|
||||
# Быстрый старт с DevOpsLab
|
||||
|
||||
**Автор:** Сергей Антропов
|
||||
**Сайт:** https://devops.org.ru
|
||||
**Версия:** 3.0.0
|
||||
|
||||
## 🚀 Установка и настройка
|
||||
|
||||
### 1. Клонирование репозитория
|
||||
|
||||
```bash
|
||||
git clone ssh://git@git.antropoff.ru:222/Ansible/DevOpsLab.git
|
||||
cd DevOpsLab
|
||||
```
|
||||
|
||||
### 2. Проверка структуры проекта
|
||||
|
||||
```bash
|
||||
# Просмотр доступных ролей
|
||||
make role list
|
||||
|
||||
# Просмотр доступных preset'ов
|
||||
make presets list
|
||||
```
|
||||
|
||||
### 3. Настройка Docker (опционально)
|
||||
|
||||
Если вы хотите собрать собственные образы:
|
||||
|
||||
```bash
|
||||
# Настройка multi-arch builder
|
||||
make docker setup-builder
|
||||
|
||||
# Сборка всех образов
|
||||
make docker build
|
||||
|
||||
# Проверка собранных образов
|
||||
make docker info
|
||||
```
|
||||
|
||||
**Примечание:** Используются готовые образы из Docker Hub `inecs/ansible-lab`.
|
||||
|
||||
## 🧪 Первое тестирование
|
||||
|
||||
### 1. Просмотр доступных preset'ов
|
||||
|
||||
```bash
|
||||
# Список всех preset'ов
|
||||
make presets list
|
||||
|
||||
# Информация о конкретном preset'е
|
||||
make presets info PRESET=default
|
||||
```
|
||||
|
||||
### 2. Тестирование роли ping
|
||||
|
||||
```bash
|
||||
# Тестирование с default preset
|
||||
make role test
|
||||
|
||||
# Тестирование с minimal preset (1 хост)
|
||||
make role test minimal
|
||||
```
|
||||
|
||||
### 3. Проверка результатов
|
||||
|
||||
```bash
|
||||
# Проверка через логи
|
||||
docker logs ansible-controller 2>/dev/null || echo "Контейнер не запущен"
|
||||
|
||||
# Просмотр созданных контейнеров
|
||||
docker ps -a --filter "network=labnet"
|
||||
```
|
||||
|
||||
## 🔧 Создание первой роли
|
||||
|
||||
### 1. Создание новой роли
|
||||
|
||||
```bash
|
||||
# Интерактивное создание роли
|
||||
make role create
|
||||
# Введите имя роли (например: nginx)
|
||||
```
|
||||
|
||||
### 2. Редактирование роли
|
||||
|
||||
После создания роли будет создана структура в `roles/<имя-роли>/`:
|
||||
|
||||
```
|
||||
roles/my-role/
|
||||
├── tasks/
|
||||
│ └── main.yml
|
||||
├── handlers/
|
||||
│ └── main.yml
|
||||
├── defaults/
|
||||
│ └── main.yml
|
||||
├── vars/
|
||||
│ └── main.yml
|
||||
├── meta/
|
||||
│ └── main.yml
|
||||
├── templates/
|
||||
├── files/
|
||||
└── README.md
|
||||
```
|
||||
|
||||
### 3. Написание задач роли
|
||||
|
||||
**`roles/my-role/tasks/main.yml`:**
|
||||
```yaml
|
||||
---
|
||||
# Основные задачи для роли my-role
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
|
||||
- name: Проверка установленных пакетов
|
||||
debug:
|
||||
msg: "Роль {{ role_name }} выполняется на {{ ansible_hostname }}"
|
||||
|
||||
- name: Установка пакетов (пример)
|
||||
package:
|
||||
name: "{{ my_role_packages | default([]) }}"
|
||||
state: present
|
||||
when: my_role_packages is defined
|
||||
```
|
||||
|
||||
### 4. Настройка defaults
|
||||
|
||||
**`roles/my-role/defaults/main.yml`:**
|
||||
```yaml
|
||||
---
|
||||
# Переменные по умолчанию для роли my-role
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
|
||||
my_role_packages: []
|
||||
my_role_enabled: true
|
||||
```
|
||||
|
||||
### 5. Тестирование роли
|
||||
|
||||
```bash
|
||||
# Проверка синтаксиса
|
||||
make role lint my-role
|
||||
|
||||
# Тестирование с минимальным preset
|
||||
make role test minimal
|
||||
```
|
||||
|
||||
### 6. Добавление роли в deploy.yml
|
||||
|
||||
Роль автоматически добавляется в `roles/deploy.yml` при создании.
|
||||
|
||||
## 📚 Доступные роли
|
||||
|
||||
### Docker
|
||||
|
||||
Универсальная роль для установки Docker и Docker Compose.
|
||||
|
||||
```bash
|
||||
# Тестирование роли docker
|
||||
make role lint docker
|
||||
make role test docker
|
||||
```
|
||||
|
||||
**Документация:** [roles/docker/README.md](../roles/docker/README.md)
|
||||
|
||||
### DevOps
|
||||
|
||||
Роль для установки и настройки инструментов DevOps.
|
||||
|
||||
**Документация:** [roles/devops/README.md](../roles/devops/README.md)
|
||||
|
||||
### Ping
|
||||
|
||||
Простая роль для проверки ping.
|
||||
|
||||
```bash
|
||||
# Тестирование роли ping
|
||||
make role lint ping
|
||||
make role test ping
|
||||
```
|
||||
|
||||
**Документация:** [roles/ping/README.md](../roles/ping/README.md)
|
||||
|
||||
## 🎯 Preset система
|
||||
|
||||
### Базовые preset'ы
|
||||
|
||||
- **`default`** - Стандартный preset (2 хоста: Ubuntu + Debian)
|
||||
- **`minimal`** - Минимальный preset (1 хост: Debian)
|
||||
- **`test`** - Базовый тест (2 хоста)
|
||||
|
||||
### Preset'ы по ОС
|
||||
|
||||
- **Ubuntu**: `ubuntu20`, `ubuntu22`, `ubuntu24`, `ubuntu-all`
|
||||
- **Debian**: `debian9`, `debian10`, `debian11`, `debian12`, `debian-all`
|
||||
- **CentOS**: `centos7`, `centos8`, `centos9`, `centos-all`
|
||||
|
||||
### Специализированные preset'ы
|
||||
|
||||
- **`all-images`** - Все образы (16 хостов)
|
||||
- **`multi-os`** - Multi-OS тестирование (8 хостов)
|
||||
- **`docker-full`** - Docker тестирование (4 хоста)
|
||||
- **`performance`** - Тест производительности (8 хостов)
|
||||
- **`security`** - Тест безопасности (6 хостов)
|
||||
|
||||
## 🔐 Работа с секретами
|
||||
|
||||
### Инициализация Vault
|
||||
|
||||
```bash
|
||||
# Создание файла с паролем
|
||||
make vault init
|
||||
```
|
||||
|
||||
### Создание и редактирование секретов
|
||||
|
||||
```bash
|
||||
# Создание нового секрета
|
||||
make vault create
|
||||
|
||||
# Редактирование существующего
|
||||
make vault edit
|
||||
|
||||
# Просмотр секрета
|
||||
make vault show
|
||||
```
|
||||
|
||||
## 📖 Дополнительная документация
|
||||
|
||||
- [Руководство по Molecule](molecule-guide.md)
|
||||
- [Создание ролей](creating-roles.md)
|
||||
- [Docker образы](dockerfiles.md)
|
||||
- [Preset система](presets-by-os.md)
|
||||
- [Настройка CI/CD](cicd-setup.md)
|
||||
@@ -1,110 +0,0 @@
|
||||
# Исправление проблемы с Ingress
|
||||
|
||||
## Проблема
|
||||
|
||||
После создания Kubernetes кластера Ingress ресурсы не доступны по доменным именам.
|
||||
|
||||
## Причина
|
||||
|
||||
1. **extraPortMappings не добавлялись в конфигурацию Kind** - порты 80 и 443 не пробрасывались на host
|
||||
2. **Записи в /etc/hosts не добавлялись автоматически** при применении манифестов
|
||||
|
||||
## Решение
|
||||
|
||||
### Вариант 1: Быстрое исправление (без пересоздания кластера)
|
||||
|
||||
1. **Добавьте запись в `/etc/hosts` вручную:**
|
||||
|
||||
```bash
|
||||
echo "127.0.0.1 grafana.local #k8s" | sudo tee -a /etc/hosts
|
||||
```
|
||||
|
||||
2. **Создайте port-forward для Ingress напрямую:**
|
||||
|
||||
```bash
|
||||
# Подключитесь к кластеру
|
||||
export KUBECONFIG=$(docker exec k8s-controller cat /root/.kube/config)
|
||||
|
||||
# Замените 0.0.0.0 на localhost в kubeconfig
|
||||
export KUBECONFIG=$(echo "$KUBECONFIG" | sed 's/0\.0\.0\.0:6443/localhost:6443/g' > /tmp/kubeconfig-local.yaml && echo /tmp/kubeconfig-local.yaml)
|
||||
|
||||
# Создайте port-forward для Ingress HTTP
|
||||
kubectl port-forward -n ingress-nginx svc/ingress-nginx-controller 8081:80 &
|
||||
|
||||
# Проверьте доступность
|
||||
curl -H "Host: grafana.local" http://localhost:8081
|
||||
```
|
||||
|
||||
3. **Откройте в браузере:**
|
||||
|
||||
```
|
||||
http://grafana.local:8081
|
||||
```
|
||||
|
||||
### Вариант 2: Пересоздание кластера (рекомендуется)
|
||||
|
||||
Исправления уже внесены в код. Просто пересоздайте кластер:
|
||||
|
||||
```bash
|
||||
# Удалите старый кластер
|
||||
make k8s destroy kubernetes
|
||||
|
||||
# Создайте новый (с исправлениями)
|
||||
make k8s create kubernetes
|
||||
|
||||
# Примените манифест с Ingress
|
||||
make k8s manifest apply kubernetes manifests/test-grafana-ingress.yaml
|
||||
|
||||
# Запись в /etc/hosts добавится автоматически
|
||||
# Проверьте
|
||||
cat /etc/hosts | grep k8s
|
||||
|
||||
# Откройте в браузере
|
||||
open http://grafana.local:8081
|
||||
```
|
||||
|
||||
## Проверка
|
||||
|
||||
```bash
|
||||
# 1. Проверьте Ingress
|
||||
docker exec k8s-controller kubectl --server=https://lab-control-plane:6443 --insecure-skip-tls-verify get ingress --all-namespaces
|
||||
|
||||
# 2. Проверьте ports control-plane
|
||||
docker port lab-control-plane
|
||||
|
||||
# Должны быть:
|
||||
# 6443/tcp -> 0.0.0.0:6443
|
||||
# 80/tcp -> 0.0.0.0:8081 <- после исправления
|
||||
# 443/tcp -> 0.0.0.0:8443 <- после исправления
|
||||
|
||||
# 3. Проверьте доступность
|
||||
curl -H "Host: grafana.local" http://localhost:8081
|
||||
```
|
||||
|
||||
## Что было исправлено
|
||||
|
||||
1. В `scripts/create_k8s_cluster.py` исправлена логика добавления `extraPortMappings` в конфигурацию Kind
|
||||
2. Порты 80 и 443 теперь правильно пробрасываются на host (8081 и 8443)
|
||||
3. Манифест Ingress можно применить и автоматически добавить запись в `/etc/hosts`
|
||||
|
||||
## Дополнительно
|
||||
|
||||
Если Ingress всё ещё не работает:
|
||||
|
||||
1. **Проверьте статус подов Ingress Controller:**
|
||||
|
||||
```bash
|
||||
docker exec k8s-controller kubectl --server=https://lab-control-plane:6443 --insecure-skip-tls-verify get pods -n ingress-nginx
|
||||
```
|
||||
|
||||
2. **Проверьте логи Ingress Controller:**
|
||||
|
||||
```bash
|
||||
docker exec k8s-controller kubectl --server=https://lab-control-plane:6443 --insecure-skip-tls-verify logs -n ingress-nginx -l app.kubernetes.io/component=controller
|
||||
```
|
||||
|
||||
3. **Проверьте события:**
|
||||
|
||||
```bash
|
||||
docker exec k8s-controller kubectl --server=https://lab-control-plane:6443 --insecure-skip-tls-verify get events -n monitoring
|
||||
```
|
||||
@@ -1,232 +0,0 @@
|
||||
# Скрипты управления Kubernetes
|
||||
|
||||
**Автор:** Сергей Антропов
|
||||
**Сайт:** https://devops.org.ru
|
||||
|
||||
## Обзор
|
||||
|
||||
В проекте используются несколько Python скриптов для автоматизации работы с Kubernetes кластерами на базе Kind. Все скрипты находятся в директории `scripts/`.
|
||||
|
||||
## Скрипты
|
||||
|
||||
### 1. `create_k8s_cluster.py`
|
||||
|
||||
**Назначение:** Создание Kind кластера, установка аддонов и создание Docker контейнеров из пресета.
|
||||
|
||||
**Принцип работы:**
|
||||
|
||||
1. **Парсинг пресета:** Читает YAML файл пресета (например, `molecule/presets/k8s/kubernetes.yml`)
|
||||
|
||||
2. **Создание Docker сети:**
|
||||
- Проверяет наличие сети (по умолчанию `labnet`)
|
||||
- Создает сеть если её нет
|
||||
|
||||
3. **Создание Docker контейнеров:**
|
||||
- Читает секцию `hosts` из пресета
|
||||
- Для каждого хоста создает Docker контейнер с настройками из `systemd_defaults`
|
||||
- Использует образы из секции `images`
|
||||
|
||||
4. **Создание Kind кластера:**
|
||||
- Генерирует конфигурацию Kind в формате YAML
|
||||
- Настраивает `extraPortMappings` для Ingress портов
|
||||
- Создает кластер через команду `kind create cluster`
|
||||
|
||||
5. **Установка аддонов:**
|
||||
- **Ingress NGINX:** Устанавливает ingress-nginx controller через kubectl apply
|
||||
- **Metrics Server:** Устанавливает metrics-server с патчем для insecure TLS
|
||||
- **Istio:** Устанавливает Istio через istioctl с профилем demo
|
||||
- **Kiali:** Устанавливает Kiali через Helm (использует Helm chart)
|
||||
- **Prometheus Stack:** Устанавливает Prometheus + Grafana через Helm (kube-prometheus-stack)
|
||||
|
||||
6. **Подключение к сети Kind:** Подключает контейнер `k8s-controller` к сети `kind` для доступа к API серверу
|
||||
|
||||
**Параметры:**
|
||||
```bash
|
||||
python3 scripts/create_k8s_cluster.py <preset_file> <container_name>
|
||||
```
|
||||
|
||||
**Пример:**
|
||||
```bash
|
||||
python3 scripts/create_k8s_cluster.py molecule/presets/k8s/kubernetes.yml k8s-controller
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. `delete_hosts.py`
|
||||
|
||||
**Назначение:** Удаление Docker контейнеров, созданных из секции `hosts` пресета.
|
||||
|
||||
**Принцип работы:**
|
||||
|
||||
1. **Парсинг пресета:** Читает YAML файл пресета
|
||||
2. **Получение списка хостов:** Извлекает секцию `hosts`
|
||||
3. **Удаление контейнеров:** Для каждого хоста выполняет `docker rm -f <host_name>`
|
||||
|
||||
**Параметры:**
|
||||
```bash
|
||||
python3 scripts/delete_hosts.py <preset_file>
|
||||
```
|
||||
|
||||
**Пример:**
|
||||
```bash
|
||||
python3 scripts/delete_hosts.py molecule/presets/k8s/kubernetes.yml
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. `portforward.py`
|
||||
|
||||
**Назначение:** Управление port-forward для доступа к сервисам Kubernetes извне кластера.
|
||||
|
||||
**Принцип работы:**
|
||||
|
||||
1. **Загрузка пресета:** Читает файл `molecule/presets/k8s/kubernetes.yml`
|
||||
|
||||
2. **Получение kubeconfig:**
|
||||
- Копирует kubeconfig из контейнера `k8s-controller` через `docker exec`
|
||||
- Сохраняет во временный файл
|
||||
|
||||
3. **Модификация kubeconfig:**
|
||||
- Заменяет `server: https://0.0.0.0:6443` на `server: https://localhost:6443`
|
||||
- Это необходимо для доступа с локальной машины
|
||||
|
||||
4. **Создание port-forward:**
|
||||
- Запускает `kubectl port-forward` для каждого сервиса из `addon_ports`
|
||||
- Использует формат: `kubectl port-forward -n <namespace> svc/<service> <local_port>:<remote_port>`
|
||||
- Управляет процессами через PID
|
||||
|
||||
**Команды:**
|
||||
- `create` - создает port-forward для всех сервисов
|
||||
- `list` - показывает список активных портов
|
||||
- `clear` - останавливает все port-forward процессы
|
||||
- `recreate` - очищает и заново создает port-forward
|
||||
- `delete <port>` - удаляет конкретный port-forward
|
||||
|
||||
**Пример использования:**
|
||||
```bash
|
||||
python3 scripts/portforward.py create
|
||||
python3 scripts/portforward.py list
|
||||
python3 scripts/portforward.py delete 3000
|
||||
python3 scripts/portforward.py clear
|
||||
```
|
||||
|
||||
**Важно:** Скрипт должен запускаться на локальной машине, где установлены `kubectl` и Python 3.
|
||||
|
||||
---
|
||||
|
||||
### 4. `k8s_status.py`
|
||||
|
||||
**Назначение:** Детальный отчет о состоянии Kubernetes кластера.
|
||||
|
||||
**Принцип работы:**
|
||||
|
||||
1. **Подключение к кластеру:**
|
||||
- Получает имя кластера через `kind get clusters`
|
||||
- Формирует адрес API сервера: `https://<cluster_name>-control-plane:6443`
|
||||
- Выполняет все kubectl команды через `docker exec k8s-controller`
|
||||
|
||||
2. **Сбор информации:**
|
||||
- **Общая информация:** версия Kubernetes
|
||||
- **Узлы:** статус, ресурсы, описание каждого узла
|
||||
- **Namespaces:** список всех namespace
|
||||
- **Использование ресурсов:** метрики через metrics-server (если установлен)
|
||||
- **Pods:** поды по каждому namespace
|
||||
- **Deployments:** deployments по namespace
|
||||
- **DaemonSets:** daemonsets по namespace
|
||||
- **StatefulSets:** statefulsets по namespace
|
||||
- **Services:** сервисы по namespace
|
||||
- **Ingress:** ingress ресурсы
|
||||
- **PVC:** PersistentVolumeClaims
|
||||
- **События:** последние 20 событий по namespace
|
||||
- **Helm релизы:** список установленных через Helm
|
||||
|
||||
3. **Форматирование вывода:**
|
||||
- Использует секции с разделителями
|
||||
- Группирует информацию по namespace
|
||||
- Показывает только непустые секции
|
||||
|
||||
**Пример использования:**
|
||||
```bash
|
||||
python3 scripts/k8s_status.py
|
||||
```
|
||||
|
||||
**Интеграция:**
|
||||
- Автоматически вызывается командой `make k8s status [preset]`
|
||||
|
||||
**Особенности:**
|
||||
- Выполняет все команды внутри контейнера `k8s-controller`
|
||||
- Использует прямой адрес control-plane для подключения
|
||||
- Обходит проблемы с kubeconfig через `--insecure-skip-tls-verify`
|
||||
|
||||
---
|
||||
|
||||
## Архитектура взаимодействия
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ Локальная машина │
|
||||
│ │
|
||||
│ Makefile → Python скрипты → Docker API │
|
||||
│ ↓ ↓ ↓ │
|
||||
│ make k8s scripts/*.py docker exec │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
│
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ Docker контейнер │
|
||||
│ k8s-controller │
|
||||
│ ┌──────────────────────────────────────────┐ │
|
||||
│ │ kind, kubectl, helm, istioctl │ │
|
||||
│ └──────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
│
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ Docker сеть: kind │
|
||||
│ ┌──────────────────────────────────────────┐ │
|
||||
│ │ Kind Kubernetes Cluster │ │
|
||||
│ │ • Control Plane (6443) │ │
|
||||
│ │ • Worker Nodes │ │
|
||||
│ │ • Services (ClusterIP) │ │
|
||||
│ │ • Ingress │ │
|
||||
│ └──────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Общие принципы
|
||||
|
||||
1. **Изоляция:** Все kubectl команды выполняются внутри контейнера `k8s-controller`
|
||||
2. **Безопасность:** Используется `--insecure-skip-tls-verify` для обхода проблем с сертификатами
|
||||
3. **Автоматизация:** Скрипты вызываются автоматически через Makefile
|
||||
4. **Логгирование:** Все скрипты выводят подробную информацию о своих действиях
|
||||
|
||||
## Требования
|
||||
|
||||
- Python 3 (на локальной машине)
|
||||
- kubectl (на локальной машине, для portforward.py)
|
||||
- Docker
|
||||
- Docker контейнер `k8s-controller` должен быть запущен
|
||||
|
||||
## Отладка
|
||||
|
||||
Если что-то не работает:
|
||||
|
||||
1. **Проверьте контейнер:**
|
||||
```bash
|
||||
docker ps | grep k8s-controller
|
||||
```
|
||||
|
||||
2. **Запустите скрипт вручную:**
|
||||
```bash
|
||||
python3 scripts/k8s_status.py
|
||||
```
|
||||
|
||||
3. **Посмотрите логи:**
|
||||
```bash
|
||||
docker logs k8s-controller
|
||||
```
|
||||
|
||||
4. **Проверьте кластер:**
|
||||
```bash
|
||||
docker exec k8s-controller kubectl get nodes
|
||||
```
|
||||
@@ -1,395 +0,0 @@
|
||||
# Команды для работы с Kubernetes
|
||||
|
||||
Автор: Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
|
||||
## Содержание
|
||||
|
||||
- [Работа с манифестами](#работа-с-манифестами)
|
||||
- [Работа с Helm](#работа-с-helm)
|
||||
- [Работа с Helm репозиториями](#работа-с-helm-репозиториями)
|
||||
|
||||
## Работа с манифестами
|
||||
|
||||
Команды для применения, удаления и обновления манифестов YAML в кластере.
|
||||
|
||||
### Синтаксис
|
||||
|
||||
```bash
|
||||
make k8s manifest [команда] [пресет] [URL_или_путь_к_файлу]
|
||||
```
|
||||
|
||||
### Команды
|
||||
|
||||
#### `apply` - Применение манифеста
|
||||
|
||||
Применяет манифест YAML к кластеру.
|
||||
|
||||
```bash
|
||||
make k8s manifest apply kubernetes https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
|
||||
```
|
||||
|
||||
**Примеры:**
|
||||
```bash
|
||||
# Применение манифеста из URL
|
||||
make k8s manifest apply kubernetes https://example.com/deploy.yaml
|
||||
|
||||
# Применение локального манифеста
|
||||
make k8s manifest apply kubernetes ./manifests/my-app.yaml
|
||||
```
|
||||
|
||||
#### `delete` - Удаление ресурсов
|
||||
|
||||
Удаляет ресурсы из кластера по манифесту.
|
||||
|
||||
```bash
|
||||
make k8s manifest delete kubernetes https://example.com/deploy.yaml
|
||||
```
|
||||
|
||||
#### `update` - Обновление манифеста
|
||||
|
||||
Обновляет ресурсы в кластере, используя манифест.
|
||||
|
||||
```bash
|
||||
make k8s manifest update kubernetes https://example.com/deploy.yaml
|
||||
```
|
||||
|
||||
### Примеры использования
|
||||
|
||||
```bash
|
||||
# Установка NGINX Ingress Controller
|
||||
make k8s manifest apply kubernetes https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
|
||||
|
||||
# Удаление ресурсов
|
||||
make k8s manifest delete kubernetes https://example.com/deploy.yaml
|
||||
|
||||
# Обновление конфигурации
|
||||
make k8s manifest update kubernetes https://example.com/deploy.yaml --force
|
||||
```
|
||||
|
||||
## Работа с Helm
|
||||
|
||||
Команды для установки, обновления и управления Helm чартами в кластере.
|
||||
|
||||
### Синтаксис
|
||||
|
||||
```bash
|
||||
make k8s helm [команда] [пресет] [релиз] [чант]
|
||||
```
|
||||
|
||||
### Команды
|
||||
|
||||
#### `apply` - Установка/обновление чарта
|
||||
|
||||
Устанавливает новый релиз или обновляет существующий.
|
||||
|
||||
```bash
|
||||
make k8s helm apply kubernetes my-nginx nginx/nginx-ingress
|
||||
```
|
||||
|
||||
**Параметры:**
|
||||
- `пресет` - имя пресета кластера
|
||||
- `релиз` - имя релиза (например: my-nginx)
|
||||
- `чарт` - имя чарта (например: nginx/nginx-ingress)
|
||||
|
||||
**Примеры:**
|
||||
```bash
|
||||
# Установка nginx-ingress
|
||||
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress
|
||||
|
||||
# Установка с указанием репозитория
|
||||
make k8s helm apply kubernetes prometheus prometheus-community/prometheus
|
||||
```
|
||||
|
||||
#### `delete` - Удаление релиза
|
||||
|
||||
Удаляет Helm релиз из кластера.
|
||||
|
||||
```bash
|
||||
make k8s helm delete kubernetes my-nginx
|
||||
```
|
||||
|
||||
**Примеры:**
|
||||
```bash
|
||||
# Удаление релиза
|
||||
make k8s helm delete kubernetes nginx-ingress
|
||||
|
||||
# Удаление с флагом --keep-history
|
||||
# (не поддерживается в текущей реализации)
|
||||
```
|
||||
|
||||
#### `update` - Обновление релиза
|
||||
|
||||
Обновляет существующий Helm релиз.
|
||||
|
||||
```bash
|
||||
make k8s helm update kubernetes my-nginx nginx/nginx-ingress
|
||||
```
|
||||
|
||||
#### `rollback` - Откат релиза
|
||||
|
||||
Откатывает релиз к предыдущей версии.
|
||||
|
||||
```bash
|
||||
make k8s helm rollback kubernetes my-nginx
|
||||
```
|
||||
|
||||
**Примеры:**
|
||||
```bash
|
||||
# Откат к предыдущей ревизии
|
||||
make k8s helm rollback kubernetes my-nginx
|
||||
|
||||
# Откат к конкретной ревизии (не поддерживается в текущей реализации)
|
||||
```
|
||||
|
||||
#### `list` - Список релизов
|
||||
|
||||
Показывает список всех установленных Helm релизов.
|
||||
|
||||
```bash
|
||||
make k8s helm list kubernetes
|
||||
```
|
||||
|
||||
**Пример вывода:**
|
||||
```
|
||||
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
|
||||
nginx-ingress default 1 2024-01-15 12:00:00.000000 +0000 UTC deployed nginx-ingress-0.1.0 1.0.0
|
||||
```
|
||||
|
||||
#### `status` - Статус релиза
|
||||
|
||||
Показывает подробную информацию о статусе релиза.
|
||||
|
||||
```bash
|
||||
make k8s helm status kubernetes my-nginx
|
||||
```
|
||||
|
||||
### Примеры использования
|
||||
|
||||
```bash
|
||||
# 1. Установка NGINX Ingress Controller
|
||||
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress
|
||||
|
||||
# 2. Проверка статуса
|
||||
make k8s helm status kubernetes nginx-ingress
|
||||
|
||||
# 3. Обновление релиза
|
||||
make k8s helm update kubernetes nginx-ingress nginx/nginx-ingress
|
||||
|
||||
# 4. Просмотр списка релизов
|
||||
make k8s helm list kubernetes
|
||||
|
||||
# 5. Откат релиза
|
||||
make k8s helm rollback kubernetes nginx-ingress
|
||||
|
||||
# 6. Удаление релиза
|
||||
make k8s helm delete kubernetes nginx-ingress
|
||||
```
|
||||
|
||||
## Работа с Helm репозиториями
|
||||
|
||||
Команды для управления Helm репозиториями.
|
||||
|
||||
### Синтаксис
|
||||
|
||||
```bash
|
||||
make k8s helmrepo [команда] [пресет] [имя] [URL]
|
||||
```
|
||||
|
||||
### Команды
|
||||
|
||||
#### `add` - Добавление репозитория
|
||||
|
||||
Добавляет новый Helm репозиторий.
|
||||
|
||||
```bash
|
||||
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
|
||||
```
|
||||
|
||||
**Примеры:**
|
||||
```bash
|
||||
# Добавление официального репозитория Helm
|
||||
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
|
||||
|
||||
# Добавление репозитория Bitnami
|
||||
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||
|
||||
# Добавление репозитория NGINX
|
||||
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
|
||||
|
||||
# Добавление репозитория Prometheus
|
||||
make k8s helmrepo add kubernetes prometheus-community https://prometheus-community.github.io/helm-charts
|
||||
|
||||
# Добавление пользовательского репозитория
|
||||
make k8s helmrepo add kubernetes my-repo https://charts.example.com
|
||||
```
|
||||
|
||||
#### `list` - Список репозиториев
|
||||
|
||||
Показывает список всех добавленных Helm репозиториев.
|
||||
|
||||
```bash
|
||||
make k8s helmrepo list kubernetes
|
||||
```
|
||||
|
||||
**Пример вывода:**
|
||||
```
|
||||
NAME URL
|
||||
stable https://charts.helm.sh/stable
|
||||
bitnami https://charts.bitnami.com/bitnami
|
||||
nginx https://helm.nginx.com/stable
|
||||
```
|
||||
|
||||
#### `delete` - Удаление репозитория
|
||||
|
||||
Удаляет Helm репозиторий.
|
||||
|
||||
```bash
|
||||
make k8s helmrepo delete kubernetes stable
|
||||
```
|
||||
|
||||
**Примеры:**
|
||||
```bash
|
||||
# Удаление репозитория
|
||||
make k8s helmrepo delete kubernetes stable
|
||||
```
|
||||
|
||||
#### `update` - Обновление репозиториев
|
||||
|
||||
Обновляет информацию о всех Helm репозиториях.
|
||||
|
||||
```bash
|
||||
make k8s helmrepo update kubernetes
|
||||
```
|
||||
|
||||
**Примеры:**
|
||||
```bash
|
||||
# Обновление всех репозиториев
|
||||
make k8s helmrepo update kubernetes
|
||||
```
|
||||
|
||||
#### `packages` - Список пакетов
|
||||
|
||||
Показывает список пакетов в указанном репозитории.
|
||||
|
||||
```bash
|
||||
make k8s helmrepo packages kubernetes stable
|
||||
```
|
||||
|
||||
**Примеры:**
|
||||
```bash
|
||||
# Просмотр пакетов в репозитории stable
|
||||
make k8s helmrepo packages kubernetes stable
|
||||
|
||||
# Просмотр пакетов в репозитории nginx
|
||||
make k8s helmrepo packages kubernetes nginx
|
||||
|
||||
# Поиск конкретного пакета
|
||||
make k8s helmrepo packages kubernetes stable | grep nginx
|
||||
```
|
||||
|
||||
### Примеры использования
|
||||
|
||||
```bash
|
||||
# 1. Добавление нескольких репозиториев
|
||||
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
|
||||
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
|
||||
|
||||
# 2. Просмотр списка репозиториев
|
||||
make k8s helmrepo list kubernetes
|
||||
|
||||
# 3. Обновление репозиториев
|
||||
make k8s helmrepo update kubernetes
|
||||
|
||||
# 4. Поиск пакетов в репозитории
|
||||
make k8s helmrepo packages kubernetes stable
|
||||
|
||||
# 5. Удаление репозитория
|
||||
make k8s helmrepo delete kubernetes my-custom-repo
|
||||
|
||||
# 6. Установка пакета из добавленного репозитория
|
||||
make k8s helm apply kubernetes my-nginx nginx/nginx-ingress
|
||||
```
|
||||
|
||||
## Полный рабочий пример
|
||||
|
||||
```bash
|
||||
# 1. Создание кластера
|
||||
make k8s create kubernetes
|
||||
|
||||
# 2. Добавление Helm репозиториев
|
||||
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
|
||||
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||
|
||||
# 3. Обновление репозиториев
|
||||
make k8s helmrepo update kubernetes
|
||||
|
||||
# 4. Просмотр доступных пакетов
|
||||
make k8s helmrepo packages kubernetes nginx
|
||||
|
||||
# 5. Установка NGINX Ingress Controller
|
||||
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress
|
||||
|
||||
# 6. Проверка статуса
|
||||
make k8s helm status kubernetes nginx-ingress
|
||||
|
||||
# 7. Просмотр списка релизов
|
||||
make k8s helm list kubernetes
|
||||
|
||||
# 8. Применение манифеста
|
||||
make k8s manifest apply kubernetes https://example.com/deploy.yaml
|
||||
|
||||
# 9. Откат релиза (если нужно)
|
||||
make k8s helm rollback kubernetes nginx-ingress
|
||||
|
||||
# 10. Удаление релиза
|
||||
make k8s helm delete kubernetes nginx-ingress
|
||||
|
||||
# 11. Удаление репозитория
|
||||
make k8s helmrepo delete kubernetes nginx
|
||||
|
||||
# 12. Удаление кластера
|
||||
make k8s destroy kubernetes
|
||||
```
|
||||
|
||||
## Обработка ошибок
|
||||
|
||||
### Ошибка: Контейнер не запущен
|
||||
|
||||
```
|
||||
❌ Контейнер k8s-kubernetes не запущен
|
||||
💡 Запустите: make k8s create kubernetes
|
||||
```
|
||||
|
||||
**Решение:** Запустите кластер перед выполнением команд.
|
||||
|
||||
### Ошибка: Неизвестная команда
|
||||
|
||||
```
|
||||
❌ Неизвестная команда: unknown
|
||||
💡 Доступные команды: apply, delete, update
|
||||
```
|
||||
|
||||
**Решение:** Используйте правильную команду из списка доступных.
|
||||
|
||||
### Ошибка: Не указаны параметры
|
||||
|
||||
```
|
||||
❌ Ошибка: Укажите имя релиза и чарт
|
||||
💡 Пример: make k8s helm apply kubernetes my-release stable/nginx-ingress
|
||||
```
|
||||
|
||||
**Решение:** Укажите все необходимые параметры команды.
|
||||
|
||||
## Дополнительная информация
|
||||
|
||||
- Все команды kubectl и helm выполняются внутри контейнера `k8s-[пресет]`
|
||||
- Вам не нужно устанавливать kubectl или helm локально
|
||||
- Подключение к кластеру происходит через имя узла control-plane
|
||||
- Используется флаг `--insecure-skip-tls-verify` для обхода проблем с сертификатами
|
||||
|
||||
## Автор
|
||||
|
||||
Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
@@ -1,906 +0,0 @@
|
||||
# Полное руководство по работе с Kubernetes кластерами
|
||||
|
||||
Автор: Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
|
||||
## Содержание
|
||||
|
||||
- [Введение](#введение)
|
||||
- [Создание кластера](#создание-кластера)
|
||||
- [Управление кластером](#управление-кластером)
|
||||
- [Работа с манифестами](#работа-с-манифестами)
|
||||
- [Работа с Helm](#работа-с-helm)
|
||||
- [Настройка Ingress](#настройка-ingress)
|
||||
- [Мониторинг и аддоны](#мониторинг-и-аддоны)
|
||||
- [Service Mesh с Istio](#service-mesh-с-istio)
|
||||
- [Примеры полных развертываний](#примеры-полных-развертываний)
|
||||
|
||||
## Введение
|
||||
|
||||
DevOpsLab предоставляет полную поддержку создания и управления локальными Kubernetes кластерами на основе Kind (Kubernetes in Docker). Kind позволяет запускать Kubernetes кластеры внутри Docker контейнеров, что идеально подходит для разработки, тестирования и обучения.
|
||||
|
||||
### Основные возможности
|
||||
|
||||
- Создание многоузловых Kubernetes кластеров
|
||||
- Установка и управление Helm чартами
|
||||
- Работа с манифестами YAML
|
||||
- Настройка Ingress контроллеров
|
||||
- Установка систем мониторинга (Prometheus, Grafana)
|
||||
- Развертывание Service Mesh (Istio, Kiali)
|
||||
- Изоляция сети и безопасность
|
||||
|
||||
### Преимущества
|
||||
|
||||
- Не требует установки локального Kubernetes
|
||||
- Быстрое создание и удаление кластеров
|
||||
- Поддержка многоузловых конфигураций
|
||||
- Полная совместимость с production окружениями
|
||||
- Контейнеризация всех инструментов
|
||||
|
||||
## Создание кластера
|
||||
|
||||
### Базовое создание
|
||||
|
||||
Простое создание минимального кластера без дополнительных компонентов:
|
||||
|
||||
```bash
|
||||
make k8s create
|
||||
```
|
||||
|
||||
Создаст кластер с пресетом `k8s-minimal` - один control-plane узел без дополнительных компонентов.
|
||||
|
||||
### Создание полнофункционального кластера
|
||||
|
||||
Создание кластера с предустановленными компонентами:
|
||||
|
||||
```bash
|
||||
make k8s create kubernetes
|
||||
```
|
||||
|
||||
Этот пресет создает кластер со следующими компонентами:
|
||||
- 1 control-plane узел
|
||||
- 2 worker узла
|
||||
- Ingress NGINX Controller
|
||||
- Metrics Server
|
||||
- Istio Service Mesh
|
||||
- Kiali для визуализации Istio
|
||||
- Prometheus Stack (Prometheus + Grafana)
|
||||
|
||||
### Конфигурация пресета
|
||||
|
||||
Пресеты находятся в `molecule/presets/k8s/`. Пример конфигурации:
|
||||
|
||||
```yaml
|
||||
kind_clusters:
|
||||
- name: lab
|
||||
workers: 2
|
||||
api_port: 6443
|
||||
addons:
|
||||
ingress_nginx: true
|
||||
metrics_server: true
|
||||
istio: true
|
||||
kiali: true
|
||||
prometheus_stack: true
|
||||
ingress_host_http_port: 8081
|
||||
ingress_host_https_port: 8443
|
||||
addon_ports:
|
||||
prometheus: 9090
|
||||
grafana: 3000
|
||||
kiali: 20001
|
||||
```
|
||||
|
||||
### Проверка статуса кластера
|
||||
|
||||
```bash
|
||||
# Показать узлы кластера
|
||||
make k8s nodes kubernetes
|
||||
|
||||
# Вывод:
|
||||
# NAME STATUS ROLES AGE VERSION
|
||||
# lab-control-plane Ready control-plane 5m v1.34.0
|
||||
# lab-worker Ready <none> 4m v1.34.0
|
||||
# lab-worker2 Ready <none> 4m v1.34.0
|
||||
|
||||
# Показать подробный статус
|
||||
make k8s status kubernetes
|
||||
```
|
||||
|
||||
### Подключение к кластеру
|
||||
|
||||
```bash
|
||||
# Получить kubeconfig
|
||||
make k8s config kubernetes
|
||||
|
||||
# Использовать kubeconfig
|
||||
export KUBECONFIG=$(pwd)/kubeconfig
|
||||
kubectl get nodes
|
||||
```
|
||||
|
||||
## Управление кластером
|
||||
|
||||
### Остановка и запуск
|
||||
|
||||
```bash
|
||||
# Остановить кластер (без удаления)
|
||||
make k8s stop kubernetes
|
||||
|
||||
# Запустить остановленный кластер
|
||||
make k8s start kubernetes
|
||||
|
||||
# Перезапустить кластер
|
||||
make k8s stop kubernetes && make k8s start kubernetes
|
||||
```
|
||||
|
||||
### Удаление кластера
|
||||
|
||||
```bash
|
||||
# Полное удаление кластера и контейнера
|
||||
make k8s destroy kubernetes
|
||||
```
|
||||
|
||||
### Получение shell в контейнере
|
||||
|
||||
```bash
|
||||
# Открыть интерактивный shell
|
||||
make k8s shell kubernetes
|
||||
|
||||
# Теперь доступны все команды kubectl, helm, kind внутри контейнера
|
||||
kubectl get nodes
|
||||
helm list
|
||||
kind get clusters
|
||||
```
|
||||
|
||||
## Работа с манифестами
|
||||
|
||||
### Применение манифеста
|
||||
|
||||
Применение манифеста из URL:
|
||||
|
||||
```bash
|
||||
make k8s manifest apply kubernetes https://example.com/deploy.yaml
|
||||
```
|
||||
|
||||
Применение локального манифеста:
|
||||
|
||||
```bash
|
||||
# Создайте файл example-deployment.yaml
|
||||
cat > example-deployment.yaml <<EOF
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx-deployment
|
||||
spec:
|
||||
replicas: 3
|
||||
selector:
|
||||
matchLabels:
|
||||
app: nginx
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: nginx
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
image: nginx:1.21
|
||||
ports:
|
||||
- containerPort: 80
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: nginx-service
|
||||
spec:
|
||||
selector:
|
||||
app: nginx
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 80
|
||||
targetPort: 80
|
||||
type: NodePort
|
||||
EOF
|
||||
|
||||
# Применить манифест
|
||||
make k8s manifest apply kubernetes ./example-deployment.yaml
|
||||
```
|
||||
|
||||
### Удаление ресурсов
|
||||
|
||||
```bash
|
||||
make k8s manifest delete kubernetes https://example.com/deploy.yaml
|
||||
```
|
||||
|
||||
### Обновление ресурсов
|
||||
|
||||
```bash
|
||||
make k8s manifest update kubernetes https://example.com/deploy.yaml
|
||||
```
|
||||
|
||||
## Работа с Helm
|
||||
|
||||
### Добавление Helm репозиториев
|
||||
|
||||
Список популярных репозиториев:
|
||||
|
||||
```bash
|
||||
# Официальный Helm репозиторий
|
||||
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
|
||||
|
||||
# Bitnami (большая коллекция чартов)
|
||||
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||
|
||||
# NGINX Inc
|
||||
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
|
||||
|
||||
# Prometheus Community
|
||||
make k8s helmrepo add kubernetes prometheus-community https://prometheus-community.github.io/helm-charts
|
||||
|
||||
# Istio
|
||||
make k8s helmrepo add kubernetes istio https://istio-release.storage.googleapis.com/charts
|
||||
|
||||
# Информация о репозиториях
|
||||
make k8s helmrepo list kubernetes
|
||||
```
|
||||
|
||||
### Обновление репозиториев
|
||||
|
||||
```bash
|
||||
make k8s helmrepo update kubernetes
|
||||
```
|
||||
|
||||
### Поиск чартов
|
||||
|
||||
```bash
|
||||
# Просмотр всех чартов в репозитории
|
||||
make k8s helmrepo packages kubernetes bitnami
|
||||
|
||||
# Поиск конкретного чарта
|
||||
make k8s helmrepo packages kubernetes bitnami | grep nginx
|
||||
|
||||
# Поиск в нескольких репозиториях
|
||||
make k8s helmrepo packages kubernetes bitnami | grep redis
|
||||
make k8s helmrepo packages kubernetes stable | grep postgresql
|
||||
```
|
||||
|
||||
### Установка Helm чартов
|
||||
|
||||
#### Пример 1: Установка Redis
|
||||
|
||||
```bash
|
||||
# Добавить репозиторий
|
||||
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||
|
||||
# Обновить индекс
|
||||
make k8s helmrepo update kubernetes
|
||||
|
||||
# Установить Redis
|
||||
make k8s helm apply kubernetes redis bitnami/redis
|
||||
|
||||
# Проверить статус
|
||||
make k8s helm status kubernetes redis
|
||||
|
||||
# Посмотреть список релизов
|
||||
make k8s helm list kubernetes
|
||||
```
|
||||
|
||||
#### Пример 2: Установка PostgreSQL
|
||||
|
||||
```bash
|
||||
make k8s helm apply kubernetes postgres bitnami/postgresql
|
||||
make k8s helm status kubernetes postgres
|
||||
```
|
||||
|
||||
#### Пример 3: Установка Nginx Ingress через Helm
|
||||
|
||||
```bash
|
||||
# Добавить репозиторий (если еще не добавлен)
|
||||
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
|
||||
|
||||
# Обновить индекс
|
||||
make k8s helmrepo update kubernetes
|
||||
|
||||
# Установить NGINX Ingress
|
||||
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress-controller
|
||||
|
||||
# Проверить
|
||||
make k8s helm status kubernetes nginx-ingress
|
||||
```
|
||||
|
||||
### Обновление Helm релизов
|
||||
|
||||
```bash
|
||||
# Обновить релиз до последней версии
|
||||
make k8s helm update kubernetes redis bitnami/redis
|
||||
|
||||
# Проверить после обновления
|
||||
make k8s helm status kubernetes redis
|
||||
```
|
||||
|
||||
### Откат Helm релизов
|
||||
|
||||
```bash
|
||||
# Откатить к предыдущей версии
|
||||
make k8s helm rollback kubernetes redis
|
||||
|
||||
# Проверить статус после отката
|
||||
make k8s helm status kubernetes redis
|
||||
```
|
||||
|
||||
### Удаление Helm релизов
|
||||
|
||||
```bash
|
||||
# Удалить релиз
|
||||
make k8s helm delete kubernetes redis
|
||||
make k8s helm delete kubernetes postgres
|
||||
```
|
||||
|
||||
## Настройка Ingress
|
||||
|
||||
### Установка NGINX Ingress Controller
|
||||
|
||||
Ingress контроллер обычно устанавливается при создании кластера с пресетом `kubernetes`. Если нужна переустановка:
|
||||
|
||||
```bash
|
||||
# Через манифест
|
||||
make k8s manifest apply kubernetes \
|
||||
https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
|
||||
|
||||
# Или через Helm
|
||||
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
|
||||
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress-controller
|
||||
```
|
||||
|
||||
### Создание Ingress ресурса
|
||||
|
||||
Создайте файл `example-ingress.yaml`:
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: hello-service
|
||||
spec:
|
||||
selector:
|
||||
app: hello
|
||||
ports:
|
||||
- port: 80
|
||||
targetPort: 8080
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: hello-deployment
|
||||
spec:
|
||||
replicas: 2
|
||||
selector:
|
||||
matchLabels:
|
||||
app: hello
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: hello
|
||||
spec:
|
||||
containers:
|
||||
- name: hello
|
||||
image: hashicorp/http-echo:latest
|
||||
args:
|
||||
- "-text=Hello from Kubernetes!"
|
||||
ports:
|
||||
- containerPort: 8080
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: hello-ingress
|
||||
annotations:
|
||||
nginx.ingress.kubernetes.io/rewrite-target: /
|
||||
spec:
|
||||
rules:
|
||||
- host: hello.local
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: hello-service
|
||||
port:
|
||||
number: 80
|
||||
```
|
||||
|
||||
Примените манифест:
|
||||
|
||||
```bash
|
||||
make k8s manifest apply kubernetes ./example-ingress.yaml
|
||||
```
|
||||
|
||||
Проверьте доступность:
|
||||
|
||||
```bash
|
||||
# Добавьте запись в /etc/hosts
|
||||
echo "127.0.0.1 hello.local" | sudo tee -a /etc/hosts
|
||||
|
||||
# Откройте в браузере или проверьте через curl
|
||||
curl http://hello.local:8081
|
||||
```
|
||||
|
||||
### TLS Ingress
|
||||
|
||||
Создайте TLS сертификат и добавьте в Ingress:
|
||||
|
||||
```yaml
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: hello-tls-ingress
|
||||
annotations:
|
||||
nginx.ingress.kubernetes.io/rewrite-target: /
|
||||
spec:
|
||||
tls:
|
||||
- hosts:
|
||||
- hello.local
|
||||
secretName: tls-secret
|
||||
rules:
|
||||
- host: hello.local
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: hello-service
|
||||
port:
|
||||
number: 80
|
||||
```
|
||||
|
||||
## Мониторинг и аддоны
|
||||
|
||||
### Prometheus Stack
|
||||
|
||||
Prometheus Stack устанавливается автоматически при создании кластера с пресетом `kubernetes`.
|
||||
|
||||
#### Доступ к Grafana
|
||||
|
||||
```bash
|
||||
# 1. Получите пароль администратора
|
||||
kubectl --kubeconfig kubeconfig get secret monitoring-grafana \
|
||||
-n monitoring -o jsonpath="{.data.admin-password}" | base64 -d
|
||||
|
||||
# 2. Откройте браузер
|
||||
# URL: http://localhost:3000
|
||||
# Username: admin
|
||||
# Password: [результат из команды выше]
|
||||
```
|
||||
|
||||
#### Доступ к Prometheus
|
||||
|
||||
```bash
|
||||
# URL: http://localhost:9090
|
||||
# Откройте в браузере для просмотра метрик
|
||||
```
|
||||
|
||||
#### Просмотр метрик
|
||||
|
||||
```bash
|
||||
# Получить список метрик
|
||||
curl http://localhost:9090/api/v1/label/__name__/values
|
||||
|
||||
# Запрос конкретной метрики
|
||||
curl 'http://localhost:9090/api/v1/query?query=up'
|
||||
```
|
||||
|
||||
### Установка дополнительных инструментов мониторинга
|
||||
|
||||
#### Loki для логов
|
||||
|
||||
```bash
|
||||
# Добавить репозиторий Grafana
|
||||
make k8s helmrepo add kubernetes grafana https://grafana.github.io/helm-charts
|
||||
|
||||
# Установить Loki
|
||||
make k8s helm apply kubernetes loki grafana/loki-stack
|
||||
|
||||
# Проверить статус
|
||||
make k8s helm status kubernetes loki
|
||||
```
|
||||
|
||||
#### Jaeger для трейсинга
|
||||
|
||||
```bash
|
||||
# Добавить репозиторий Jaeger
|
||||
make k8s helmrepo add kubernetes jaegertracing https://jaegertracing.github.io/helm-charts
|
||||
|
||||
# Установить Jaeger
|
||||
make k8s helm apply kubernetes jaeger jaegertracing/jaeger
|
||||
|
||||
# Проверить статус
|
||||
make k8s helm status kubernetes jaeger
|
||||
```
|
||||
|
||||
## Service Mesh с Istio
|
||||
|
||||
### Установка Istio
|
||||
|
||||
Istio устанавливается автоматически при создании кластера с пресетом `kubernetes`.
|
||||
|
||||
### Ручная установка Istio
|
||||
|
||||
```bash
|
||||
# Добавить репозиторий Istio
|
||||
make k8s helmrepo add kubernetes istio https://istio-release.storage.googleapis.com/charts
|
||||
|
||||
# Установить Istio base
|
||||
make k8s helm apply kubernetes istio-base istio/base
|
||||
|
||||
# Установить Istiod (control plane)
|
||||
make k8s helm apply kubernetes istiod istio/istiod \
|
||||
--set values.global.istiod.enableAnalysis=true
|
||||
|
||||
# Установить Istio Ingress Gateway
|
||||
make k8s helm apply kubernetes istio-ingress istio/gateway
|
||||
```
|
||||
|
||||
### Kiali для визуализации Istio
|
||||
|
||||
Kiali устанавливается автоматически с пресетом `kubernetes`.
|
||||
|
||||
#### Доступ к Kiali
|
||||
|
||||
```bash
|
||||
# URL: http://localhost:20001
|
||||
# Откройте в браузере для визуализации Service Mesh
|
||||
|
||||
# Настройки доступа
|
||||
# Username: admin
|
||||
# Password: admin (если используется анонимный доступ)
|
||||
```
|
||||
|
||||
#### Ручная установка Kiali
|
||||
|
||||
```bash
|
||||
# Добавить репозиторий Kiali
|
||||
make k8s helmrepo add kubernetes kiali https://kiali.org/helm-charts
|
||||
|
||||
# Установить Kiali
|
||||
make k8s helm apply kubernetes kiali-server kiali/kiali-server \
|
||||
--set auth.strategy=anonymous \
|
||||
--set deployment.ingress.enabled=true \
|
||||
--set server.web_root="/"
|
||||
|
||||
# Проверить статус
|
||||
make k8s helm status kubernetes kiali-server
|
||||
```
|
||||
|
||||
### Пример приложения с Istio
|
||||
|
||||
Создайте файл `istio-app.yaml`:
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: bookinfo
|
||||
labels:
|
||||
istio-injection: enabled
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: productpage
|
||||
namespace: bookinfo
|
||||
spec:
|
||||
ports:
|
||||
- port: 9080
|
||||
name: http
|
||||
targetPort: 9080
|
||||
selector:
|
||||
app: productpage
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: productpage
|
||||
namespace: bookinfo
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
app: productpage
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: productpage
|
||||
spec:
|
||||
containers:
|
||||
- name: productpage
|
||||
image: istio/examples-bookinfo-productpage-v1:latest
|
||||
ports:
|
||||
- containerPort: 9080
|
||||
```
|
||||
|
||||
Примените:
|
||||
|
||||
```bash
|
||||
make k8s manifest apply kubernetes ./istio-app.yaml
|
||||
```
|
||||
|
||||
## Примеры полных развертываний
|
||||
|
||||
### Пример 1: WordPress с MySQL
|
||||
|
||||
```bash
|
||||
# 1. Установить MySQL через Helm
|
||||
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||
make k8s helm apply kubernetes mysql bitnami/mysql \
|
||||
--set auth.rootPassword=secretpassword
|
||||
|
||||
# 2. Создать манифест для WordPress
|
||||
cat > wordpress.yaml <<EOF
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: wordpress
|
||||
spec:
|
||||
replicas: 2
|
||||
selector:
|
||||
matchLabels:
|
||||
app: wordpress
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: wordpress
|
||||
spec:
|
||||
containers:
|
||||
- name: wordpress
|
||||
image: wordpress:latest
|
||||
env:
|
||||
- name: WORDPRESS_DB_HOST
|
||||
value: mysql.default.svc.cluster.local
|
||||
- name: WORDPRESS_DB_USER
|
||||
value: root
|
||||
- name: WORDPRESS_DB_PASSWORD
|
||||
value: secretpassword
|
||||
ports:
|
||||
- containerPort: 80
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: wordpress
|
||||
spec:
|
||||
selector:
|
||||
app: wordpress
|
||||
ports:
|
||||
- port: 80
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: wordpress-ingress
|
||||
spec:
|
||||
rules:
|
||||
- host: wordpress.local
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: wordpress
|
||||
port:
|
||||
number: 80
|
||||
EOF
|
||||
|
||||
# 3. Применить манифест
|
||||
make k8s manifest apply kubernetes ./wordpress.yaml
|
||||
```
|
||||
|
||||
### Пример 2: Многоуровневое приложение с мониторингом
|
||||
|
||||
```bash
|
||||
# 1. Установить Redis
|
||||
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||
make k8s helm apply kubernetes redis bitnami/redis
|
||||
|
||||
# 2. Установить PostgreSQL
|
||||
make k8s helm apply kubernetes postgres bitnami/postgresql
|
||||
|
||||
# 3. Создать приложение
|
||||
cat > app.yaml <<EOF
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: api-server
|
||||
spec:
|
||||
replicas: 3
|
||||
selector:
|
||||
matchLabels:
|
||||
app: api
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: api
|
||||
version: v1
|
||||
spec:
|
||||
containers:
|
||||
- name: api
|
||||
image: nginx:alpine
|
||||
ports:
|
||||
- containerPort: 80
|
||||
env:
|
||||
- name: REDIS_HOST
|
||||
value: redis-master.default.svc.cluster.local
|
||||
- name: POSTGRES_HOST
|
||||
value: postgresql-postgresql.default.svc.cluster.local
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: api-service
|
||||
spec:
|
||||
selector:
|
||||
app: api
|
||||
ports:
|
||||
- port: 80
|
||||
---
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: api-ingress
|
||||
spec:
|
||||
rules:
|
||||
- host: api.local
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: api-service
|
||||
port:
|
||||
number: 80
|
||||
EOF
|
||||
|
||||
# 4. Применить
|
||||
make k8s manifest apply kubernetes ./app.yaml
|
||||
```
|
||||
|
||||
### Пример 3: CI/CD с Jenkins в Kubernetes
|
||||
|
||||
```bash
|
||||
# 1. Установить Jenkins
|
||||
make k8s helmrepo add kubernetes jenkins https://charts.jenkins.io
|
||||
make k8s helm apply kubernetes jenkins jenkins/jenkins \
|
||||
--set persistence.enabled=true \
|
||||
--set controller.installPlugins.enabled=true
|
||||
|
||||
# 2. Получить пароль администратора
|
||||
kubectl --kubeconfig kubeconfig exec \
|
||||
-n default svc/jenkins -c jenkins -- \
|
||||
cat /run/secrets/additional/chart-admin-password
|
||||
```
|
||||
|
||||
## Полезные команды и советы
|
||||
|
||||
### Мониторинг ресурсов
|
||||
|
||||
```bash
|
||||
# Просмотр использования ресурсов узлами
|
||||
kubectl --kubeconfig kubeconfig top nodes
|
||||
|
||||
# Просмотр использования ресурсов подами
|
||||
kubectl --kubeconfig kubeconfig top pods
|
||||
|
||||
# Детальная информация о узле
|
||||
kubectl --kubeconfig kubeconfig describe node lab-control-plane
|
||||
```
|
||||
|
||||
### Отладка
|
||||
|
||||
```bash
|
||||
# Просмотр логов пода
|
||||
kubectl --kubeconfig kubeconfig logs <pod-name>
|
||||
|
||||
# Просмотр логов с follow
|
||||
kubectl --kubeconfig kubeconfig logs -f <pod-name>
|
||||
|
||||
# Выполнить команду в поде
|
||||
kubectl --kubeconfig kubeconfig exec -it <pod-name> -- /bin/sh
|
||||
|
||||
# Описание ресурса
|
||||
kubectl --kubeconfig kubeconfig describe pod <pod-name>
|
||||
kubectl --kubeconfig kubeconfig describe service <service-name>
|
||||
```
|
||||
|
||||
### Масштабирование
|
||||
|
||||
```bash
|
||||
# Масштабировать Deployment
|
||||
kubectl --kubeconfig kubeconfig scale deployment <deployment-name> --replicas=5
|
||||
|
||||
# Автомасштабирование (требует metrics-server)
|
||||
kubectl --kubeconfig kubeconfig autoscale deployment <deployment-name> \
|
||||
--cpu-percent=70 --min=2 --max=10
|
||||
```
|
||||
|
||||
### Экспорт конфигурации
|
||||
|
||||
```bash
|
||||
# Экспортировать ресурс в YAML
|
||||
kubectl --kubeconfig kubeconfig get deployment <name> -o yaml > exported.yaml
|
||||
|
||||
# Экспортировать все ресурсы namespace
|
||||
kubectl --kubeconfig kubeconfig get all -n <namespace> -o yaml > all-resources.yaml
|
||||
```
|
||||
|
||||
## Безопасность
|
||||
|
||||
### Использование Secrets
|
||||
|
||||
```bash
|
||||
# Создать Secret из файла
|
||||
kubectl --kubeconfig kubeconfig create secret generic my-secret \
|
||||
--from-file=username=./username.txt \
|
||||
--from-file=password=./password.txt
|
||||
|
||||
# Создать Secret из литерала
|
||||
kubectl --kubeconfig kubeconfig create secret generic my-secret \
|
||||
--from-literal=username=admin \
|
||||
--from-literal=password=secret123
|
||||
```
|
||||
|
||||
### Network Policies
|
||||
|
||||
Создайте файл `network-policy.yaml`:
|
||||
|
||||
```yaml
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: NetworkPolicy
|
||||
metadata:
|
||||
name: test-network-policy
|
||||
namespace: default
|
||||
spec:
|
||||
podSelector:
|
||||
matchLabels:
|
||||
role: db
|
||||
policyTypes:
|
||||
- Ingress
|
||||
- Egress
|
||||
ingress:
|
||||
- from:
|
||||
- podSelector:
|
||||
matchLabels:
|
||||
role: api
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 5432
|
||||
egress:
|
||||
- to:
|
||||
- podSelector:
|
||||
matchLabels:
|
||||
role: api
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 5432
|
||||
```
|
||||
|
||||
Примените:
|
||||
|
||||
```bash
|
||||
make k8s manifest apply kubernetes ./network-policy.yaml
|
||||
```
|
||||
|
||||
## Заключение
|
||||
|
||||
DevOpsLab предоставляет полный набор инструментов для работы с Kubernetes кластерами локально. Вы можете:
|
||||
|
||||
- Создавать и управлять кластерами
|
||||
- Устанавливать и настраивать приложения
|
||||
- Работать с мониторингом и Service Mesh
|
||||
- Тестировать перед развертыванием в production
|
||||
|
||||
Все инструменты работают внутри Docker контейнеров, что обеспечивает изоляцию и переносимость.
|
||||
|
||||
## Автор
|
||||
|
||||
Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
@@ -1,794 +0,0 @@
|
||||
# Kubernetes Kind Кластеры
|
||||
|
||||
**Автор:** Сергей Антропов
|
||||
**Сайт:** https://devops.org.ru
|
||||
|
||||
## Содержание
|
||||
|
||||
- [Описание](#описание)
|
||||
- [Требования к системе](#требования-к-системе)
|
||||
- [Возможности](#возможности)
|
||||
- [Быстрый старт](#быстрый-старт)
|
||||
- [Команды управления](#команды-управления)
|
||||
- [Работа с Helm](#работа-с-helm)
|
||||
- [Работа с манифестами](#работа-с-манифестами)
|
||||
- [Управление Ingress](#управление-ingress)
|
||||
- [Проброс портов (Port-forward)](#проброс-портов-port-forward)
|
||||
- [Мониторинг и логи](#мониторинг-и-логи)
|
||||
- [Конфигурация](#конфигурация)
|
||||
- [Архитектура](#архитектура)
|
||||
- [Доступ к приложениям](#доступ-к-приложениям)
|
||||
- [Кроссплатформенность](#кроссплатформенность)
|
||||
- [Подробная документация по скриптам](#подробная-документация-по-скриптам)
|
||||
- [Best Practices](#best-practices)
|
||||
- [Troubleshooting](#troubleshooting)
|
||||
|
||||
---
|
||||
|
||||
## Описание
|
||||
|
||||
Проект поддерживает автоматическое создание и управление Kubernetes кластерами на базе [Kind](https://kind.sigs.k8s.io/) для тестирования в изолированной лабораторной среде.
|
||||
|
||||
Kind позволяет создавать локальные Kubernetes кластеры внутри Docker контейнеров, что идеально подходит для разработки и тестирования без необходимости устанавливать полный Kubernetes.
|
||||
|
||||
## Требования к системе
|
||||
|
||||
### Обязательные требования
|
||||
|
||||
1. **Docker** - для запуска Kind кластеров
|
||||
2. **Python 3** - для управления port-forward
|
||||
3. **kubectl** - для работы с кластером
|
||||
|
||||
**Установка на macOS:**
|
||||
```bash
|
||||
brew install docker python3 kubectl
|
||||
```
|
||||
|
||||
**Установка на Ubuntu/Debian:**
|
||||
```bash
|
||||
sudo apt update && sudo apt install -y docker.io python3 python3-pip kubectl
|
||||
```
|
||||
|
||||
**Установка на CentOS/RHEL:**
|
||||
```bash
|
||||
sudo yum install -y docker python3 python3-pip kubectl
|
||||
sudo systemctl start docker
|
||||
sudo systemctl enable docker
|
||||
```
|
||||
|
||||
### Проверка установки
|
||||
|
||||
```bash
|
||||
docker --version
|
||||
python3 --version
|
||||
kubectl version --client
|
||||
```
|
||||
|
||||
### Docker группы
|
||||
|
||||
На Linux добавьте пользователя в группу docker:
|
||||
```bash
|
||||
sudo usermod -aG docker $USER
|
||||
# Выйдите и войдите заново
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Возможности
|
||||
|
||||
- ✅ Создание Kind кластеров с настраиваемым количеством worker-узлов
|
||||
- ✅ Автоматическая установка аддонов (Ingress NGINX, Metrics Server, Istio, Kiali, Prometheus Stack)
|
||||
- ✅ **Автоматический port-forward** для доступа к сервисам
|
||||
- ✅ Работа с Helm (установка, удаление, обновление, rollback)
|
||||
- ✅ Работа с Kubernetes манифестами
|
||||
- ✅ Управление Helm репозиториями
|
||||
- ✅ Автоматическое управление `/etc/hosts` для Ingress
|
||||
- ✅ Управление Docker контейнерами в лабораторной сети
|
||||
- ✅ Интеграция с Istio Service Mesh
|
||||
- ✅ Детальный отчет о состоянии кластера
|
||||
|
||||
---
|
||||
|
||||
## Быстрый старт
|
||||
|
||||
### 1. Создание кластера
|
||||
|
||||
```bash
|
||||
# Создание кластера с полным набором аддонов
|
||||
make k8s create kubernetes
|
||||
```
|
||||
|
||||
### 2. Проверка статуса
|
||||
|
||||
```bash
|
||||
# Детальный отчет о кластере
|
||||
make k8s status kubernetes
|
||||
```
|
||||
|
||||
### 3. Доступ к аддонам
|
||||
|
||||
После создания кластера автоматически создаются port-forward:
|
||||
- Grafana: http://localhost:3000
|
||||
- Prometheus: http://localhost:9090
|
||||
- Kiali: http://localhost:20001
|
||||
|
||||
### 4. Удаление кластера
|
||||
|
||||
```bash
|
||||
make k8s destroy kubernetes
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Команды управления
|
||||
|
||||
### Создание кластера
|
||||
|
||||
```bash
|
||||
# Минимальный кластер (без аддонов)
|
||||
make k8s create
|
||||
|
||||
# Полный кластер с аддонами
|
||||
make k8s create kubernetes
|
||||
|
||||
# Пользовательский пресет
|
||||
make k8s create my-custom-preset
|
||||
```
|
||||
|
||||
**Что происходит:**
|
||||
1. Создается контейнер `k8s-controller` с инструментами (Kind, kubectl, Helm, Istio CLI)
|
||||
2. Создаются Docker контейнеры из раздела `hosts` (если есть)
|
||||
3. Создается Kind кластер
|
||||
4. Устанавливаются аддоны
|
||||
5. Создается автоматический port-forward
|
||||
6. Добавляются записи в `/etc/hosts` для Ingress
|
||||
|
||||
### Управление жизненным циклом
|
||||
|
||||
```bash
|
||||
# Удаление кластера (с очисткой port-forward и /etc/hosts)
|
||||
make k8s destroy [preset]
|
||||
|
||||
# Остановка кластера (без удаления)
|
||||
make k8s stop [preset]
|
||||
|
||||
# Запуск остановленного кластера
|
||||
make k8s start [preset]
|
||||
|
||||
# Детальный отчет о состоянии
|
||||
make k8s status [preset]
|
||||
|
||||
# Показать узлы кластера
|
||||
make k8s nodes [preset]
|
||||
```
|
||||
|
||||
### Получение kubeconfig
|
||||
|
||||
```bash
|
||||
# Сохранить kubeconfig для подключения
|
||||
make k8s config [preset]
|
||||
|
||||
# Использовать конфиг
|
||||
export KUBECONFIG=kubeconfig
|
||||
kubectl get nodes
|
||||
```
|
||||
|
||||
### Shell доступ
|
||||
|
||||
```bash
|
||||
# Открыть shell в контейнере k8s-controller
|
||||
make k8s shell [preset]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Работа с Helm
|
||||
|
||||
Helm - это менеджер пакетов для Kubernetes.
|
||||
|
||||
### Управление релизами
|
||||
|
||||
```bash
|
||||
# Установить чарт
|
||||
make k8s helm apply kubernetes nginx stable/nginx-ingress
|
||||
|
||||
# Обновить релиз
|
||||
make k8s helm update kubernetes nginx stable/nginx-ingress
|
||||
|
||||
# Откатить релиз
|
||||
make k8s helm rollback kubernetes nginx
|
||||
|
||||
# Посмотреть статус релиза
|
||||
make k8s helm status kubernetes nginx
|
||||
|
||||
# Удалить релиз
|
||||
make k8s helm delete kubernetes nginx
|
||||
|
||||
# Список всех релизов
|
||||
make k8s helm list kubernetes
|
||||
```
|
||||
|
||||
### Управление репозиториями
|
||||
|
||||
```bash
|
||||
# Добавить репозиторий
|
||||
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
|
||||
|
||||
# Обновить репозиторий
|
||||
make k8s helmrepo update kubernetes stable
|
||||
|
||||
# Список репозиториев
|
||||
make k8s helmrepo list kubernetes
|
||||
|
||||
# Показать доступные чарты
|
||||
make k8s helmrepo packages kubernetes stable
|
||||
|
||||
# Удалить репозиторий
|
||||
make k8s helmrepo delete kubernetes stable
|
||||
```
|
||||
|
||||
### Пример: установка MySQL
|
||||
|
||||
```bash
|
||||
# Добавить репозиторий Bitnami
|
||||
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||
|
||||
# Установить MySQL
|
||||
make k8s helm apply kubernetes mysql bitnami/mysql
|
||||
|
||||
# Проверить статус
|
||||
make k8s helm status kubernetes mysql
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Работа с манифестами
|
||||
|
||||
Применение обычных Kubernetes манифестов (без Helm).
|
||||
|
||||
```bash
|
||||
# Применить манифест из URL
|
||||
make k8s manifest apply kubernetes https://example.com/deploy.yaml
|
||||
|
||||
# Применить манифест из файла
|
||||
make k8s manifest apply kubernetes /path/to/manifest.yaml
|
||||
|
||||
# Удалить манифест
|
||||
make k8s manifest delete kubernetes https://example.com/deploy.yaml
|
||||
```
|
||||
|
||||
### Пример: создание Deployment
|
||||
|
||||
```yaml
|
||||
# nginx-deployment.yaml
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: nginx
|
||||
spec:
|
||||
replicas: 3
|
||||
selector:
|
||||
matchLabels:
|
||||
app: nginx
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: nginx
|
||||
spec:
|
||||
containers:
|
||||
- name: nginx
|
||||
image: nginx:latest
|
||||
ports:
|
||||
- containerPort: 80
|
||||
```
|
||||
|
||||
```bash
|
||||
# Применить
|
||||
make k8s manifest apply kubernetes ./nginx-deployment.yaml
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Управление Ingress
|
||||
|
||||
### Доступ к приложениям через Ingress
|
||||
|
||||
Для доступа к приложениям по доменным именам нужно вручную добавить записи в `/etc/hosts`:
|
||||
|
||||
```bash
|
||||
# Добавить запись в /etc/hosts
|
||||
echo "127.0.0.1 grafana.local #k8s" | sudo tee -a /etc/hosts
|
||||
|
||||
# Очистить DNS кеш macOS
|
||||
sudo killall -HUP mDNSResponder
|
||||
```
|
||||
|
||||
После этого приложение будет доступно по адресу:
|
||||
```
|
||||
http://grafana.local:8081
|
||||
```
|
||||
|
||||
**Пример манифеста Ingress:**
|
||||
|
||||
```yaml
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: grafana-ingress
|
||||
namespace: monitoring
|
||||
spec:
|
||||
rules:
|
||||
- host: grafana.local
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: monitoring-grafana
|
||||
port:
|
||||
number: 80
|
||||
```
|
||||
|
||||
**Важно:**
|
||||
- Записи в `/etc/hosts` нужно добавлять вручную
|
||||
- Используйте порт 8081 для HTTP и 8443 для HTTPS
|
||||
- Для удаления записей используйте sudo
|
||||
|
||||
---
|
||||
|
||||
## Проброс портов (Port-forward)
|
||||
|
||||
Port-forward позволяет получить доступ к ClusterIP сервисам извне кластера.
|
||||
|
||||
### Автоматический port-forward
|
||||
|
||||
После создания кластера автоматически создаются порты:
|
||||
- Ingress HTTP: `8081:80`
|
||||
- Ingress HTTPS: `8443:443`
|
||||
- Grafana: `3000:80`
|
||||
- Prometheus: `9090:9090`
|
||||
- Kiali: `20001:20001`
|
||||
|
||||
### Управление вручную
|
||||
|
||||
```bash
|
||||
# Создать port-forward
|
||||
make k8s portforward create
|
||||
|
||||
# Список активных портов
|
||||
make k8s portforward list
|
||||
|
||||
# Удалить конкретный порт
|
||||
make k8s portforward delete 3000
|
||||
|
||||
# Очистить все порты
|
||||
make k8s portforward clear
|
||||
|
||||
# Пересоздать порты
|
||||
make k8s portforward recreate
|
||||
```
|
||||
|
||||
### Ручной port-forward для своих сервисов
|
||||
|
||||
```bash
|
||||
# Подключиться к кластеру
|
||||
export KUBECONFIG=$(docker exec k8s-controller cat /root/.kube/config)
|
||||
|
||||
# Создать port-forward
|
||||
kubectl port-forward -n default svc/my-service 8080:80
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Мониторинг и логи
|
||||
|
||||
### Детальный статус кластера
|
||||
|
||||
```bash
|
||||
make k8s status kubernetes
|
||||
```
|
||||
|
||||
Показывает:
|
||||
- Узлы кластера
|
||||
- Namespaces
|
||||
- Pods
|
||||
- Services
|
||||
- Ingress
|
||||
- Deployments
|
||||
- DaemonSets
|
||||
- StatefulSets
|
||||
- PVC
|
||||
- События
|
||||
- Helm релизы
|
||||
- Использование ресурсов
|
||||
|
||||
### Доступ к аддонам
|
||||
|
||||
**Grafana:**
|
||||
```
|
||||
URL: http://localhost:3000
|
||||
Login: admin
|
||||
Password: admin
|
||||
```
|
||||
|
||||
**Prometheus:**
|
||||
```
|
||||
URL: http://localhost:9090
|
||||
```
|
||||
|
||||
**Kiali:**
|
||||
```
|
||||
URL: http://localhost:20001
|
||||
Login: admin
|
||||
Password: admin
|
||||
```
|
||||
|
||||
### Логи контейнера
|
||||
|
||||
```bash
|
||||
# Логи k8s-controller
|
||||
docker logs k8s-controller
|
||||
|
||||
# Логи в реальном времени
|
||||
docker logs -f k8s-controller
|
||||
```
|
||||
|
||||
### Логи кластера
|
||||
|
||||
```bash
|
||||
# Логи конкретного pod
|
||||
make k8s shell kubernetes
|
||||
kubectl logs -n monitoring <pod-name>
|
||||
|
||||
# Все логи в namespace
|
||||
kubectl logs -n monitoring --all-containers=true --tail=100
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Конфигурация
|
||||
|
||||
### Пресеты
|
||||
|
||||
Пресеты находятся в `molecule/presets/k8s/`:
|
||||
|
||||
**kubernetes.yml** - полный набор аддонов:
|
||||
- Ingress NGINX
|
||||
- Metrics Server
|
||||
- Istio
|
||||
- Kiali
|
||||
- Prometheus + Grafana
|
||||
|
||||
### Структура пресета
|
||||
|
||||
```yaml
|
||||
k8s_cluster:
|
||||
name: lab
|
||||
nodes: 1
|
||||
|
||||
addons:
|
||||
ingress: true
|
||||
metrics_server: true
|
||||
istio: true
|
||||
kiali: true
|
||||
prometheus_stack: true
|
||||
|
||||
addon_ports:
|
||||
ingress_http: 8081
|
||||
ingress_https: 8443
|
||||
prometheus: 9090
|
||||
grafana: 3000
|
||||
kiali: 20001
|
||||
metrics_server: 4443
|
||||
|
||||
hosts:
|
||||
- name: test1
|
||||
image: centos8
|
||||
systemd_defaults:
|
||||
container: true
|
||||
|
||||
images:
|
||||
centos8:
|
||||
name: inecs/ansible-lab:centos8-latest
|
||||
```
|
||||
|
||||
### Пользовательский пресет
|
||||
|
||||
Создайте файл `molecule/presets/k8s/my-preset.yml`:
|
||||
|
||||
```yaml
|
||||
k8s_cluster:
|
||||
name: my-cluster
|
||||
nodes: 2
|
||||
|
||||
addons:
|
||||
ingress: true
|
||||
metrics_server: false
|
||||
istio: false
|
||||
kiali: false
|
||||
prometheus_stack: false
|
||||
```
|
||||
|
||||
Использование:
|
||||
```bash
|
||||
make k8s create my-preset
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Архитектура
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ Локальная машина │
|
||||
│ │
|
||||
│ ┌──────────────────────────────────────────────┐ │
|
||||
│ │ Makefile → Python скрипты → Docker API │ │
|
||||
│ │ kubectl (port-forward) │ │
|
||||
│ └──────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
│
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ Docker: k8s-controller │
|
||||
│ ┌──────────────────────────────────────────────┐ │
|
||||
│ │ kind, kubectl, helm, istioctl │ │
|
||||
│ └──────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
│
|
||||
↓
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ Docker сеть: kind │
|
||||
│ ┌──────────────────────────────────────────────┐ │
|
||||
│ │ Kind Kubernetes Cluster │ │
|
||||
│ │ • Control Plane (6443) │ │
|
||||
│ │ • Worker Nodes │ │
|
||||
│ │ • Services (ClusterIP) │ │
|
||||
│ │ • Ingress Controller │ │
|
||||
│ │ • Istio Service Mesh │ │
|
||||
│ └──────────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Компоненты
|
||||
|
||||
1. **k8s-controller** - контейнер с инструментами управления
|
||||
2. **Kind кластер** - Kubernetes кластер в Docker контейнерах
|
||||
3. **Port-forward** - локальные процессы на хосте
|
||||
4. **Ingress** - маршрутизация трафика внутрь кластера
|
||||
|
||||
---
|
||||
|
||||
## Доступ к приложениям
|
||||
|
||||
### Доступ через Ingress
|
||||
|
||||
1. Создайте Ingress манифест
|
||||
2. Примените через `make k8s manifest apply`
|
||||
3. Запись автоматически добавится в `/etc/hosts`
|
||||
4. Приложение доступно по доменному имени
|
||||
|
||||
### Доступ через port-forward
|
||||
|
||||
Для ClusterIP сервисов:
|
||||
```bash
|
||||
kubectl port-forward -n namespace svc/service-name 8080:80
|
||||
```
|
||||
|
||||
Доступ: http://localhost:8080
|
||||
|
||||
### Доступ внутри кластера
|
||||
|
||||
Из другого pod:
|
||||
```bash
|
||||
kubectl exec -it pod-name -- curl http://service-name.namespace:80
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Кроссплатформенность
|
||||
|
||||
### Поддерживаемые платформы
|
||||
|
||||
- **macOS (Intel & Apple Silicon)** - полная поддержка
|
||||
- **Linux (amd64 & arm64)** - полная поддержка
|
||||
- **Windows** - через WSL2
|
||||
|
||||
### Проблемы на разных платформах
|
||||
|
||||
**Apple Silicon (M1/M2):**
|
||||
- Используется ARM64 образы
|
||||
- Автоматическое определение архитектуры
|
||||
|
||||
**Linux:**
|
||||
- Требуются права на Docker socket
|
||||
- Возможны проблемы с selinux
|
||||
|
||||
---
|
||||
|
||||
## Подробная документация по скриптам
|
||||
|
||||
Для подробного описания работы всех скриптов управления Kubernetes смотрите:
|
||||
|
||||
📖 [Документация по скриптам Kubernetes](k8s-scripts.md)
|
||||
|
||||
Включает:
|
||||
- Описание каждого скрипта
|
||||
- Принцип работы
|
||||
- Примеры использования
|
||||
- Архитектура взаимодействия
|
||||
- Отладка
|
||||
|
||||
---
|
||||
|
||||
## Best Practices
|
||||
|
||||
### 1. Используйте пресеты
|
||||
|
||||
Не создавайте кластеры вручную, используйте пресеты для консистентности.
|
||||
|
||||
### 2. Очищайте после работы
|
||||
|
||||
```bash
|
||||
# После тестирования
|
||||
make k8s destroy kubernetes
|
||||
```
|
||||
|
||||
### 3. Проверяйте статус
|
||||
|
||||
```bash
|
||||
# Регулярно проверяйте статус
|
||||
make k8s status kubernetes
|
||||
```
|
||||
|
||||
### 4. Используйте Helm для сложных приложений
|
||||
|
||||
Для многослойных приложений лучше использовать Helm вместо сырых манифестов.
|
||||
|
||||
### 5. Логируйте изменения
|
||||
|
||||
Все изменения в кластере через `make k8s` автоматически логируются.
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Кластер не создается
|
||||
|
||||
**Проблема:** `kind create cluster` завершается с ошибкой
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверьте Docker
|
||||
docker ps
|
||||
|
||||
# Перезапустите Docker
|
||||
sudo systemctl restart docker
|
||||
|
||||
# Очистите старые кластеры
|
||||
kind delete cluster --all
|
||||
```
|
||||
|
||||
### Port-forward не работает
|
||||
|
||||
**Проблема:** Невозможно подключиться к порту
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверьте процессы
|
||||
make k8s portforward list
|
||||
|
||||
# Пересоздайте порты
|
||||
make k8s portforward recreate
|
||||
|
||||
# Проверьте, что порт свободен
|
||||
lsof -i :3000
|
||||
```
|
||||
|
||||
### kubectl не подключается
|
||||
|
||||
**Проблема:** `kubectl get nodes` выдает ошибку
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверьте контейнер
|
||||
docker ps | grep k8s-controller
|
||||
|
||||
# Зайдите в контейнер
|
||||
make k8s shell kubernetes
|
||||
|
||||
# Проверьте кластер
|
||||
kubectl get nodes
|
||||
|
||||
# Если не работает, пересоздайте кластер
|
||||
make k8s destroy kubernetes
|
||||
make k8s create kubernetes
|
||||
```
|
||||
|
||||
### Аддоны не устанавливаются
|
||||
|
||||
**Проблема:** Grafana/Prometheus/Kiali не доступны
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверьте статус кластера
|
||||
make k8s status kubernetes
|
||||
|
||||
# Проверьте pods
|
||||
make k8s shell kubernetes
|
||||
kubectl get pods -n monitoring
|
||||
kubectl logs -n monitoring <pod-name>
|
||||
|
||||
# Пересоздайте кластер
|
||||
make k8s destroy kubernetes
|
||||
make k8s create kubernetes
|
||||
```
|
||||
|
||||
### Ingress не работает
|
||||
|
||||
**Проблема:** Доменные имена не резолвятся
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверьте Ingress
|
||||
make k8s shell kubernetes
|
||||
kubectl get ingress --all-namespaces
|
||||
|
||||
# Добавьте запись в /etc/hosts вручную
|
||||
echo "127.0.0.1 grafana.local #k8s" | sudo tee -a /etc/hosts
|
||||
|
||||
# Очистите DNS кеш
|
||||
sudo killall -HUP mDNSResponder
|
||||
|
||||
# Проверьте доступность
|
||||
curl http://grafana.local:8081
|
||||
```
|
||||
|
||||
### Helm чарты не устанавливаются
|
||||
|
||||
**Проблема:** `helm install` завершается с ошибкой
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверьте репозитории
|
||||
make k8s helmrepo list kubernetes
|
||||
|
||||
# Обновите репозитории
|
||||
make k8s helmrepo update kubernetes stable
|
||||
|
||||
# Проверьте логи
|
||||
make k8s shell kubernetes
|
||||
kubectl logs -l app=<release-name>
|
||||
```
|
||||
|
||||
### Контейнер k8s-controller не запускается
|
||||
|
||||
**Проблема:** `docker: Error response from daemon: ...`
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверьте образ
|
||||
docker images | grep k8s
|
||||
|
||||
# Пересоберите образ
|
||||
make docker build-image IMAGE=k8s-amd64
|
||||
make docker build-image IMAGE=k8s-arm64
|
||||
|
||||
# Проверьте Docker
|
||||
docker system prune -f
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Контакты
|
||||
|
||||
- **Автор:** Сергей Антропов
|
||||
- **Сайт:** https://devops.org.ru
|
||||
- **GitHub:** https://github.com/your-repo
|
||||
|
||||
---
|
||||
|
||||
## Лицензия
|
||||
|
||||
MIT
|
||||
@@ -1,226 +0,0 @@
|
||||
# 🔍 Руководство по линтингу ролей
|
||||
|
||||
## Автор
|
||||
Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
|
||||
## Обзор
|
||||
|
||||
Линтинг ролей - это автоматическая проверка синтаксиса, стиля и соответствия лучшим практикам Ansible. В DevOpsLab используется `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
|
||||
@@ -1,859 +0,0 @@
|
||||
# Подробное руководство по файлам Molecule
|
||||
|
||||
**Автор:** Сергей Антропов
|
||||
**Сайт:** https://devops.org.ru
|
||||
|
||||
## 📋 Обзор
|
||||
|
||||
Molecule - это инструмент для тестирования Ansible ролей в изолированных окружениях. В проекте DevOpsLab используется универсальная конфигурация 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
|
||||
- **Собственные образы:** DevOpsLab создает собственные образы для тестирования
|
||||
|
||||
**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:alt9-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 файлов
|
||||
- **Образы:** Собственные образы DevOpsLab для всех поддерживаемых ОС
|
||||
- **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` - команды для запуска тестов
|
||||
@@ -1,424 +0,0 @@
|
||||
# Мониторинг и диагностика DevOpsLab
|
||||
|
||||
**Автор:** Сергей Антропов
|
||||
**Сайт:** https://devops.org.ru
|
||||
**Версия:** 3.0.0
|
||||
|
||||
## 🔍 Диагностика Docker
|
||||
|
||||
### Проверка состояния Docker
|
||||
|
||||
```bash
|
||||
# Проверка статуса Docker
|
||||
docker info
|
||||
|
||||
# Проверка запущенных контейнеров
|
||||
docker ps -a
|
||||
|
||||
# Проверка образов DevOpsLab
|
||||
docker images | grep inecs/ansible-lab
|
||||
|
||||
# Проверка сетей
|
||||
docker network ls | grep labnet
|
||||
```
|
||||
|
||||
### Диагностика buildx проблем
|
||||
|
||||
```bash
|
||||
# Полная диагностика buildx
|
||||
make docker diagnose
|
||||
|
||||
# Проверка builder'а
|
||||
make docker check-builder
|
||||
|
||||
# Сброс builder'а при проблемах
|
||||
make docker reset-builder
|
||||
|
||||
# Настройка builder'а
|
||||
make docker setup-builder
|
||||
```
|
||||
|
||||
### Логи Docker
|
||||
|
||||
```bash
|
||||
# Логи Docker daemon (Linux)
|
||||
sudo journalctl -u docker.service -f
|
||||
|
||||
# Логи Docker (macOS)
|
||||
tail -f ~/Library/Containers/com.docker.docker/Data/log/vm/dockerd.log
|
||||
|
||||
# Логи конкретного контейнера
|
||||
docker logs ansible-controller
|
||||
|
||||
# Логи с временными метками
|
||||
docker logs -t ansible-controller
|
||||
|
||||
# Следить за логами в реальном времени
|
||||
docker logs -f ansible-controller
|
||||
|
||||
# Последние 100 строк логов
|
||||
docker logs --tail 100 ansible-controller
|
||||
```
|
||||
|
||||
## 🧪 Диагностика тестирования
|
||||
|
||||
### Проверка preset'ов
|
||||
|
||||
```bash
|
||||
# Список доступных preset'ов
|
||||
make presets list
|
||||
|
||||
# Информация о конкретном preset'е
|
||||
make presets info PRESET=default
|
||||
|
||||
# Проверка файлов preset'ов
|
||||
ls -la molecule/presets/
|
||||
|
||||
# Проверка всех preset'ов
|
||||
find molecule/presets -name "*.yml" -exec echo "=== {} ===" \; -exec cat {} \;
|
||||
```
|
||||
|
||||
### Проверка инвентори
|
||||
|
||||
```bash
|
||||
# Проверка продакшн инвентори
|
||||
cat inventory/hosts.ini
|
||||
|
||||
# Тестирование подключения
|
||||
ansible all -i inventory/hosts.ini -m ping
|
||||
|
||||
# Проверка доступности хостов
|
||||
ansible all -i inventory/hosts.ini -m shell -a "uname -a"
|
||||
```
|
||||
|
||||
### Логи тестирования
|
||||
|
||||
```bash
|
||||
# Проверка созданных контейнеров
|
||||
docker ps -a --filter "network=labnet"
|
||||
|
||||
# Логи всех контейнеров Molecule
|
||||
docker ps -a --filter "network=labnet" --format "{{.Names}}" | while read name; do
|
||||
echo "=== $name ==="
|
||||
docker logs $name 2>&1 | tail -20
|
||||
done
|
||||
|
||||
# Очистка контейнеров Molecule
|
||||
make clean-containers
|
||||
```
|
||||
|
||||
## 📊 Мониторинг ресурсов
|
||||
|
||||
### Мониторинг Docker
|
||||
|
||||
```bash
|
||||
# Статистика использования ресурсов контейнерами
|
||||
docker stats --no-stream
|
||||
|
||||
# Использование диска Docker
|
||||
docker system df
|
||||
|
||||
# Детальная информация о диске
|
||||
docker system df -v
|
||||
|
||||
# Очистка неиспользуемых ресурсов
|
||||
docker system prune -a
|
||||
```
|
||||
|
||||
### Мониторинг системы
|
||||
|
||||
```bash
|
||||
# Использование диска
|
||||
df -h
|
||||
|
||||
# Использование памяти
|
||||
free -h # Linux
|
||||
vm_stat # macOS
|
||||
|
||||
# Процессы Docker
|
||||
ps aux | grep docker
|
||||
|
||||
# CPU и память в реальном времени
|
||||
top
|
||||
# или
|
||||
htop
|
||||
```
|
||||
|
||||
### Мониторинг сети
|
||||
|
||||
```bash
|
||||
# Инспекция сети labnet
|
||||
docker network inspect labnet
|
||||
|
||||
# Статистика сети
|
||||
docker network inspect labnet --format '{{json .Containers}}' | jq
|
||||
|
||||
# Просмотр портов
|
||||
netstat -tulpn | grep docker
|
||||
|
||||
# Просмотр установленных соединений
|
||||
ss -tulpn | grep docker
|
||||
```
|
||||
|
||||
## 🔧 Диагностика ролей
|
||||
|
||||
### Проверка синтаксиса
|
||||
|
||||
```bash
|
||||
# Lint проверка всех ролей
|
||||
make role lint
|
||||
|
||||
# Lint проверка конкретной роли
|
||||
make role lint docker
|
||||
make role lint devops
|
||||
make role lint ping
|
||||
|
||||
# Проверка синтаксиса файлов роли
|
||||
ansible-playbook --syntax-check roles/docker/tasks/main.yml
|
||||
```
|
||||
|
||||
### Проверка переменных
|
||||
|
||||
```bash
|
||||
# Просмотр всех переменных для хоста
|
||||
ansible-inventory --list -i inventory/hosts.ini
|
||||
|
||||
# Проверка переменных конкретного хоста
|
||||
ansible-inventory --host web1.example.com -i inventory/hosts.ini
|
||||
|
||||
# Просмотр всех групп
|
||||
ansible-inventory --list | jq 'keys'
|
||||
```
|
||||
|
||||
### Тестирование ролей
|
||||
|
||||
```bash
|
||||
# Тестирование с подробным выводом
|
||||
make role test 2>&1 | tee test-output.log
|
||||
|
||||
# Тестирование конкретной роли
|
||||
make role test docker
|
||||
|
||||
# Тестирование с minimal preset
|
||||
make role test minimal
|
||||
|
||||
# Просмотр результатов теста
|
||||
docker logs $(docker ps -aq --filter "network=labnet" | head -1)
|
||||
```
|
||||
|
||||
## 🚨 Решение проблем
|
||||
|
||||
### Проблемы с Docker
|
||||
|
||||
#### Docker не запускается
|
||||
|
||||
```bash
|
||||
# Проверка статуса (Linux)
|
||||
sudo systemctl status docker
|
||||
|
||||
# Запуск Docker (Linux)
|
||||
sudo systemctl start docker
|
||||
|
||||
# Проверка логов (Linux)
|
||||
sudo journalctl -u docker.service -f
|
||||
|
||||
# Перезапуск Docker Desktop (macOS/Windows)
|
||||
# Use Docker Desktop interface
|
||||
```
|
||||
|
||||
#### Buildx зависает
|
||||
|
||||
```bash
|
||||
# Диагностика
|
||||
make docker diagnose
|
||||
|
||||
# Сброс builder'а
|
||||
make docker reset-builder
|
||||
|
||||
# Очистка контейнеров buildkit
|
||||
docker ps -a --filter "name=buildx_buildkit" --format "{{.Names}}" | xargs -r docker rm -f
|
||||
```
|
||||
|
||||
#### Образы не собираются
|
||||
|
||||
```bash
|
||||
# Очистка builder'а
|
||||
make docker clean-builder
|
||||
|
||||
# Пересоздание builder'а
|
||||
make docker setup-builder
|
||||
|
||||
# Полная пересборка
|
||||
make docker rebuild
|
||||
```
|
||||
|
||||
### Проблемы с тестированием
|
||||
|
||||
#### Preset'ы не работают
|
||||
|
||||
```bash
|
||||
# Проверка preset файлов
|
||||
ls -la molecule/presets/
|
||||
|
||||
# Проверка синтаксиса preset'а
|
||||
yamllint molecule/presets/default.yml
|
||||
|
||||
# Информация о preset'е
|
||||
make presets info PRESET=default
|
||||
```
|
||||
|
||||
#### Контейнеры не запускаются
|
||||
|
||||
```bash
|
||||
# Проверка созданных контейнеров
|
||||
docker ps -a --filter "network=labnet"
|
||||
|
||||
# Логи контейнера
|
||||
docker logs <container-name>
|
||||
|
||||
# Перезапуск контейнера
|
||||
docker restart <container-name>
|
||||
|
||||
# Удаление всех контейнеров Molecule
|
||||
make clean-containers
|
||||
```
|
||||
|
||||
#### Роли не выполняются
|
||||
|
||||
```bash
|
||||
# Проверка синтаксиса
|
||||
make role lint
|
||||
|
||||
# Тест с verbose выводом
|
||||
ansible-playbook -i inventory/hosts.ini site.yml -vvv
|
||||
|
||||
# Проверка переменных
|
||||
ansible-inventory --list -i inventory/hosts.ini
|
||||
|
||||
# Dry-run без выполнения
|
||||
ansible-playbook -i inventory/hosts.ini site.yml --check
|
||||
```
|
||||
|
||||
### Проблемы с ролями
|
||||
|
||||
#### Синтаксические ошибки
|
||||
|
||||
```bash
|
||||
# Lint проверка
|
||||
make role lint
|
||||
|
||||
# Проверка конкретной роли
|
||||
ansible-lint roles/docker/
|
||||
|
||||
# Проверка YAML синтаксиса
|
||||
yamllint roles/docker/tasks/main.yml
|
||||
```
|
||||
|
||||
#### Логика не работает
|
||||
|
||||
```bash
|
||||
# Проверка переменных
|
||||
ansible-playbook -i inventory/hosts.ini site.yml --list-tags
|
||||
ansible-playbook -i inventory/hosts.ini site.yml --list-tasks
|
||||
|
||||
# Выполнение конкретной задачи
|
||||
ansible-playbook -i inventory/hosts.ini site.yml --tags docker
|
||||
|
||||
# Debug режим
|
||||
ansible-playbook -i inventory/hosts.ini site.yml -vvv
|
||||
```
|
||||
|
||||
## 📈 Сбор диагностической информации
|
||||
|
||||
### Скрипт диагностики
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Создание отчета для диагностики
|
||||
|
||||
echo "🔍 Сбор диагностической информации..."
|
||||
|
||||
# Создание директории для логов
|
||||
mkdir -p debug-logs
|
||||
|
||||
# Docker информация
|
||||
docker info > debug-logs/docker-info.txt 2>&1
|
||||
docker images > debug-logs/docker-images.txt 2>&1
|
||||
docker ps -a > debug-logs/docker-containers.txt 2>&1
|
||||
docker network ls > debug-logs/docker-networks.txt 2>&1
|
||||
|
||||
# Системная информация
|
||||
df -h > debug-logs/disk-usage.txt 2>&1
|
||||
free -h > debug-logs/memory-usage.txt 2>&1 2>/dev/null || vm_stat > debug-logs/memory-usage.txt 2>&1
|
||||
ps aux | grep docker > debug-logs/docker-processes.txt 2>&1
|
||||
|
||||
# Информация о проекте
|
||||
ls -la roles/ > debug-logs/roles-list.txt 2>&1
|
||||
ls -la molecule/presets/ > debug-logs/presets-list.txt 2>&1
|
||||
cat inventory/hosts.ini > debug-logs/inventory.txt 2>&1
|
||||
|
||||
# Создание архива
|
||||
tar -czf debug-logs-$(date +%Y%m%d-%H%M%S).tar.gz debug-logs/
|
||||
|
||||
echo "✅ Диагностическая информация собрана в: debug-logs-$(date +%Y%m%d-%H%M%S).tar.gz"
|
||||
```
|
||||
|
||||
### Команды для быстрой диагностики
|
||||
|
||||
```bash
|
||||
# Быстрая проверка состояния
|
||||
echo "=== Docker Status ===" && docker info | head -5
|
||||
echo "=== DevOpsLab Images ===" && docker images | grep inecs/ansible-lab
|
||||
echo "=== Roles ===" && ls -1 roles/ | grep -v "\.yml"
|
||||
echo "=== Presets ===" && ls -1 molecule/presets/*.yml 2>/dev/null | wc -l
|
||||
echo "=== Disk Usage ===" && df -h . | tail -1
|
||||
```
|
||||
|
||||
## 🔧 Полезные команды
|
||||
|
||||
### Очистка
|
||||
|
||||
```bash
|
||||
# Очистка контейнеров Molecule
|
||||
make clean-containers
|
||||
|
||||
# Очистка Docker образов DevOpsLab
|
||||
make docker clean
|
||||
|
||||
# Очистка всего Docker
|
||||
make docker purge
|
||||
|
||||
# Очистка buildx
|
||||
make docker clean-builder
|
||||
```
|
||||
|
||||
### Проверка
|
||||
|
||||
```bash
|
||||
# Проверка наличия образов
|
||||
make custom-images check
|
||||
|
||||
# Проверка builder'а
|
||||
make docker check-builder
|
||||
|
||||
# Информация об образах
|
||||
make docker info
|
||||
```
|
||||
|
||||
### Тестирование
|
||||
|
||||
```bash
|
||||
# Быстрый тест
|
||||
make role test minimal
|
||||
|
||||
# Полный тест
|
||||
make role test all-images
|
||||
|
||||
# Тест с конкретным preset'ом
|
||||
make role test docker-full
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Автор:** Сергей Антропов
|
||||
**Сайт:** https://devops.org.ru
|
||||
@@ -1,148 +0,0 @@
|
||||
# Поддержка платформ в пресетах
|
||||
|
||||
**Автор:** Сергей Антропов
|
||||
**Сайт:** https://devops.org.ru
|
||||
**Версия:** 3.0.0
|
||||
|
||||
## Описание
|
||||
|
||||
DevOpsLab поддерживает указание конкретных платформ для хостов в пресетах. Это позволяет автоматически фильтровать хосты, которые не поддерживаются на текущей архитектуре системы.
|
||||
|
||||
## Обязательные требования
|
||||
|
||||
**Для 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
|
||||
```
|
||||
|
||||
## Дополнительная информация
|
||||
|
||||
- Все образы загружаются с принудительным указанием платформы
|
||||
- Система автоматически адаптирует количество контейнеров под текущую платформу
|
||||
- Информация о количестве хостов отображается при запуске
|
||||
|
||||
@@ -1,183 +0,0 @@
|
||||
# Пресеты по операционным системам
|
||||
|
||||
Этот документ описывает специализированные пресеты для тестирования на конкретных версиях операционных систем.
|
||||
|
||||
## 🐧 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
|
||||
|
||||
Это позволяет запускать несколько пресетов одновременно без конфликтов портов.
|
||||
196
docs/presets.md
Normal file
196
docs/presets.md
Normal file
@@ -0,0 +1,196 @@
|
||||
# Пресеты универсальной лаборатории
|
||||
|
||||
## Автор
|
||||
Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
|
||||
## Описание
|
||||
|
||||
Этот каталог содержит готовые пресеты для различных сценариев тестирования Ansible ролей. Каждый пресет оптимизирован для определенного типа инфраструктуры и количества машин.
|
||||
|
||||
## Доступные пресеты
|
||||
|
||||
### 🏗️ Классические пресеты (systemd контейнеры)
|
||||
|
||||
#### 1. Минимальная лаборатория (1-3 машины)
|
||||
**Файл:** `minimal.yml`
|
||||
**Описание:** Базовая конфигурация для простых тестов Ansible ролей
|
||||
**Компоненты:** 1 контроллер, 1 веб-сервер, 1 база данных
|
||||
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/minimal.yml`
|
||||
|
||||
### 2. Веб-приложение (3-5 машин)
|
||||
**Файл:** `webapp.yml`
|
||||
**Описание:** Классическая архитектура веб-приложения
|
||||
**Компоненты:** 2 веб-сервера, 1 БД, 1 кэш, 1 балансировщик
|
||||
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/webapp.yml`
|
||||
|
||||
### 3. Микросервисы (5-8 машин)
|
||||
**Файл:** `microservices.yml`
|
||||
**Описание:** Архитектура микросервисов с разделением ответственности
|
||||
**Компоненты:** API Gateway, микросервисы, БД, кэш, очередь, мониторинг
|
||||
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/microservices.yml`
|
||||
|
||||
### 4. Высокая доступность (6-10 машин)
|
||||
**Файл:** `ha.yml`
|
||||
**Описание:** Кластер высокой доступности с репликацией
|
||||
**Компоненты:** 2 веб-сервера, 2 БД, 2 кэша, балансировщик, мониторинг
|
||||
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/ha.yml`
|
||||
|
||||
### 5. Kubernetes кластер (8-12 машин)
|
||||
**Файл:** `k8s-cluster.yml`
|
||||
**Описание:** Полноценный Kubernetes кластер с различными ролями
|
||||
**Компоненты:** 3 master, 3 worker, 3 etcd, ingress, мониторинг
|
||||
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/k8s-cluster.yml`
|
||||
|
||||
### 6. CI/CD пайплайн (10-15 машин)
|
||||
**Файл:** `cicd.yml`
|
||||
**Описание:** Полноценный CI/CD пайплайн с различными инструментами
|
||||
**Компоненты:** Git, Jenkins, Nexus, Docker Registry, среды, мониторинг, ELK
|
||||
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/cicd.yml`
|
||||
|
||||
### 7. Big Data кластер (12-18 машин)
|
||||
**Файл:** `bigdata.yml`
|
||||
**Описание:** Кластер для обработки больших данных
|
||||
**Компоненты:** Hadoop, Spark, Kafka, Zookeeper, Elasticsearch, Kibana
|
||||
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/bigdata.yml`
|
||||
|
||||
### 8. Service Mesh (15-20 машин)
|
||||
**Файл:** `servicemesh.yml`
|
||||
**Описание:** Полноценный service mesh с Istio и множественными сервисами
|
||||
**Компоненты:** Istio, Frontend, Backend, БД, кэш, мониторинг, трассировка
|
||||
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/servicemesh.yml`
|
||||
|
||||
### 9. Enterprise (18-20 машин)
|
||||
**Файл:** `enterprise.yml`
|
||||
**Описание:** Полноценная enterprise инфраструктура с высокой доступностью
|
||||
**Компоненты:** LB, Web, API Gateway, App, БД, кэш, очереди, поиск, мониторинг, логи, backup
|
||||
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/enterprise.yml`
|
||||
|
||||
### 10. Максимальный (20 машин)
|
||||
**Файл:** `maximum.yml`
|
||||
**Описание:** Максимально сложная инфраструктура для экстремальных условий
|
||||
**Компоненты:** Все компоненты enterprise + трассировка + визуализация
|
||||
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/maximum.yml`
|
||||
|
||||
### ☸️ Kubernetes пресеты
|
||||
|
||||
#### 11. Kubernetes Single Node (1 кластер)
|
||||
**Файл:** `k8s-single.yml`
|
||||
**Описание:** Одиночный Kind кластер для простого тестирования K8s ролей
|
||||
**Компоненты:** 1 Kind кластер с 1 worker, базовые аддоны
|
||||
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/k8s-single.yml`
|
||||
|
||||
#### 12. Kubernetes Multi-Cluster (3 кластера)
|
||||
**Файл:** `k8s-multi.yml`
|
||||
**Описание:** Несколько Kind кластеров для тестирования мульти-кластерных сценариев
|
||||
**Компоненты:** 3 кластера (dev, staging, prod) с различными конфигурациями
|
||||
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/k8s-multi.yml`
|
||||
|
||||
#### 13. Kubernetes + Istio Full Stack (1 кластер с полным стеком)
|
||||
**Файл:** `k8s-istio-full.yml`
|
||||
**Описание:** Полноценный Kubernetes кластер с полным стеком Istio
|
||||
**Компоненты:** 1 Kind кластер с 3 workers, Istio, Kiali, Prometheus, Grafana, Jaeger
|
||||
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/k8s-istio-full.yml`
|
||||
|
||||
### 🐳 Docker-in-Docker (DinD) пресеты
|
||||
|
||||
#### 14. DinD Simple (3 DinD контейнера)
|
||||
**Файл:** `dind-simple.yml`
|
||||
**Описание:** Простая конфигурация DinD для тестирования Docker ролей
|
||||
**Компоненты:** 3 DinD контейнера с изолированными Docker средами
|
||||
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/dind-simple.yml`
|
||||
|
||||
#### 15. DinD Swarm (5 DinD контейнеров)
|
||||
**Файл:** `dind-swarm.yml`
|
||||
**Описание:** Docker Swarm кластер для тестирования оркестрации
|
||||
**Компоненты:** 1 Manager + 4 Worker узла в Docker Swarm режиме
|
||||
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/dind-swarm.yml`
|
||||
|
||||
#### 16. DinD Compose (4 DinD контейнера)
|
||||
**Файл:** `dind-compose.yml`
|
||||
**Описание:** DinD контейнеры для тестирования Docker Compose стека
|
||||
**Компоненты:** 4 DinD контейнера с различными стеками
|
||||
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/dind-compose.yml`
|
||||
|
||||
### 🔗 Docker-outside-of-Docker (DOoD) пресеты
|
||||
|
||||
#### 17. DOoD Simple (3 DOoD контейнера)
|
||||
**Файл:** `dood-simple.yml`
|
||||
**Описание:** Простая конфигурация DOoD для тестирования Docker ролей
|
||||
**Компоненты:** 3 DOoD контейнера с доступом к Docker daemon хоста
|
||||
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/dood-simple.yml`
|
||||
|
||||
#### 18. DOoD Mixed (5 DOoD + 2 systemd)
|
||||
**Файл:** `dood-mixed.yml`
|
||||
**Описание:** Смешанная конфигурация DOoD и systemd контейнеров
|
||||
**Компоненты:** 5 DOoD контейнеров для Docker операций + 2 systemd для системных ролей
|
||||
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/dood-mixed.yml`
|
||||
|
||||
### 🔀 Смешанные пресеты
|
||||
|
||||
#### 19. Mixed Kubernetes + DinD (1 K8s + 3 DinD)
|
||||
**Файл:** `mixed-k8s-dind.yml`
|
||||
**Описание:** Смешанная конфигурация Kubernetes и Docker-in-Docker
|
||||
**Компоненты:** 1 Kind кластер + 3 DinD контейнера
|
||||
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/mixed-k8s-dind.yml`
|
||||
|
||||
#### 20. Mixed Kubernetes + DOoD (1 K8s + 3 DOoD)
|
||||
**Файл:** `mixed-k8s-dood.yml`
|
||||
**Описание:** Смешанная конфигурация Kubernetes и Docker-outside-of-Docker
|
||||
**Компоненты:** 1 Kind кластер + 3 DOoD контейнера
|
||||
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/mixed-k8s-dood.yml`
|
||||
|
||||
#### 21. Mixed Full Stack (1 K8s + 2 DinD + 2 DOoD + 2 systemd)
|
||||
**Файл:** `mixed-full.yml`
|
||||
**Описание:** Полная смешанная конфигурация для комплексного тестирования
|
||||
**Компоненты:** 1 Kind кластер + 2 DinD + 2 DOoD + 2 systemd контейнера
|
||||
**Использование:** `make lab-test SCENARIO=universal LAB_SPEC=molecule/presets/mixed-full.yml`
|
||||
|
||||
## Использование
|
||||
|
||||
### Быстрый старт
|
||||
```bash
|
||||
# Выбрать пресет
|
||||
export LAB_SPEC=molecule/presets/minimal.yml
|
||||
|
||||
# Запустить тестирование
|
||||
make lab-test
|
||||
```
|
||||
|
||||
### Создание собственного пресета
|
||||
1. Скопировать существующий пресет: `cp minimal.yml my-preset.yml`
|
||||
2. Отредактировать под ваши нужды
|
||||
3. Использовать: `make lab-test LAB_SPEC=molecule/presets/my-preset.yml`
|
||||
|
||||
### Переменные окружения
|
||||
```bash
|
||||
# Установить пресет по умолчанию
|
||||
export LAB_SPEC=molecule/presets/webapp.yml
|
||||
|
||||
# Или использовать в команде
|
||||
make lab-test LAB_SPEC=molecule/presets/ha.yml
|
||||
```
|
||||
|
||||
## Рекомендации
|
||||
|
||||
- **Для начинающих:** используйте `minimal.yml` или `webapp.yml`
|
||||
- **Для микросервисов:** `microservices.yml` или `servicemesh.yml`
|
||||
- **Для Kubernetes:** `k8s-cluster.yml`
|
||||
- **Для enterprise:** `enterprise.yml` или `maximum.yml`
|
||||
- **Для Big Data:** `bigdata.yml`
|
||||
|
||||
## Кастомизация
|
||||
|
||||
Каждый пресет можно настроить под ваши нужды:
|
||||
- Изменить количество машин
|
||||
- Добавить/убрать группы
|
||||
- Изменить семейства ОС (debian/rhel)
|
||||
- Настроить порты и переменные
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
Если пресет не работает:
|
||||
1. Проверьте доступность Docker образов
|
||||
2. Убедитесь в достаточности ресурсов
|
||||
3. Проверьте логи: `make lab-verify`
|
||||
4. Очистите лабораторию: `make lab-cleanup`
|
||||
372
docs/roles.md
Normal file
372
docs/roles.md
Normal file
@@ -0,0 +1,372 @@
|
||||
# Управление ролями Ansible
|
||||
|
||||
Полное руководство по созданию, управлению и использованию ролей в универсальной лаборатории.
|
||||
|
||||
## Создание роли
|
||||
|
||||
### Интерактивное создание
|
||||
|
||||
```bash
|
||||
make role create NAME=my-role
|
||||
```
|
||||
|
||||
**Что происходит:**
|
||||
1. **Запрашивается описание роли** - краткое описание функциональности
|
||||
2. **Настраивается основной пакет** - имя пакета для установки
|
||||
3. **Настраивается сервис** - имя сервиса для управления
|
||||
4. **Выбираются платформы** - поддерживаемые ОС (ubuntu, centos, rhel)
|
||||
5. **Указываются теги** - теги для Ansible Galaxy
|
||||
6. **Создается универсальная структура роли** с поддержкой RHEL и Debian семейств
|
||||
7. **Создается папка `playbooks/`** для playbooks роли
|
||||
|
||||
### Структура созданной роли
|
||||
|
||||
```
|
||||
roles/my-role/
|
||||
├── tasks/
|
||||
│ ├── main.yml # Основные задачи (универсальные)
|
||||
│ ├── debian.yml # Задачи для Debian/Ubuntu
|
||||
│ └── redhat.yml # Задачи для RHEL/CentOS
|
||||
├── handlers/
|
||||
│ └── main.yml # Обработчики
|
||||
├── templates/ # Шаблоны Jinja2
|
||||
├── files/ # Статические файлы
|
||||
├── vars/
|
||||
│ └── main.yml # Переменные роли
|
||||
├── defaults/
|
||||
│ └── main.yml # Переменные по умолчанию
|
||||
├── meta/
|
||||
│ └── main.yml # Метаданные роли
|
||||
├── tests/ # Тесты роли
|
||||
└── playbooks/ # Playbooks роли
|
||||
└── (создаются через make role playbook)
|
||||
```
|
||||
|
||||
## Универсальные роли
|
||||
|
||||
### Принцип работы
|
||||
|
||||
Роли создаются **универсальными** для RHEL и Debian семейств:
|
||||
|
||||
1. **`tasks/main.yml`** - содержит общую логику и включает OS-специфичные задачи
|
||||
2. **`tasks/debian.yml`** - задачи для Debian/Ubuntu (apt, systemd)
|
||||
3. **`tasks/redhat.yml`** - задачи для RHEL/CentOS (yum, systemd)
|
||||
|
||||
### Автоматическое определение ОС
|
||||
|
||||
```yaml
|
||||
# tasks/main.yml
|
||||
- name: Include OS-specific tasks
|
||||
include_tasks: "{{ ansible_os_family | lower }}.yml"
|
||||
```
|
||||
|
||||
**Поддерживаемые ОС:**
|
||||
- **Debian семейство**: Ubuntu, Debian, Linux Mint
|
||||
- **RHEL семейство**: CentOS, RHEL, Rocky Linux, AlmaLinux
|
||||
|
||||
### Примеры задач
|
||||
|
||||
#### Debian/Ubuntu (tasks/debian.yml)
|
||||
```yaml
|
||||
---
|
||||
# Задачи для Debian/Ubuntu семейства
|
||||
|
||||
- name: Update apt cache (Debian)
|
||||
apt:
|
||||
update_cache: true
|
||||
cache_valid_time: 3600
|
||||
when: ansible_os_family == 'Debian'
|
||||
|
||||
- name: Install nginx package (Debian)
|
||||
apt:
|
||||
name: "{{ nginx_package | default('nginx') }}"
|
||||
state: present
|
||||
when: ansible_os_family == 'Debian'
|
||||
```
|
||||
|
||||
#### RHEL/CentOS (tasks/redhat.yml)
|
||||
```yaml
|
||||
---
|
||||
# Задачи для RHEL/CentOS семейства
|
||||
|
||||
- name: Update yum cache (RHEL)
|
||||
yum:
|
||||
update_cache: true
|
||||
when: ansible_os_family == 'RedHat'
|
||||
|
||||
- name: Install nginx package (RHEL)
|
||||
yum:
|
||||
name: "{{ nginx_package | default('nginx') }}"
|
||||
state: present
|
||||
when: ansible_os_family == 'RedHat'
|
||||
```
|
||||
|
||||
## Управление playbooks роли
|
||||
|
||||
### Создание playbook
|
||||
|
||||
```bash
|
||||
make role playbook NAME=my-role
|
||||
# Выберите: create
|
||||
# Введите имя: deploy
|
||||
```
|
||||
|
||||
**Создается файл:** `roles/my-role/playbooks/deploy.yml`
|
||||
|
||||
```yaml
|
||||
---
|
||||
# Playbook: deploy для роли my-role
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
|
||||
- name: deploy
|
||||
hosts: all
|
||||
become: true
|
||||
gather_facts: true
|
||||
vars:
|
||||
# Переменные для роли my-role
|
||||
my_role_enabled: true
|
||||
|
||||
pre_tasks:
|
||||
- name: Display OS information
|
||||
debug:
|
||||
msg: "OS Family: {{ ansible_os_family }}, OS: {{ ansible_distribution }} {{ ansible_distribution_version }}"
|
||||
|
||||
roles:
|
||||
- role: my-role
|
||||
|
||||
post_tasks:
|
||||
- name: Verify my-role installation
|
||||
debug:
|
||||
msg: "my-role successfully deployed on {{ inventory_hostname }}"
|
||||
```
|
||||
|
||||
### Универсальные playbooks
|
||||
|
||||
Playbooks создаются **универсальными** с поддержкой:
|
||||
|
||||
1. **`gather_facts: true`** - сбор информации об ОС
|
||||
2. **`pre_tasks`** - отображение информации об ОС
|
||||
3. **`post_tasks`** - проверка успешного развертывания
|
||||
4. **Переменные роли** - автоматически добавляются в `vars`
|
||||
|
||||
### Список playbooks
|
||||
|
||||
```bash
|
||||
make role playbook NAME=my-role
|
||||
# Выберите: list
|
||||
```
|
||||
|
||||
### Редактирование playbook
|
||||
|
||||
```bash
|
||||
make role playbook NAME=my-role
|
||||
# Выберите: edit
|
||||
# Введите имя: deploy
|
||||
```
|
||||
|
||||
### Запуск playbook
|
||||
|
||||
```bash
|
||||
make role playbook NAME=my-role
|
||||
# Выберите: run
|
||||
# Введите имя: deploy
|
||||
```
|
||||
|
||||
## Команды управления ролями
|
||||
|
||||
### Основные команды
|
||||
|
||||
```bash
|
||||
# Список ролей
|
||||
make role list
|
||||
|
||||
# Создать роль (интерактивно)
|
||||
make role create NAME=my-role
|
||||
|
||||
# Редактировать роль
|
||||
make role edit NAME=my-role
|
||||
|
||||
# Тестировать роль
|
||||
make role test NAME=my-role
|
||||
|
||||
# Проверить синтаксис
|
||||
make role lint
|
||||
|
||||
# Развернуть роли
|
||||
make role deploy
|
||||
|
||||
# Информация о роли
|
||||
make role info NAME=my-role
|
||||
|
||||
# Управление playbooks
|
||||
make role playbook NAME=my-role
|
||||
```
|
||||
|
||||
### Интерактивные возможности
|
||||
|
||||
#### При создании роли:
|
||||
- **Описание роли** - автоматически добавляется в README.md
|
||||
- **Основной пакет** - настраивается в defaults/main.yml
|
||||
- **Сервис** - настраивается в defaults/main.yml
|
||||
- **Платформы** - добавляются в meta/main.yml
|
||||
- **Теги** - добавляются в meta/main.yml
|
||||
|
||||
#### При работе с playbooks:
|
||||
- **Создание** - интерактивный ввод имени
|
||||
- **Редактирование** - выбор из списка существующих
|
||||
- **Запуск** - выбор playbook для выполнения
|
||||
|
||||
## Примеры использования
|
||||
|
||||
### Создание роли nginx
|
||||
|
||||
```bash
|
||||
make role create NAME=nginx
|
||||
# Описание: Nginx web server role
|
||||
# Пакет: nginx
|
||||
# Сервис: nginx
|
||||
# Платформы: ubuntu,centos
|
||||
# Теги: web,nginx,server
|
||||
```
|
||||
|
||||
### Создание playbook для nginx
|
||||
|
||||
```bash
|
||||
make role playbook NAME=nginx
|
||||
# Выберите: create
|
||||
# Имя: install
|
||||
```
|
||||
|
||||
**Результат:** `roles/nginx/playbooks/install.yml`
|
||||
|
||||
### Запуск playbook
|
||||
|
||||
```bash
|
||||
make role playbook NAME=nginx
|
||||
# Выберите: run
|
||||
# Имя: install
|
||||
```
|
||||
|
||||
## Структура файлов роли
|
||||
|
||||
### tasks/main.yml
|
||||
|
||||
```yaml
|
||||
---
|
||||
# Основные задачи роли nginx
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
|
||||
- name: nginx placeholder
|
||||
debug:
|
||||
msg: "Роль nginx готова для настройки"
|
||||
|
||||
- name: Install nginx package
|
||||
package:
|
||||
name: "{{ nginx_package | default('nginx') }}"
|
||||
state: present
|
||||
|
||||
- name: Start nginx service
|
||||
systemd:
|
||||
name: "{{ nginx_service | default('nginx') }}"
|
||||
state: started
|
||||
enabled: true
|
||||
when: nginx_service is defined
|
||||
```
|
||||
|
||||
### defaults/main.yml
|
||||
|
||||
```yaml
|
||||
---
|
||||
# Переменные по умолчанию для роли nginx
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
|
||||
nginx_enabled: true
|
||||
nginx_package: nginx
|
||||
nginx_service: nginx
|
||||
```
|
||||
|
||||
### meta/main.yml
|
||||
|
||||
```yaml
|
||||
---
|
||||
galaxy_info:
|
||||
author: Сергей Антропов
|
||||
description: Nginx web server role
|
||||
company: https://devops.org.ru
|
||||
license: MIT
|
||||
min_ansible_version: 2.9
|
||||
platforms:
|
||||
- name: Ubuntu
|
||||
versions: [focal, jammy]
|
||||
- name: CentOS
|
||||
versions: [7, 8, 9]
|
||||
- name: RHEL
|
||||
versions: [7, 8, 9]
|
||||
galaxy_tags: [web,nginx,server]
|
||||
dependencies: []
|
||||
```
|
||||
|
||||
## Лучшие практики
|
||||
|
||||
### 1. Универсальные роли
|
||||
- **Всегда создавайте OS-специфичные задачи** в `debian.yml` и `redhat.yml`
|
||||
- **Используйте `ansible_os_family`** для определения ОС
|
||||
- **Тестируйте на разных платформах** (Ubuntu, CentOS, RHEL)
|
||||
- **Используйте универсальные модули** когда возможно (package, systemd)
|
||||
|
||||
### 2. Структура роли
|
||||
- **`tasks/main.yml`** - общая логика и включение OS-специфичных задач
|
||||
- **`tasks/debian.yml`** - задачи для Debian/Ubuntu (apt, systemd)
|
||||
- **`tasks/redhat.yml`** - задачи для RHEL/CentOS (yum, systemd)
|
||||
- **`handlers`** - для перезапуска сервисов
|
||||
- **`templates`** - для конфигурационных файлов
|
||||
- **`files`** - для статических файлов
|
||||
|
||||
### 3. Переменные
|
||||
- **`defaults/main.yml`** - значения по умолчанию
|
||||
- **`vars/main.yml`** - внутренние переменные роли
|
||||
- **Используйте префиксы** для переменных роли
|
||||
- **Создавайте OS-специфичные переменные** при необходимости
|
||||
|
||||
### 4. Playbooks
|
||||
- **`gather_facts: true`** - всегда собирайте информацию об ОС
|
||||
- **`pre_tasks`** - отображайте информацию об ОС
|
||||
- **`post_tasks`** - проверяйте успешное развертывание
|
||||
- **Используйте переменные** для настройки
|
||||
|
||||
### 5. Тестирование
|
||||
- **`make role test`** - проверка роли
|
||||
- **Тестируйте на разных ОС** - Ubuntu, CentOS, RHEL
|
||||
- **Создавайте тесты** в папке tests/
|
||||
- **Проверяйте идемпотентность** - повторный запуск не должен изменять систему
|
||||
|
||||
## Интеграция с лабораторией
|
||||
|
||||
### Автоматическое добавление в систему
|
||||
|
||||
При создании роли через `make role create`:
|
||||
1. Роль автоматически добавляется в `deploy/tasks/main.yml`
|
||||
2. Создается переменная `{role_name}_enabled: true`
|
||||
3. Обновляется `site.yml` с новой ролью
|
||||
|
||||
### Использование в playbooks
|
||||
|
||||
```yaml
|
||||
---
|
||||
- name: Deploy my-role
|
||||
hosts: all
|
||||
become: true
|
||||
roles:
|
||||
- role: my-role
|
||||
vars:
|
||||
my_role_enabled: true
|
||||
my_role_package: custom-package
|
||||
```
|
||||
|
||||
## Автор
|
||||
|
||||
Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
@@ -1,248 +0,0 @@
|
||||
# Руководство по файлу 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` - команды для запуска тестов
|
||||
@@ -1,99 +0,0 @@
|
||||
# Тестирование 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** для ваших реальных серверов
|
||||
652
docs/troubleshooting.md
Normal file
652
docs/troubleshooting.md
Normal file
@@ -0,0 +1,652 @@
|
||||
# Troubleshooting
|
||||
|
||||
## Автор
|
||||
Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
|
||||
## Описание
|
||||
|
||||
Этот документ содержит решения наиболее распространенных проблем при работе с универсальной лабораторией.
|
||||
|
||||
## Содержание
|
||||
|
||||
- [Общие проблемы](#общие-проблемы)
|
||||
- [Проблемы с Docker](#проблемы-с-docker)
|
||||
- [Проблемы с Kubernetes](#проблемы-с-kubernetes)
|
||||
- [Проблемы с портами](#проблемы-с-портами)
|
||||
- [Проблемы с ресурсами](#проблемы-с-ресурсами)
|
||||
- [Проблемы с сетью](#проблемы-с-сетью)
|
||||
- [Проблемы с Ansible](#проблемы-с-ansible)
|
||||
- [Проблемы с Molecule](#проблемы-с-molecule)
|
||||
- [Проблемы с пресетами](#проблемы-с-пресетами)
|
||||
- [Проблемы с отчетами](#проблемы-с-отчетами)
|
||||
|
||||
## Общие проблемы
|
||||
|
||||
### Проблема: Лаборатория не запускается
|
||||
|
||||
**Симптомы:**
|
||||
- Команда `make lab-up` завершается с ошибкой
|
||||
- Контейнеры не создаются
|
||||
- Ошибки в логах Docker
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверить статус Docker
|
||||
docker ps
|
||||
docker version
|
||||
|
||||
# Перезапустить Docker
|
||||
sudo systemctl restart docker
|
||||
|
||||
# Очистить Docker
|
||||
docker system prune -a
|
||||
|
||||
# Перезапустить лабораторию
|
||||
make lab-reset
|
||||
```
|
||||
|
||||
### Проблема: Команды Make не работают
|
||||
|
||||
**Симптомы:**
|
||||
- `make: command not found`
|
||||
- Ошибки в Makefile
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Установить Make
|
||||
# Ubuntu/Debian
|
||||
sudo apt-get install make
|
||||
|
||||
# CentOS/RHEL
|
||||
sudo yum install make
|
||||
|
||||
# macOS
|
||||
brew install make
|
||||
|
||||
# Проверить версию
|
||||
make --version
|
||||
```
|
||||
|
||||
### Проблема: Недостаточно прав
|
||||
|
||||
**Симптомы:**
|
||||
- `Permission denied`
|
||||
- Ошибки доступа к файлам
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверить права на файлы
|
||||
ls -la
|
||||
|
||||
# Установить права
|
||||
chmod +x scripts/*.sh
|
||||
chmod 644 *.yml
|
||||
|
||||
# Добавить пользователя в группу docker
|
||||
sudo usermod -aG docker $USER
|
||||
newgrp docker
|
||||
```
|
||||
|
||||
## Проблемы с Docker
|
||||
|
||||
### Проблема: Docker daemon не запущен
|
||||
|
||||
**Симптомы:**
|
||||
- `Cannot connect to the Docker daemon`
|
||||
- `docker: command not found`
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Запустить Docker daemon
|
||||
sudo systemctl start docker
|
||||
sudo systemctl enable docker
|
||||
|
||||
# Проверить статус
|
||||
sudo systemctl status docker
|
||||
|
||||
# Проверить доступ
|
||||
docker ps
|
||||
```
|
||||
|
||||
### Проблема: Недостаточно места на диске
|
||||
|
||||
**Симптомы:**
|
||||
- `No space left on device`
|
||||
- Ошибки создания контейнеров
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверить использование диска
|
||||
df -h
|
||||
|
||||
# Очистить Docker
|
||||
docker system prune -a
|
||||
docker volume prune
|
||||
docker network prune
|
||||
|
||||
# Удалить неиспользуемые образы
|
||||
docker image prune -a
|
||||
```
|
||||
|
||||
### Проблема: Конфликты портов
|
||||
|
||||
**Симптомы:**
|
||||
- `Port is already in use`
|
||||
- Ошибки привязки портов
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Найти процесс, использующий порт
|
||||
sudo netstat -tulpn | grep :8080
|
||||
sudo lsof -i :8080
|
||||
|
||||
# Убить процесс
|
||||
sudo kill -9 <PID>
|
||||
|
||||
# Или изменить порт в пресете
|
||||
publish:
|
||||
- "8081:80" # Вместо 8080:80
|
||||
```
|
||||
|
||||
### Проблема: DinD контейнеры не работают
|
||||
|
||||
**Симптомы:**
|
||||
- DinD контейнеры не запускаются
|
||||
- Ошибки Docker-in-Docker
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверить privileged режим
|
||||
docker run --privileged -d docker:dind
|
||||
|
||||
# Проверить доступ к Docker socket
|
||||
docker run -v /var/run/docker.sock:/var/run/docker.sock docker:latest ps
|
||||
|
||||
# Перезапустить с правильными параметрами
|
||||
make lab-reset
|
||||
make lab-create
|
||||
```
|
||||
|
||||
## Проблемы с Kubernetes
|
||||
|
||||
### Проблема: Kind кластер не создается
|
||||
|
||||
**Симптомы:**
|
||||
- `kind create cluster` завершается с ошибкой
|
||||
- Кластер не доступен
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверить Kind
|
||||
kind version
|
||||
|
||||
# Удалить существующие кластеры
|
||||
kind delete cluster --name lab
|
||||
|
||||
# Очистить Docker
|
||||
docker system prune -a
|
||||
|
||||
# Пересоздать кластер
|
||||
make lab-create
|
||||
```
|
||||
|
||||
### Проблема: kubectl не работает
|
||||
|
||||
**Симптомы:**
|
||||
- `kubectl: command not found`
|
||||
- Ошибки подключения к кластеру
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Установить kubectl
|
||||
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
|
||||
chmod +x kubectl
|
||||
sudo mv kubectl /usr/local/bin/
|
||||
|
||||
# Проверить конфигурацию
|
||||
kubectl config get-contexts
|
||||
|
||||
# Переключиться на правильный контекст
|
||||
kubectl config use-context kind-lab
|
||||
```
|
||||
|
||||
### Проблема: Pods не запускаются
|
||||
|
||||
**Симптомы:**
|
||||
- Pods в состоянии Pending
|
||||
- Ошибки в логах pods
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверить статус pods
|
||||
kubectl get pods -A
|
||||
kubectl describe pod <pod-name>
|
||||
|
||||
# Проверить события
|
||||
kubectl get events --sort-by=.metadata.creationTimestamp
|
||||
|
||||
# Проверить ресурсы
|
||||
kubectl top nodes
|
||||
kubectl top pods
|
||||
```
|
||||
|
||||
### Проблема: Istio не устанавливается
|
||||
|
||||
**Симптомы:**
|
||||
- Istio компоненты не запускаются
|
||||
- Ошибки в Istio логах
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверить Istio
|
||||
istioctl version
|
||||
|
||||
# Переустановить Istio
|
||||
istioctl uninstall --purge
|
||||
istioctl install --set profile=demo
|
||||
|
||||
# Проверить статус
|
||||
kubectl get pods -n istio-system
|
||||
```
|
||||
|
||||
## Проблемы с портами
|
||||
|
||||
### Проблема: Порт уже используется
|
||||
|
||||
**Симптомы:**
|
||||
- `bind: address already in use`
|
||||
- Ошибки привязки портов
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Найти процесс
|
||||
sudo lsof -i :8080
|
||||
|
||||
# Убить процесс
|
||||
sudo kill -9 <PID>
|
||||
|
||||
# Или изменить порт в пресете
|
||||
publish:
|
||||
- "8081:80"
|
||||
```
|
||||
|
||||
### Проблема: Port-forward не работает
|
||||
|
||||
**Симптомы:**
|
||||
- Port-forward не устанавливается
|
||||
- Ошибки подключения
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Остановить все port-forward
|
||||
make kube-pf-stop
|
||||
|
||||
# Проверить доступность сервиса
|
||||
kubectl get svc -n istio-system
|
||||
|
||||
# Перезапустить port-forward
|
||||
make kiali-port-forward CLUSTER=lab
|
||||
```
|
||||
|
||||
## Проблемы с ресурсами
|
||||
|
||||
### Проблема: Недостаточно памяти
|
||||
|
||||
**Симптомы:**
|
||||
- `Out of memory`
|
||||
- Контейнеры завершаются
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверить память
|
||||
free -h
|
||||
docker stats
|
||||
|
||||
# Ограничить ресурсы
|
||||
docker run --memory=512m your-image
|
||||
|
||||
# Или уменьшить количество контейнеров в пресете
|
||||
```
|
||||
|
||||
### Проблема: Недостаточно CPU
|
||||
|
||||
**Симптомы:**
|
||||
- Медленная работа
|
||||
- Высокая нагрузка на CPU
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверить CPU
|
||||
top
|
||||
htop
|
||||
|
||||
# Ограничить CPU
|
||||
docker run --cpus=1.0 your-image
|
||||
|
||||
# Или использовать более легкие образы
|
||||
```
|
||||
|
||||
### Проблема: Недостаточно места на диске
|
||||
|
||||
**Симптомы:**
|
||||
- `No space left on device`
|
||||
- Ошибки записи
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверить место
|
||||
df -h
|
||||
|
||||
# Очистить Docker
|
||||
docker system prune -a
|
||||
docker volume prune
|
||||
|
||||
# Удалить неиспользуемые образы
|
||||
docker image prune -a
|
||||
```
|
||||
|
||||
## Проблемы с сетью
|
||||
|
||||
### Проблема: Контейнеры не могут связаться
|
||||
|
||||
**Симптомы:**
|
||||
- Ping не работает между контейнерами
|
||||
- Ошибки сети
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверить сеть
|
||||
docker network ls
|
||||
docker network inspect labnet
|
||||
|
||||
# Пересоздать сеть
|
||||
docker network rm labnet
|
||||
docker network create labnet
|
||||
|
||||
# Перезапустить лабораторию
|
||||
make lab-reset
|
||||
```
|
||||
|
||||
### Проблема: DNS не работает
|
||||
|
||||
**Симптомы:**
|
||||
- Не удается разрешить имена
|
||||
- Ошибки DNS
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверить DNS
|
||||
nslookup google.com
|
||||
|
||||
# Перезапустить Docker
|
||||
sudo systemctl restart docker
|
||||
|
||||
# Проверить resolv.conf
|
||||
cat /etc/resolv.conf
|
||||
```
|
||||
|
||||
## Проблемы с Ansible
|
||||
|
||||
### Проблема: Ansible не найден
|
||||
|
||||
**Симптомы:**
|
||||
- `ansible: command not found`
|
||||
- Ошибки выполнения playbook
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Установить Ansible
|
||||
pip install ansible
|
||||
|
||||
# Или через пакетный менеджер
|
||||
sudo apt-get install ansible
|
||||
|
||||
# Проверить версию
|
||||
ansible --version
|
||||
```
|
||||
|
||||
### Проблема: Ошибки в playbook
|
||||
|
||||
**Симптомы:**
|
||||
- Синтаксические ошибки
|
||||
- Ошибки выполнения задач
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверить синтаксис
|
||||
ansible-playbook --syntax-check playbook.yml
|
||||
|
||||
# Запустить в режиме отладки
|
||||
ansible-playbook -vvv playbook.yml
|
||||
|
||||
# Проверить инвентарь
|
||||
ansible-inventory --list
|
||||
```
|
||||
|
||||
### Проблема: Ошибки подключения
|
||||
|
||||
**Симптомы:**
|
||||
- `Connection refused`
|
||||
- Ошибки SSH
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверить подключение
|
||||
ansible all -m ping
|
||||
|
||||
# Проверить SSH ключи
|
||||
ssh-keygen -t rsa -b 4096
|
||||
ssh-copy-id user@host
|
||||
|
||||
# Или использовать пароль
|
||||
ansible all -m ping -k
|
||||
```
|
||||
|
||||
## Проблемы с Molecule
|
||||
|
||||
### Проблема: Molecule не найден
|
||||
|
||||
**Симптомы:**
|
||||
- `molecule: command not found`
|
||||
- Ошибки выполнения molecule
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Установить Molecule
|
||||
pip install molecule
|
||||
|
||||
# Или через пакетный менеджер
|
||||
sudo apt-get install molecule
|
||||
|
||||
# Проверить версию
|
||||
molecule --version
|
||||
```
|
||||
|
||||
### Проблема: Ошибки в molecule.yml
|
||||
|
||||
**Симптомы:**
|
||||
- Синтаксические ошибки в конфигурации
|
||||
- Ошибки валидации
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверить синтаксис
|
||||
molecule syntax
|
||||
|
||||
# Проверить конфигурацию
|
||||
molecule lint
|
||||
|
||||
# Исправить ошибки
|
||||
molecule validate
|
||||
```
|
||||
|
||||
### Проблема: Ошибки драйвера
|
||||
|
||||
**Симптомы:**
|
||||
- Ошибки Docker драйвера
|
||||
- Проблемы с контейнерами
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверить драйвер
|
||||
molecule driver list
|
||||
|
||||
# Установить Docker драйвер
|
||||
pip install molecule-docker
|
||||
|
||||
# Перезапустить Molecule
|
||||
molecule destroy
|
||||
molecule create
|
||||
```
|
||||
|
||||
## Проблемы с пресетами
|
||||
|
||||
### Проблема: Пресет не найден
|
||||
|
||||
**Симптомы:**
|
||||
- `File not found`
|
||||
- Ошибки загрузки пресета
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверить путь
|
||||
ls -la molecule/presets/
|
||||
|
||||
# Проверить синтаксис YAML
|
||||
yamllint molecule/presets/your-preset.yml
|
||||
|
||||
# Исправить ошибки
|
||||
molecule validate
|
||||
```
|
||||
|
||||
### Проблема: Ошибки в пресете
|
||||
|
||||
**Симптомы:**
|
||||
- Синтаксические ошибки
|
||||
- Ошибки валидации
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверить синтаксис
|
||||
yamllint molecule/presets/your-preset.yml
|
||||
|
||||
# Проверить структуру
|
||||
molecule validate
|
||||
|
||||
# Исправить ошибки
|
||||
molecule syntax
|
||||
```
|
||||
|
||||
## Проблемы с отчетами
|
||||
|
||||
### Проблема: HTML отчет не генерируется
|
||||
|
||||
**Симптомы:**
|
||||
- `File not found`
|
||||
- Ошибки генерации отчета
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверить JSON файл
|
||||
ls -la reports/
|
||||
cat reports/lab-health.json
|
||||
|
||||
# Перезапустить верификацию
|
||||
make lab-verify
|
||||
|
||||
# Сгенерировать отчет
|
||||
make lab-report
|
||||
```
|
||||
|
||||
### Проблема: Отчет пустой
|
||||
|
||||
**Симптомы:**
|
||||
- Отчет не содержит данных
|
||||
- Ошибки в JSON
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверить JSON
|
||||
jq . reports/lab-health.json
|
||||
|
||||
# Перезапустить тест
|
||||
make lab-test
|
||||
|
||||
# Проверить логи
|
||||
make lab-verify
|
||||
```
|
||||
|
||||
## Полезные команды для диагностики
|
||||
|
||||
### Общие команды
|
||||
|
||||
```bash
|
||||
# Проверить статус системы
|
||||
docker ps
|
||||
docker images
|
||||
docker network ls
|
||||
docker volume ls
|
||||
|
||||
# Проверить ресурсы
|
||||
free -h
|
||||
df -h
|
||||
top
|
||||
|
||||
# Проверить сеть
|
||||
netstat -tulpn
|
||||
ss -tulpn
|
||||
```
|
||||
|
||||
### Команды для Kubernetes
|
||||
|
||||
```bash
|
||||
# Проверить кластеры
|
||||
kind get clusters
|
||||
kubectl config get-contexts
|
||||
|
||||
# Проверить ресурсы
|
||||
kubectl get nodes
|
||||
kubectl get pods -A
|
||||
kubectl get svc -A
|
||||
|
||||
# Проверить события
|
||||
kubectl get events --sort-by=.metadata.creationTimestamp
|
||||
```
|
||||
|
||||
### Команды для Ansible
|
||||
|
||||
```bash
|
||||
# Проверить инвентарь
|
||||
ansible-inventory --list
|
||||
ansible all -m ping
|
||||
|
||||
# Проверить playbook
|
||||
ansible-playbook --syntax-check playbook.yml
|
||||
ansible-playbook --check playbook.yml
|
||||
```
|
||||
|
||||
## Получение помощи
|
||||
|
||||
Если проблема не решается:
|
||||
|
||||
1. **Проверьте логи:**
|
||||
```bash
|
||||
docker logs <container-name>
|
||||
kubectl logs <pod-name>
|
||||
```
|
||||
|
||||
2. **Создайте issue:**
|
||||
- Опишите проблему
|
||||
- Приложите логи
|
||||
- Укажите версии компонентов
|
||||
|
||||
3. **Обратитесь к сообществу:**
|
||||
- GitHub Discussions
|
||||
- Discord/Slack каналы
|
||||
- Форумы Ansible
|
||||
|
||||
4. **Проверьте документацию:**
|
||||
- [Основная документация](universal-lab.md)
|
||||
- [Примеры использования](examples.md)
|
||||
- [API Reference](api.md)
|
||||
295
docs/universal-lab.md
Normal file
295
docs/universal-lab.md
Normal file
@@ -0,0 +1,295 @@
|
||||
# Универсальная лаборатория для тестирования Ansible ролей
|
||||
|
||||
## Автор
|
||||
Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
|
||||
## Описание
|
||||
|
||||
Это универсальная лаборатория для тестирования Ansible ролей, созданная на основе предложений ChatGPT. Лаборатория поддерживает:
|
||||
|
||||
- **Docker-in-Docker (DinD)** - полная изоляция контейнеров
|
||||
- **Docker-outside-of-Docker (DOoD)** - использование хостового Docker
|
||||
- **Kind кластеры** - локальные Kubernetes кластеры
|
||||
- **Helm charts** - nginx, prometheus-stack
|
||||
- **Istio service mesh** - с Kiali для мониторинга
|
||||
- **Prometheus + Grafana** - с автопровижинингом дашбордов
|
||||
- **HTML отчеты** - красивые отчеты о результатах тестирования
|
||||
|
||||
## Структура проекта
|
||||
|
||||
```
|
||||
molecule/
|
||||
├── universal/ # Универсальная лаборатория
|
||||
│ ├── molecule.yml # Конфигурация Molecule
|
||||
│ ├── vars.yml # Переменные лаборатории
|
||||
│ ├── create.yml # Создание инфраструктуры
|
||||
│ ├── converge.yml # Запуск ролей
|
||||
│ ├── verify.yml # Проверка работы
|
||||
│ └── destroy.yml # Очистка
|
||||
├── presets/ # Пресеты для разных сценариев
|
||||
│ └── k8s-kind.yml # Пресет для Kubernetes
|
||||
└── default/ # Старый сценарий (для совместимости)
|
||||
|
||||
files/
|
||||
├── requirements.yml # Коллекции Ansible
|
||||
├── playbooks/
|
||||
│ └── site.yml # Основной playbook
|
||||
└── k8s/ # Kubernetes манифесты
|
||||
└── istio/ # Istio конфигурации
|
||||
|
||||
roles/ # Ваши Ansible роли
|
||||
```
|
||||
|
||||
## Использование
|
||||
|
||||
### 1. Подготовка
|
||||
|
||||
```bash
|
||||
# Создать файл с паролем для vault
|
||||
echo "test" > vault-password.txt
|
||||
|
||||
# Создать каталог для ролей
|
||||
mkdir -p roles
|
||||
|
||||
# Скопировать переменные окружения
|
||||
cp env.example .env
|
||||
# Отредактировать .env под ваши нужды
|
||||
```
|
||||
|
||||
### 2. Запуск лаборатории
|
||||
|
||||
```bash
|
||||
# Поднять контроллер
|
||||
make lab-up
|
||||
|
||||
# Создать инфраструктуру
|
||||
make lab-create
|
||||
|
||||
# Запустить роли
|
||||
make lab-converge
|
||||
|
||||
# Проверить работу
|
||||
make lab-verify
|
||||
|
||||
# Сгенерировать HTML отчет
|
||||
make lab-report
|
||||
|
||||
# Уничтожить лабораторию
|
||||
make lab-destroy
|
||||
```
|
||||
|
||||
### 3. Управление лабораторией
|
||||
|
||||
```bash
|
||||
# Полный цикл тестирования
|
||||
make lab-test
|
||||
|
||||
# Снапшоты и восстановление
|
||||
make lab-snapshot # Сохранить состояние
|
||||
make lab-restore # Восстановить из снапшота
|
||||
make lab-cleanup # Очистить все
|
||||
|
||||
# Сброс лаборатории
|
||||
make lab-reset
|
||||
```
|
||||
|
||||
### 4. Пресеты для разных сценариев
|
||||
|
||||
#### 🏗️ Классические пресеты (systemd контейнеры)
|
||||
```bash
|
||||
# Минимальная лаборатория (1-3 машины)
|
||||
make lab-test LAB_SPEC=molecule/presets/minimal.yml
|
||||
|
||||
# Веб-приложение (3-5 машин)
|
||||
make lab-test LAB_SPEC=molecule/presets/webapp.yml
|
||||
|
||||
# Микросервисы (5-8 машин)
|
||||
make lab-test LAB_SPEC=molecule/presets/microservices.yml
|
||||
|
||||
# Высокая доступность (6-10 машин)
|
||||
make lab-test LAB_SPEC=molecule/presets/ha.yml
|
||||
|
||||
# Kubernetes кластер (8-12 машин)
|
||||
make lab-test LAB_SPEC=molecule/presets/k8s-cluster.yml
|
||||
|
||||
# CI/CD пайплайн (10-15 машин)
|
||||
make lab-test LAB_SPEC=molecule/presets/cicd.yml
|
||||
|
||||
# Big Data кластер (12-18 машин)
|
||||
make lab-test LAB_SPEC=molecule/presets/bigdata.yml
|
||||
|
||||
# Service Mesh (15-20 машин)
|
||||
make lab-test LAB_SPEC=molecule/presets/servicemesh.yml
|
||||
|
||||
# Enterprise (18-20 машин)
|
||||
make lab-test LAB_SPEC=molecule/presets/enterprise.yml
|
||||
|
||||
# Максимальный (20 машин)
|
||||
make lab-test LAB_SPEC=molecule/presets/maximum.yml
|
||||
```
|
||||
|
||||
#### ☸️ Kubernetes пресеты
|
||||
```bash
|
||||
# Kubernetes Single Node (1 кластер)
|
||||
make lab-test LAB_SPEC=molecule/presets/k8s-single.yml
|
||||
|
||||
# Kubernetes Multi-Cluster (3 кластера)
|
||||
make lab-test LAB_SPEC=molecule/presets/k8s-multi.yml
|
||||
|
||||
# Kubernetes + Istio Full Stack (1 кластер с полным стеком)
|
||||
make lab-test LAB_SPEC=molecule/presets/k8s-istio-full.yml
|
||||
```
|
||||
|
||||
#### 🐳 Docker-in-Docker (DinD) пресеты
|
||||
```bash
|
||||
# DinD Simple (3 DinD контейнера)
|
||||
make lab-test LAB_SPEC=molecule/presets/dind-simple.yml
|
||||
|
||||
# DinD Swarm (5 DinD контейнеров)
|
||||
make lab-test LAB_SPEC=molecule/presets/dind-swarm.yml
|
||||
|
||||
# DinD Compose (4 DinD контейнера)
|
||||
make lab-test LAB_SPEC=molecule/presets/dind-compose.yml
|
||||
```
|
||||
|
||||
#### 🔗 Docker-outside-of-Docker (DOoD) пресеты
|
||||
```bash
|
||||
# DOoD Simple (3 DOoD контейнера)
|
||||
make lab-test LAB_SPEC=molecule/presets/dood-simple.yml
|
||||
|
||||
# DOoD Mixed (5 DOoD + 2 systemd)
|
||||
make lab-test LAB_SPEC=molecule/presets/dood-mixed.yml
|
||||
```
|
||||
|
||||
#### 🔀 Смешанные пресеты
|
||||
```bash
|
||||
# Mixed Kubernetes + DinD (1 K8s + 3 DinD)
|
||||
make lab-test LAB_SPEC=molecule/presets/mixed-k8s-dind.yml
|
||||
|
||||
# Mixed Kubernetes + DOoD (1 K8s + 3 DOoD)
|
||||
make lab-test LAB_SPEC=molecule/presets/mixed-k8s-dood.yml
|
||||
|
||||
# Mixed Full Stack (1 K8s + 2 DinD + 2 DOoD + 2 systemd)
|
||||
make lab-test LAB_SPEC=molecule/presets/mixed-full.yml
|
||||
```
|
||||
|
||||
### 3. Работа с Kubernetes
|
||||
|
||||
```bash
|
||||
# Войти в контейнер с kubectl
|
||||
make kube-sh
|
||||
|
||||
# Выполнить команду kubectl
|
||||
make kube-cmd CLUSTER=lab CMD="get pods -A"
|
||||
|
||||
# Войти в toolbox pod
|
||||
make kube-enter CLUSTER=lab
|
||||
|
||||
# Port-forward для Kiali
|
||||
make kiali-port-forward CLUSTER=lab
|
||||
|
||||
# Port-forward для Istio Gateway
|
||||
make istio-gw-port-forward CLUSTER=lab
|
||||
```
|
||||
|
||||
## Конфигурация
|
||||
|
||||
### Переменные лаборатории (molecule/universal/vars.yml)
|
||||
|
||||
```yaml
|
||||
# Сеть для лаборатории
|
||||
docker_network: labnet
|
||||
|
||||
# Образы для разных семейств ОС
|
||||
images:
|
||||
debian: "ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy"
|
||||
rhel: "quay.io/centos/centos:stream9-systemd"
|
||||
|
||||
# Определение хостов
|
||||
hosts:
|
||||
- name: etcd1
|
||||
group: etcd
|
||||
family: debian
|
||||
- name: app-dind
|
||||
group: apps
|
||||
type: dind
|
||||
publish:
|
||||
- "8080:8080"
|
||||
|
||||
# Kind кластеры
|
||||
kind_clusters:
|
||||
- name: lab
|
||||
workers: 2
|
||||
addons:
|
||||
ingress_nginx: true
|
||||
istio: true
|
||||
kiali: true
|
||||
```
|
||||
|
||||
## Особенности
|
||||
|
||||
### 1. Автогенерация инвентаря
|
||||
Инвентарь генерируется автоматически на основе определения хостов в `vars.yml`.
|
||||
|
||||
### 2. Поддержка DinD и DOoD
|
||||
- **DinD**: Полная изоляция, каждый хост имеет свой Docker daemon
|
||||
- **DOoD**: Использование хостового Docker, меньше ресурсов
|
||||
|
||||
### 3. Kubernetes интеграция
|
||||
- Автоматическое создание Kind кластеров
|
||||
- Установка Ingress NGINX, Metrics Server
|
||||
- Поддержка Istio и Kiali
|
||||
- Prometheus Stack с Grafana
|
||||
|
||||
### 4. Мониторинг и отчеты
|
||||
- Автоматическая генерация HTML отчетов
|
||||
- Интеграция с Prometheus и Grafana
|
||||
- Дашборды для Istio
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Проблемы с образами
|
||||
Если возникают проблемы с загрузкой образов, обновите `vars.yml`:
|
||||
|
||||
```yaml
|
||||
images:
|
||||
debian: "ubuntu:22.04" # Используйте стандартные образы
|
||||
rhel: "centos:8"
|
||||
```
|
||||
|
||||
### Проблемы с Docker
|
||||
Убедитесь, что Docker socket доступен:
|
||||
|
||||
```bash
|
||||
ls -la /var/run/docker.sock
|
||||
```
|
||||
|
||||
### Проблемы с Molecule
|
||||
Если возникают проблемы с Molecule, попробуйте:
|
||||
|
||||
```bash
|
||||
# Очистить кэш
|
||||
make lab-reset
|
||||
|
||||
# Проверить конфигурацию
|
||||
docker exec ansible-controller bash -lc 'molecule lint -s universal'
|
||||
```
|
||||
|
||||
## Дальнейшее развитие
|
||||
|
||||
1. **Добавить поддержку Terraform** для создания инфраструктуры
|
||||
2. **Интегрировать с GitLab CI/CD** для автоматического тестирования
|
||||
3. **Добавить поддержку ARM64** для тестирования на Apple Silicon
|
||||
4. **Создать веб-интерфейс** для управления лабораторией
|
||||
5. **Добавить поддержку OpenShift** для enterprise сценариев
|
||||
|
||||
## Лицензия
|
||||
|
||||
MIT License
|
||||
|
||||
## Контакты
|
||||
|
||||
- Автор: Сергей Антропов
|
||||
- Сайт: https://devops.org.ru
|
||||
- Email: [ваш email]
|
||||
@@ -1,282 +0,0 @@
|
||||
# Универсальная система тестирования 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
|
||||
|
||||
@@ -1,249 +0,0 @@
|
||||
# Руководство по работе с Ansible Vault
|
||||
|
||||
## Автор
|
||||
Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
|
||||
## Описание
|
||||
|
||||
Это руководство описывает работу с зашифрованными секретами в Ansible Vault для проекта DevOpsLab.
|
||||
|
||||
## Безопасность
|
||||
|
||||
⚠️ **ВАЖНО**: Зашифрованные файлы содержат секретные данные и должны храниться в безопасности!
|
||||
|
||||
## Команды для работы с 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/`
|
||||
69
env.example
Normal file
69
env.example
Normal file
@@ -0,0 +1,69 @@
|
||||
# =============================================================================
|
||||
# Ansible Template Environment Configuration
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
# =============================================================================
|
||||
|
||||
# Основные настройки проекта
|
||||
PROJECT_NAME=ansible-template
|
||||
VERSION=0.1.0
|
||||
AUTHOR="Сергей Антропов"
|
||||
SITE="https://devops.org.ru"
|
||||
|
||||
# Docker настройки
|
||||
DOCKER_IMAGE=quay.io/ansible/creator-ee:latest
|
||||
DOCKER_NETWORK=labnet
|
||||
DOCKER_COMPOSE=docker compose
|
||||
|
||||
# Molecule настройки
|
||||
SCENARIO=universal
|
||||
LAB_SPEC=molecule/presets/minimal.yml
|
||||
MOLECULE_EPHEMERAL_DIRECTORY=/tmp/molecule
|
||||
|
||||
# Kubernetes настройки
|
||||
KUBE_CONTEXT=kind-lab
|
||||
ISTIO_VERSION=1.22.1
|
||||
KIND_VERSION=v0.23.0
|
||||
|
||||
# Пути
|
||||
ROLES_DIR=./roles
|
||||
VAULT_PASSWORD_FILE=vault/.vault
|
||||
|
||||
# Переменные для лаборатории
|
||||
LAB_PAUSE_MINUTES=10
|
||||
LAB_SPEC=molecule/presets/minimal.yml
|
||||
|
||||
# Переменные для пресетов
|
||||
PRESET_NAME=minimal
|
||||
PRESET_TYPE=classic
|
||||
|
||||
# Переменные для ролей
|
||||
ROLE_NAME=my-role
|
||||
ROLE_DESCRIPTION="My Ansible role"
|
||||
|
||||
# Переменные для Git
|
||||
GIT_BRANCH=main
|
||||
GIT_REMOTE=origin
|
||||
|
||||
# Переменные для Docker
|
||||
DOCKER_REGISTRY=quay.io
|
||||
DOCKER_TAG=latest
|
||||
|
||||
# Переменные для мониторинга
|
||||
GRAFANA_ADMIN_PASSWORD=admin
|
||||
PROMETHEUS_RETENTION=15d
|
||||
|
||||
# Переменные для Istio
|
||||
ISTIO_PROFILE=demo
|
||||
KIALI_AUTH_STRATEGY=anonymous
|
||||
|
||||
# Переменные для Kind
|
||||
KIND_WORKERS=2
|
||||
KIND_API_PORT=6443
|
||||
|
||||
# Переменные для портов
|
||||
HTTP_PORT=8080
|
||||
HTTPS_PORT=8443
|
||||
GRAFANA_PORT=3000
|
||||
PROMETHEUS_PORT=9090
|
||||
KIALI_PORT=20001
|
||||
69
files/grafana/dashboards/istio-overview.json
Normal file
69
files/grafana/dashboards/istio-overview.json
Normal file
@@ -0,0 +1,69 @@
|
||||
{
|
||||
"id": null,
|
||||
"uid": "istio-overview",
|
||||
"title": "Istio • Overview",
|
||||
"schemaVersion": 36,
|
||||
"version": 1,
|
||||
"timezone": "browser",
|
||||
"tags": ["istio", "sre", "mesh"],
|
||||
"panels": [
|
||||
{
|
||||
"type": "stat",
|
||||
"title": "Global RPS",
|
||||
"gridPos": {"h": 4, "w": 6, "x": 0, "y": 0},
|
||||
"targets": [
|
||||
{
|
||||
"expr": "sum(rate(istio_requests_total{reporter=\"destination\"}[5m]))",
|
||||
"legendFormat": "rps"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "stat",
|
||||
"title": "Success Rate",
|
||||
"gridPos": {"h": 4, "w": 6, "x": 6, "y": 0},
|
||||
"targets": [
|
||||
{
|
||||
"expr": "sum(rate(istio_requests_total{reporter=\"destination\",response_code!~\"5..\"}[5m])) / sum(rate(istio_requests_total{reporter=\"destination\"}[5m]))",
|
||||
"legendFormat": "success"
|
||||
}
|
||||
],
|
||||
"options": {"reduceOptions":{"calcs":["lastNotNull"]},"colorMode":"value","graphMode":"none"},
|
||||
"fieldConfig":{"defaults":{"unit":"percentunit","min":0,"max":1}}
|
||||
},
|
||||
{
|
||||
"type": "timeseries",
|
||||
"title": "Latency (ms) p50/p95/p99",
|
||||
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 4},
|
||||
"targets": [
|
||||
{
|
||||
"expr": "histogram_quantile(0.5, sum(rate(istio_request_duration_milliseconds_bucket{reporter=\"destination\"}[5m])) by (le))",
|
||||
"legendFormat": "p50"
|
||||
},
|
||||
{
|
||||
"expr": "histogram_quantile(0.95, sum(rate(istio_request_duration_milliseconds_bucket{reporter=\"destination\"}[5m])) by (le))",
|
||||
"legendFormat": "p95"
|
||||
},
|
||||
{
|
||||
"expr": "histogram_quantile(0.99, sum(rate(istio_request_duration_milliseconds_bucket{reporter=\"destination\"}[5m])) by (le))",
|
||||
"legendFormat": "p99"
|
||||
}
|
||||
],
|
||||
"fieldConfig":{"defaults":{"unit":"ms"}}
|
||||
},
|
||||
{
|
||||
"type": "timeseries",
|
||||
"title": "RPS by Workload",
|
||||
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 12},
|
||||
"targets": [
|
||||
{
|
||||
"expr": "sum by (destination_workload) (rate(istio_requests_total{reporter=\"destination\"}[5m]))",
|
||||
"legendFormat": "{{destination_workload}}"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"templating": {
|
||||
"list": []
|
||||
}
|
||||
}
|
||||
80
files/grafana/dashboards/service-sli.json
Normal file
80
files/grafana/dashboards/service-sli.json
Normal file
@@ -0,0 +1,80 @@
|
||||
{
|
||||
"id": null,
|
||||
"uid": "service-sli",
|
||||
"title": "Service • SLI",
|
||||
"schemaVersion": 36,
|
||||
"version": 1,
|
||||
"timezone": "browser",
|
||||
"tags": ["istio", "sre", "sli"],
|
||||
"templating": {
|
||||
"list": [
|
||||
{
|
||||
"name": "namespace",
|
||||
"type": "query",
|
||||
"datasource": "${DS_PROMETHEUS}",
|
||||
"query": "label_values(istio_requests_total, destination_namespace)",
|
||||
"refresh": 1
|
||||
},
|
||||
{
|
||||
"name": "workload",
|
||||
"type": "query",
|
||||
"datasource": "${DS_PROMETHEUS}",
|
||||
"query": "label_values(istio_requests_total{destination_namespace=\"$namespace\"}, destination_workload)",
|
||||
"refresh": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
"panels": [
|
||||
{
|
||||
"type": "stat",
|
||||
"title": "Success Rate",
|
||||
"gridPos": {"h": 4, "w": 6, "x": 0, "y": 0},
|
||||
"targets": [
|
||||
{
|
||||
"expr": "sum(rate(istio_requests_total{reporter=\"destination\",destination_namespace=\"$namespace\",destination_workload=\"$workload\",response_code!~\"5..\"}[5m])) / sum(rate(istio_requests_total{reporter=\"destination\",destination_namespace=\"$namespace\",destination_workload=\"$workload\"}[5m]))",
|
||||
"legendFormat": "success"
|
||||
}
|
||||
],
|
||||
"fieldConfig":{"defaults":{"unit":"percentunit","min":0,"max":1}}
|
||||
},
|
||||
{
|
||||
"type": "timeseries",
|
||||
"title": "Latency (ms) p50/p95/p99",
|
||||
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 4},
|
||||
"targets": [
|
||||
{
|
||||
"expr": "histogram_quantile(0.5, sum by (le) (rate(istio_request_duration_milliseconds_bucket{reporter=\"destination\",destination_namespace=\"$namespace\",destination_workload=\"$workload\"}[5m])))",
|
||||
"legendFormat": "p50"
|
||||
},
|
||||
{
|
||||
"expr": "histogram_quantile(0.95, sum by (le) (rate(istio_request_duration_milliseconds_bucket{reporter=\"destination\",destination_namespace=\"$namespace\",destination_workload=\"$workload\"}[5m])))",
|
||||
"legendFormat": "p95"
|
||||
},
|
||||
{
|
||||
"expr": "histogram_quantile(0.99, sum by (le) (rate(istio_request_duration_milliseconds_bucket{reporter=\"destination\",destination_namespace=\"$namespace\",destination_workload=\"$workload\"}[5m])))",
|
||||
"legendFormat": "p99"
|
||||
}
|
||||
],
|
||||
"fieldConfig":{"defaults":{"unit":"ms"}}
|
||||
},
|
||||
{
|
||||
"type": "timeseries",
|
||||
"title": "RPS (2xx/4xx/5xx)",
|
||||
"gridPos": {"h": 8, "w": 12, "x": 0, "y": 12},
|
||||
"targets": [
|
||||
{
|
||||
"expr": "sum(rate(istio_requests_total{reporter=\"destination\",destination_namespace=\"$namespace\",destination_workload=\"$workload\",response_code=~\"2..\"}[5m]))",
|
||||
"legendFormat": "2xx"
|
||||
},
|
||||
{
|
||||
"expr": "sum(rate(istio_requests_total{reporter=\"destination\",destination_namespace=\"$namespace\",destination_workload=\"$workload\",response_code=~\"4..\"}[5m]))",
|
||||
"legendFormat": "4xx"
|
||||
},
|
||||
{
|
||||
"expr": "sum(rate(istio_requests_total{reporter=\"destination\",destination_namespace=\"$namespace\",destination_workload=\"$workload\",response_code=~\"5..\"}[5m]))",
|
||||
"legendFormat": "5xx"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
39
files/k8s/istio/telemetry.yaml
Normal file
39
files/k8s/istio/telemetry.yaml
Normal file
@@ -0,0 +1,39 @@
|
||||
---
|
||||
# Istio Telemetry для сбора метрик
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
|
||||
apiVersion: telemetry.istio.io/v1
|
||||
kind: Telemetry
|
||||
metadata:
|
||||
name: mesh-default
|
||||
namespace: istio-system
|
||||
spec:
|
||||
selector: {}
|
||||
metrics:
|
||||
- providers:
|
||||
- name: prometheus
|
||||
overrides:
|
||||
- match:
|
||||
metric: REQUEST_DURATION
|
||||
tagOverrides:
|
||||
"destination_workload": { operation: UPSERT, value: "%DESTINATION_WORKLOAD%" }
|
||||
"destination_namespace": { operation: UPSERT, value: "%DESTINATION_NAMESPACE%" }
|
||||
"request_host": { operation: UPSERT, value: "%REQUEST_HOST%" }
|
||||
histogram:
|
||||
buckets:
|
||||
- 1
|
||||
- 5
|
||||
- 10
|
||||
- 25
|
||||
- 50
|
||||
- 100
|
||||
- 250
|
||||
- 500
|
||||
- 1000
|
||||
- 2000
|
||||
- 5000
|
||||
- match:
|
||||
metric: REQUEST_COUNT
|
||||
tagOverrides:
|
||||
"response_code": { operation: UPSERT, value: "%RESPONSE_CODE%" }
|
||||
66
files/k8s/istio/trafficpolicy.yaml
Normal file
66
files/k8s/istio/trafficpolicy.yaml
Normal file
@@ -0,0 +1,66 @@
|
||||
---
|
||||
# Istio Traffic Policy для управления трафиком
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
|
||||
# mesh-wide mTLS STRICT
|
||||
apiVersion: security.istio.io/v1
|
||||
kind: PeerAuthentication
|
||||
metadata:
|
||||
name: default
|
||||
namespace: istio-system
|
||||
spec:
|
||||
mtls:
|
||||
mode: STRICT
|
||||
|
||||
---
|
||||
# Пример строгой политики для bookinfo (pool + outlier)
|
||||
apiVersion: networking.istio.io/v1
|
||||
kind: DestinationRule
|
||||
metadata:
|
||||
name: productpage-policy
|
||||
namespace: bookinfo
|
||||
spec:
|
||||
host: productpage.bookinfo.svc.cluster.local
|
||||
trafficPolicy:
|
||||
tls:
|
||||
mode: ISTIO_MUTUAL
|
||||
connectionPool:
|
||||
tcp:
|
||||
maxConnections: 100
|
||||
http:
|
||||
http1MaxPendingRequests: 1000
|
||||
maxRequestsPerConnection: 100
|
||||
outlierDetection:
|
||||
consecutive5xx: 5
|
||||
interval: 5s
|
||||
baseEjectionTime: 30s
|
||||
maxEjectionPercent: 50
|
||||
|
||||
---
|
||||
apiVersion: networking.istio.io/v1
|
||||
kind: DestinationRule
|
||||
metadata:
|
||||
name: reviews-policy
|
||||
namespace: bookinfo
|
||||
spec:
|
||||
host: reviews.bookinfo.svc.cluster.local
|
||||
subsets:
|
||||
- name: v1
|
||||
labels: { version: v1 }
|
||||
- name: v2
|
||||
labels: { version: v2 }
|
||||
trafficPolicy:
|
||||
tls:
|
||||
mode: ISTIO_MUTUAL
|
||||
connectionPool:
|
||||
tcp:
|
||||
maxConnections: 100
|
||||
http:
|
||||
http1MaxPendingRequests: 1000
|
||||
maxRequestsPerConnection: 100
|
||||
outlierDetection:
|
||||
consecutive5xx: 3
|
||||
interval: 5s
|
||||
baseEjectionTime: 30s
|
||||
maxEjectionPercent: 50
|
||||
93
files/playbooks/chaos.yml
Normal file
93
files/playbooks/chaos.yml
Normal file
@@ -0,0 +1,93 @@
|
||||
---
|
||||
# Chaos Engineering для тестирования отказоустойчивости
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
|
||||
- name: Chaos Network (add latency)
|
||||
hosts: localhost
|
||||
gather_facts: false
|
||||
vars:
|
||||
chaos_duration: "{{ chaos_duration | default(60) }}"
|
||||
chaos_latency: "{{ chaos_latency | default('100ms') }}"
|
||||
chaos_loss: "{{ chaos_loss | default('5%') }}"
|
||||
|
||||
tasks:
|
||||
- name: Install chaos tools
|
||||
package:
|
||||
name: [iproute2, iptables, tc]
|
||||
state: present
|
||||
|
||||
- name: Add network latency
|
||||
command: >
|
||||
tc qdisc add dev eth0 root netem delay {{ chaos_latency }}
|
||||
ignore_errors: true
|
||||
|
||||
- name: Add packet loss
|
||||
command: >
|
||||
tc qdisc add dev eth0 root netem loss {{ chaos_loss }}
|
||||
ignore_errors: true
|
||||
|
||||
- name: Wait for chaos duration
|
||||
pause:
|
||||
seconds: "{{ chaos_duration }}"
|
||||
|
||||
- name: Remove network chaos
|
||||
command: >
|
||||
tc qdisc del dev eth0 root
|
||||
ignore_errors: true
|
||||
|
||||
- name: Chaos Services (random failures)
|
||||
hosts: all
|
||||
become: true
|
||||
vars:
|
||||
chaos_services:
|
||||
- postgresql
|
||||
- redis
|
||||
- nginx
|
||||
- docker
|
||||
|
||||
tasks:
|
||||
- name: Random service stop
|
||||
systemd:
|
||||
name: "{{ item }}"
|
||||
state: stopped
|
||||
loop: "{{ chaos_services }}"
|
||||
when: (ansible_play_hosts.index(inventory_hostname) + ansible_date_time.epoch) % 3 == 0
|
||||
|
||||
- name: Wait for chaos
|
||||
pause:
|
||||
seconds: 30
|
||||
|
||||
- name: Restart services
|
||||
systemd:
|
||||
name: "{{ item }}"
|
||||
state: started
|
||||
loop: "{{ chaos_services }}"
|
||||
when: (ansible_play_hosts.index(inventory_hostname) + ansible_date_time.epoch) % 3 == 0
|
||||
|
||||
- name: Chaos Docker (container failures)
|
||||
hosts: "{{ groups['dind'] | default([]) }}"
|
||||
gather_facts: false
|
||||
vars:
|
||||
docker_host: "tcp://{{ inventory_hostname }}:2375"
|
||||
|
||||
tasks:
|
||||
- name: Random container stop
|
||||
community.docker.docker_container:
|
||||
name: "{{ item }}"
|
||||
state: stopped
|
||||
docker_host: "{{ docker_host }}"
|
||||
loop: "{{ ansible_play_hosts }}"
|
||||
when: (ansible_play_hosts.index(inventory_hostname) + ansible_date_time.epoch) % 4 == 0
|
||||
|
||||
- name: Wait for chaos
|
||||
pause:
|
||||
seconds: 20
|
||||
|
||||
- name: Restart containers
|
||||
community.docker.docker_container:
|
||||
name: "{{ item }}"
|
||||
state: started
|
||||
docker_host: "{{ docker_host }}"
|
||||
loop: "{{ ansible_play_hosts }}"
|
||||
when: (ansible_play_hosts.index(inventory_hostname) + ansible_date_time.epoch) % 4 == 0
|
||||
45
files/playbooks/site.yml
Normal file
45
files/playbooks/site.yml
Normal file
@@ -0,0 +1,45 @@
|
||||
---
|
||||
# Основной playbook для универсальной лаборатории
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
|
||||
- name: Base deps
|
||||
hosts: all
|
||||
become: true
|
||||
tasks:
|
||||
- name: Update apt cache (Debian)
|
||||
apt:
|
||||
update_cache: true
|
||||
when: ansible_os_family == 'Debian'
|
||||
changed_when: false
|
||||
|
||||
- name: Update yum cache (RHEL)
|
||||
yum:
|
||||
update_cache: true
|
||||
when: ansible_os_family == 'RedHat'
|
||||
changed_when: false
|
||||
|
||||
- name: Common tools
|
||||
package:
|
||||
name:
|
||||
- curl
|
||||
- jq
|
||||
- ca-certificates
|
||||
- iproute2
|
||||
- iputils-ping
|
||||
- procps
|
||||
- net-tools
|
||||
- sudo
|
||||
- vim
|
||||
- wget
|
||||
- unzip
|
||||
state: present
|
||||
|
||||
# Развертывание инфраструктуры
|
||||
- name: Deploy infrastructure
|
||||
hosts: all
|
||||
become: true
|
||||
tasks:
|
||||
- name: Infrastructure placeholder
|
||||
debug:
|
||||
msg: "Инфраструктура готова для настройки"
|
||||
8
files/requirements.yml
Normal file
8
files/requirements.yml
Normal file
@@ -0,0 +1,8 @@
|
||||
---
|
||||
# Коллекции Ansible для универсальной лаборатории
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
|
||||
collections:
|
||||
- name: community.docker
|
||||
- name: community.general
|
||||
@@ -1,16 +0,0 @@
|
||||
# Инвентори для развертывания на реальные серверы
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: 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,19 +0,0 @@
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: grafana-ingress
|
||||
namespace: monitoring
|
||||
annotations:
|
||||
nginx.ingress.kubernetes.io/rewrite-target: /
|
||||
spec:
|
||||
rules:
|
||||
- host: grafana.local
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: monitoring-grafana
|
||||
port:
|
||||
number: 80
|
||||
0
molecule/.gitkeep
Normal file
0
molecule/.gitkeep
Normal file
@@ -1,75 +0,0 @@
|
||||
---
|
||||
- hosts: localhost
|
||||
gather_facts: false
|
||||
vars:
|
||||
# Получаем preset из переменной окружения или используем default
|
||||
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
|
||||
@@ -1,287 +0,0 @@
|
||||
---
|
||||
- hosts: localhost
|
||||
gather_facts: false
|
||||
vars:
|
||||
# Получаем preset из переменной окружения или используем default
|
||||
preset_name: "{{ lookup('env', 'MOLECULE_PRESET') | default('default') }}"
|
||||
# Проверяем сначала в папке k8s, затем в основной папке presets
|
||||
preset_file: "{{ '/workspace/molecule/presets/k8s/' + preset_name + '.yml' if (preset_name in ['k8s-minimal', 'kubernetes', 'k8s-full'] or preset_name.startswith('k8s-')) else '/workspace/molecule/presets/' + preset_name + '.yml' }}"
|
||||
|
||||
# Fallback значения если preset файл не найден
|
||||
docker_network: labnet
|
||||
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||
images:
|
||||
alt9: "inecs/ansible-lab:alt9-latest"
|
||||
alt10: "inecs/ansible-lab:alt10-latest"
|
||||
astra: "inecs/ansible-lab:astra-linux-latest"
|
||||
rhel: "inecs/ansible-lab:rhel-latest"
|
||||
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]
|
||||
kind_clusters: []
|
||||
|
||||
tasks:
|
||||
# - name: Install required collections
|
||||
# command: ansible-galaxy collection install -r /workspace/requirements.yml
|
||||
# delegate_to: localhost
|
||||
# ignore_errors: true
|
||||
# register: collections_install
|
||||
# changed_when: false
|
||||
# run_once: true
|
||||
# become: true
|
||||
# vars:
|
||||
# ansible_python_interpreter: /usr/bin/python3
|
||||
# environment:
|
||||
# ANSIBLE_COLLECTIONS_PATH: /usr/share/ansible/collections
|
||||
|
||||
# Определяем архитектуру системы для корректной загрузки образов
|
||||
- name: 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,86 +0,0 @@
|
||||
---
|
||||
- hosts: localhost
|
||||
gather_facts: false
|
||||
vars:
|
||||
# Получаем preset из переменной окружения или используем default
|
||||
preset_name: "{{ lookup('env', 'MOLECULE_PRESET') | default('default') }}"
|
||||
# Проверяем сначала в папке k8s, затем в основной папке presets
|
||||
preset_file: "{{ '/workspace/molecule/presets/k8s/' + preset_name + '.yml' if (preset_name in ['k8s-minimal', 'kubernetes', 'k8s-full'] or preset_name.startswith('k8s-')) else '/workspace/molecule/presets/' + preset_name + '.yml' }}"
|
||||
|
||||
# Fallback значения если preset файл не найден
|
||||
docker_network: labnet
|
||||
hosts:
|
||||
- name: u1
|
||||
family: debian
|
||||
groups: [test]
|
||||
kind_clusters: []
|
||||
|
||||
tasks:
|
||||
- name: Load preset configuration
|
||||
include_vars: "{{ preset_file }}"
|
||||
when: preset_file is file
|
||||
ignore_errors: true
|
||||
|
||||
- name: Stop and remove containers
|
||||
community.docker.docker_container:
|
||||
name: "{{ item.name }}"
|
||||
state: absent
|
||||
force_kill: true
|
||||
cleanup: true
|
||||
loop: "{{ hosts }}"
|
||||
loop_control: { label: "{{ item.name }}" }
|
||||
ignore_errors: true
|
||||
|
||||
- name: Force remove any remaining containers
|
||||
shell: |
|
||||
docker ps -a --filter "name={{ item.name }}" --format "{{ '{{' }}.ID{{ '}}' }}" | xargs -r docker rm -f
|
||||
loop: "{{ hosts }}"
|
||||
loop_control: { label: "{{ item.name }}" }
|
||||
ignore_errors: true
|
||||
|
||||
- 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 }}
|
||||
- Removed kind clusters: {{ kind_clusters | default([]) | length }}
|
||||
@@ -1,73 +0,0 @@
|
||||
---
|
||||
# Универсальная конфигурация Molecule
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
|
||||
driver:
|
||||
name: docker
|
||||
|
||||
platforms:
|
||||
# Платформы будут созданы динамически через preset файлы
|
||||
# Поддержка собственных образов DevOpsLab
|
||||
- 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:alt9-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
|
||||
image: inecs/ansible-lab:centos-latest
|
||||
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
|
||||
- name: ubuntu
|
||||
image: inecs/ansible-lab:ubuntu-latest
|
||||
pre_build_image: true
|
||||
- name: debian
|
||||
image: inecs/ansible-lab:debian-latest
|
||||
pre_build_image: true
|
||||
|
||||
provisioner:
|
||||
name: ansible
|
||||
config_options:
|
||||
defaults:
|
||||
stdout_callback: yaml
|
||||
remote_tmp: /tmp/.ansible-tmp
|
||||
interpreter_python: auto_silent
|
||||
env:
|
||||
ANSIBLE_STDOUT_CALLBACK: yaml
|
||||
ANSIBLE_REMOTE_TMP: /tmp/.ansible-tmp
|
||||
inventory:
|
||||
links:
|
||||
hosts: "${MOLECULE_EPHEMERAL_DIRECTORY}/inventory/hosts.ini"
|
||||
playbooks:
|
||||
create: create.yml
|
||||
converge: converge.yml
|
||||
destroy: destroy.yml
|
||||
|
||||
dependency:
|
||||
name: galaxy
|
||||
|
||||
verifier:
|
||||
name: ansible
|
||||
|
||||
lint: |-
|
||||
set -e
|
||||
ansible-lint /workspace/roles/
|
||||
@@ -1,216 +0,0 @@
|
||||
---
|
||||
# Универсальный playbook для тестирования Ansible ролей
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
#
|
||||
# Этот файл отвечает за:
|
||||
# 1. Обновление пакетов в контейнерах при запуске тестов
|
||||
# 2. Установку common tools для корректной работы тестов
|
||||
# 3. Подготовку окружения для тестирования ролей
|
||||
# 4. Запуск всех ролей из директории roles/
|
||||
|
||||
- name: Подготовка окружения для тестирования
|
||||
hosts: all
|
||||
become: true
|
||||
tasks:
|
||||
# Создание tmp директории для Ansible
|
||||
- name: Create Ansible tmp directory
|
||||
file:
|
||||
path: /tmp/.ansible-tmp
|
||||
state: directory
|
||||
mode: '0755'
|
||||
owner: root
|
||||
group: root
|
||||
tags:
|
||||
- setup
|
||||
- tmp
|
||||
# Обновление кеша пакетов для Debian/Ubuntu
|
||||
- name: Update package cache (Debian/Ubuntu)
|
||||
apt:
|
||||
update_cache: true
|
||||
cache_valid_time: 3600
|
||||
when: ansible_os_family == 'Debian'
|
||||
changed_when: false
|
||||
tags:
|
||||
- setup
|
||||
- update
|
||||
|
||||
# Обновление кеша пакетов для RHEL/CentOS/AlmaLinux/Rocky
|
||||
- name: Update package cache (RHEL/CentOS/AlmaLinux/Rocky)
|
||||
yum:
|
||||
update_cache: true
|
||||
when: ansible_os_family == 'RedHat'
|
||||
changed_when: false
|
||||
tags:
|
||||
- setup
|
||||
- update
|
||||
|
||||
# Обновление кеша пакетов для Alt Linux
|
||||
- name: Update package cache (Alt Linux)
|
||||
command: apt-get update
|
||||
when: ansible_os_family == 'Altlinux'
|
||||
changed_when: false
|
||||
failed_when: false
|
||||
tags:
|
||||
- setup
|
||||
- update
|
||||
|
||||
# Обновление кеша пакетов для Astra Linux
|
||||
- name: Update package cache (Astra Linux)
|
||||
command: apt-get update
|
||||
when: ansible_os_family == 'Astra Linux'
|
||||
changed_when: false
|
||||
failed_when: false
|
||||
tags:
|
||||
- setup
|
||||
- update
|
||||
|
||||
# Установка common tools для всех ОС (ЗАКОММЕНТИРОВАНО)
|
||||
# - name: Install common tools (Debian/Ubuntu)
|
||||
# apt:
|
||||
# name:
|
||||
# - curl
|
||||
# - jq
|
||||
# - ca-certificates
|
||||
# - iproute2
|
||||
# - iputils-ping
|
||||
# - procps
|
||||
# - net-tools
|
||||
# - vim
|
||||
# - wget
|
||||
# - unzip
|
||||
# - git
|
||||
# state: present
|
||||
# update_cache: false
|
||||
# when: ansible_os_family == 'Debian'
|
||||
# tags:
|
||||
# - setup
|
||||
# - tools
|
||||
|
||||
# - name: Install common tools (RHEL/CentOS/AlmaLinux/Rocky)
|
||||
# yum:
|
||||
# name:
|
||||
# - curl
|
||||
# - jq
|
||||
# - ca-certificates
|
||||
# - iproute
|
||||
# - iputils
|
||||
# - procps-ng
|
||||
# - net-tools
|
||||
# - vim
|
||||
# - wget
|
||||
# - unzip
|
||||
# - git
|
||||
# state: present
|
||||
# when: ansible_os_family == 'RedHat'
|
||||
# tags:
|
||||
# - setup
|
||||
# - tools
|
||||
|
||||
# - name: Install common tools (Alt Linux)
|
||||
# command: apt-get install -y curl jq ca-certificates iproute2 iputils procps net-tools vim wget unzip git
|
||||
# when: ansible_os_family == 'Altlinux'
|
||||
# changed_when: false
|
||||
# failed_when: false
|
||||
# tags:
|
||||
# - setup
|
||||
# - tools
|
||||
|
||||
# - name: Install common tools (Astra Linux)
|
||||
# command: apt-get install -y curl jq ca-certificates iproute2 iputils procps net-tools vim wget unzip git
|
||||
# when: ansible_os_family == 'Astra Linux'
|
||||
# changed_when: false
|
||||
# failed_when: false
|
||||
# tags:
|
||||
# - setup
|
||||
# - tools
|
||||
|
||||
# Установка Python для Ansible (если не установлен)
|
||||
- name: Install Python (Debian/Ubuntu)
|
||||
apt:
|
||||
name:
|
||||
- python3
|
||||
- python3-pip
|
||||
- python3-venv
|
||||
state: present
|
||||
when: ansible_os_family == 'Debian'
|
||||
tags:
|
||||
- setup
|
||||
- python
|
||||
|
||||
# Установка Python 3.8+ для RHEL/CentOS/Rocky/AlmaLinux
|
||||
- name: Install Python 3.8+ (RHEL/CentOS/Rocky/AlmaLinux)
|
||||
yum:
|
||||
name:
|
||||
- python3
|
||||
- python3-pip
|
||||
state: present
|
||||
when: ansible_os_family == 'RedHat'
|
||||
tags:
|
||||
- setup
|
||||
- python
|
||||
|
||||
- name: Install Python (RHEL/CentOS/AlmaLinux/Rocky)
|
||||
yum:
|
||||
name:
|
||||
- python3
|
||||
- python3-pip
|
||||
state: present
|
||||
when: ansible_os_family == 'RedHat'
|
||||
tags:
|
||||
- setup
|
||||
- python
|
||||
|
||||
- name: Install Python (Alt Linux)
|
||||
command: apt-get install -y python3 python3-pip
|
||||
when: ansible_os_family == 'Altlinux'
|
||||
changed_when: false
|
||||
failed_when: false
|
||||
tags:
|
||||
- setup
|
||||
- python
|
||||
|
||||
- name: Install Python (Astra Linux)
|
||||
command: apt-get install -y python3 python3-pip
|
||||
when: ansible_os_family == 'Astra Linux'
|
||||
changed_when: false
|
||||
failed_when: false
|
||||
tags:
|
||||
- setup
|
||||
- python
|
||||
|
||||
# Создание пользователя для тестирования (ЗАКОММЕНТИРОВАНО)
|
||||
# - name: Create test user
|
||||
# user:
|
||||
# name: testuser
|
||||
# shell: /bin/bash
|
||||
# create_home: yes
|
||||
# state: present
|
||||
# tags:
|
||||
# - setup
|
||||
# - user
|
||||
|
||||
# Настройка sudo для тестового пользователя (ЗАКОММЕНТИРОВАНО)
|
||||
# - name: Configure sudo for test user
|
||||
# lineinfile:
|
||||
# path: /etc/sudoers
|
||||
# line: "testuser ALL=(ALL) NOPASSWD:ALL"
|
||||
# state: present
|
||||
# validate: 'visudo -cf %s'
|
||||
# tags:
|
||||
# - setup
|
||||
# - sudo
|
||||
|
||||
# Создание директории для тестов (ЗАКОММЕНТИРОВАНО)
|
||||
# - name: Create test directory
|
||||
# file:
|
||||
# path: /tmp/ansible-test
|
||||
# state: directory
|
||||
# mode: '0755'
|
||||
# owner: testuser
|
||||
# group: testuser
|
||||
# tags:
|
||||
# - setup
|
||||
# - directory
|
||||
|
||||
- import_playbook: ../../roles/deploy.yml
|
||||
@@ -1,123 +0,0 @@
|
||||
---
|
||||
- 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:
|
||||
- name: Load preset configuration
|
||||
include_vars: "{{ preset_file }}"
|
||||
when: preset_file is file
|
||||
ignore_errors: true
|
||||
|
||||
# Проверка systemd узлов
|
||||
- name: Check systemd nodes status
|
||||
community.docker.docker_container_exec:
|
||||
container: "{{ item.name }}"
|
||||
command: systemctl is-system-running
|
||||
loop: "{{ hosts | selectattr('type','undefined') | list }}"
|
||||
loop_control: { label: "{{ item.name }}" }
|
||||
register: systemd_status
|
||||
ignore_errors: true
|
||||
|
||||
- name: Display systemd nodes status
|
||||
debug:
|
||||
msg: "Systemd node {{ item.0.name }}: {{ item.1.stdout | default('unknown') }}"
|
||||
loop: "{{ systemd_status.results | default([]) }}"
|
||||
when: systemd_status is defined
|
||||
|
||||
# Проверка DinD узлов
|
||||
- name: Check DinD nodes docker daemon
|
||||
community.docker.docker_container_exec:
|
||||
container: "{{ item.name }}"
|
||||
command: docker version --format '{{.Server.Version}}'
|
||||
loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list }}"
|
||||
loop_control: { label: "{{ item.name }}" }
|
||||
register: dind_status
|
||||
ignore_errors: true
|
||||
|
||||
- name: Display DinD nodes status
|
||||
debug:
|
||||
msg: "DinD node {{ item.0.name }}: Docker {{ item.1.stdout | default('not running') }}"
|
||||
loop: "{{ dind_status.results | default([]) }}"
|
||||
when: dind_status is defined
|
||||
|
||||
# Проверка DOoD узлов
|
||||
- name: Check DOoD nodes docker access
|
||||
community.docker.docker_container_exec:
|
||||
container: "{{ item.name }}"
|
||||
command: docker ps --format '{{.Names}}'
|
||||
loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dood') | list }}"
|
||||
loop_control: { label: "{{ item.name }}" }
|
||||
register: dood_status
|
||||
ignore_errors: true
|
||||
|
||||
- name: Display DOoD nodes status
|
||||
debug:
|
||||
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: 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') }}"
|
||||
loop_control: { label: "{{ item.0.name }} -> {{ item.1.name }}" }
|
||||
when: item.0.name != item.1.name
|
||||
register: ping_results
|
||||
ignore_errors: true
|
||||
|
||||
- name: Display network connectivity results
|
||||
debug:
|
||||
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 published ports
|
||||
community.docker.docker_container_exec:
|
||||
container: "{{ item.name }}"
|
||||
command: netstat -tlnp
|
||||
loop: "{{ hosts | selectattr('publish','defined') | list }}"
|
||||
loop_control: { label: "{{ item.name }}" }
|
||||
register: port_status
|
||||
ignore_errors: true
|
||||
|
||||
- name: Display port status
|
||||
debug:
|
||||
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: Display inventory groups
|
||||
debug:
|
||||
msg: |
|
||||
📋 Inventory Groups:
|
||||
{% for group, members in (groups_map | default({}) | dictsort) %}
|
||||
- {{ group }}: {{ members | join(', ') }}
|
||||
{% endfor %}
|
||||
|
||||
# Финальная сводка
|
||||
- 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 }}
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
---
|
||||
#description: Стандартный пресет по умолчанию для тестирования с 2 хостами (Ubuntu + Debian)
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
|
||||
docker_network: labnet
|
||||
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||
|
||||
# systemd-ready образы
|
||||
images:
|
||||
alt9: "inecs/ansible-lab:alt9-latest"
|
||||
alt10: "inecs/ansible-lab:alt10-latest"
|
||||
astra: "inecs/ansible-lab:astra-linux-latest"
|
||||
rhel: "inecs/ansible-lab:rhel-latest"
|
||||
centos7: "inecs/ansible-lab:centos7-latest"
|
||||
centos8: "inecs/ansible-lab:centos8-latest"
|
||||
centos9: "inecs/ansible-lab:centos9-latest"
|
||||
alma: "inecs/ansible-lab:alma-latest"
|
||||
rocky: "inecs/ansible-lab:rocky-latest"
|
||||
redos: "inecs/ansible-lab:redos-latest"
|
||||
ubuntu20: "inecs/ansible-lab:ubuntu20-latest"
|
||||
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
|
||||
ubuntu24: "inecs/ansible-lab:ubuntu24-latest"
|
||||
debian9: "inecs/ansible-lab:debian9-latest"
|
||||
debian10: "inecs/ansible-lab:debian10-latest"
|
||||
debian11: "inecs/ansible-lab:debian11-latest"
|
||||
debian12: "inecs/ansible-lab:debian12-latest"
|
||||
|
||||
systemd_defaults:
|
||||
privileged: true
|
||||
command: "/sbin/init"
|
||||
volumes:
|
||||
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
|
||||
tmpfs: ["/run", "/run/lock"]
|
||||
capabilities: ["SYS_ADMIN"]
|
||||
|
||||
hosts:
|
||||
# Стандартный набор - 2 хоста для базового тестирования (стабильные ОС)
|
||||
- name: u1
|
||||
family: ubuntu22
|
||||
groups: [test, web]
|
||||
- name: u2
|
||||
family: debian12
|
||||
groups: [test, web]
|
||||
@@ -1,185 +0,0 @@
|
||||
---
|
||||
#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:
|
||||
alt9: "inecs/ansible-lab:alt9-latest"
|
||||
alt10: "inecs/ansible-lab:alt10-latest"
|
||||
astra: "inecs/ansible-lab:astra-linux-latest"
|
||||
rhel: "inecs/ansible-lab:rhel-latest"
|
||||
centos7: "inecs/ansible-lab:centos7-latest"
|
||||
centos8: "inecs/ansible-lab:centos8-latest"
|
||||
centos9: "inecs/ansible-lab:centos9-latest"
|
||||
alma: "inecs/ansible-lab:alma-latest"
|
||||
rocky: "inecs/ansible-lab:rocky-latest"
|
||||
redos: "inecs/ansible-lab:redos-latest"
|
||||
ubuntu20: "inecs/ansible-lab:ubuntu20-latest"
|
||||
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
|
||||
ubuntu24: "inecs/ansible-lab:ubuntu24-latest"
|
||||
debian9: "inecs/ansible-lab:debian9-latest"
|
||||
debian10: "inecs/ansible-lab:debian10-latest"
|
||||
debian11: "inecs/ansible-lab:debian11-latest"
|
||||
debian12: "inecs/ansible-lab:debian12-latest"
|
||||
|
||||
systemd_defaults:
|
||||
privileged: true
|
||||
command: "/sbin/init"
|
||||
volumes:
|
||||
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
|
||||
tmpfs: ["/run", "/run/lock"]
|
||||
capabilities: ["SYS_ADMIN"]
|
||||
|
||||
hosts:
|
||||
# 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"
|
||||
@@ -1,52 +0,0 @@
|
||||
---
|
||||
#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"]
|
||||
@@ -1,34 +0,0 @@
|
||||
---
|
||||
#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"]
|
||||
@@ -1,34 +0,0 @@
|
||||
---
|
||||
#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"]
|
||||
@@ -1,34 +0,0 @@
|
||||
---
|
||||
#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"]
|
||||
@@ -1,63 +0,0 @@
|
||||
---
|
||||
#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"]
|
||||
@@ -1,34 +0,0 @@
|
||||
---
|
||||
#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"]
|
||||
@@ -1,34 +0,0 @@
|
||||
---
|
||||
#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"]
|
||||
@@ -1,34 +0,0 @@
|
||||
---
|
||||
#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"]
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user