Compare commits
55 Commits
d02dd1f9e2
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f6d1182193 | ||
|
|
0b4efd9ca1 | ||
|
|
1b6db7445d | ||
|
|
5ea320ce9a | ||
|
|
d7397fe7fe | ||
|
|
5543ae4d27 | ||
|
|
c66bb35f97 | ||
|
|
c83b2526dc | ||
|
|
c3ba139d45 | ||
|
|
6d06dbf745 | ||
|
|
3953650f25 | ||
|
|
98af514e2c | ||
|
|
28ab44e6a6 | ||
|
|
8734519be2 | ||
|
|
37ff18c91b | ||
|
|
4e86b7f0c3 | ||
|
|
85b68dc4d0 | ||
|
|
a56de6183a | ||
|
|
d8e1052e7b | ||
|
|
c2ab17b7b6 | ||
|
|
c2a84a3aee | ||
|
|
0ffe1f1a90 | ||
|
|
df7473fbd9 | ||
|
|
eca556cca7 | ||
|
|
fcf3f33e80 | ||
|
|
6ef4090fb2 | ||
|
|
9677aea281 | ||
|
|
fd80db220a | ||
|
|
4ca882b5f7 | ||
|
|
3b8c6e52ea | ||
|
|
02eab55d73 | ||
|
|
e3d393ef91 | ||
|
|
6d55f924e5 | ||
|
|
69a589974e | ||
|
|
3238b3903a | ||
|
|
ab1231fce5 | ||
|
|
44fff158ce | ||
|
|
604c7816be | ||
|
|
06bfc00b5a | ||
|
|
ebed1f76ab | ||
|
|
69b547dda6 | ||
|
|
d48c273e50 | ||
|
|
87002cb9b3 | ||
|
|
e2b9d94075 | ||
|
|
791504abf6 | ||
|
|
33e329c091 | ||
|
|
5c8862e9bf | ||
|
|
591cdaf831 | ||
|
|
377e15119a | ||
|
|
4ed9c2e0eb | ||
|
|
60c2623fbc | ||
|
|
1b6c83d941 | ||
|
|
714ca43d38 | ||
|
|
881502ad69 | ||
|
|
c1655d2674 |
2
.dockerignore
Normal file
2
.dockerignore
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
.github
|
||||||
|
|
||||||
44
.github/workflows/ansible-test.yml
vendored
44
.github/workflows/ansible-test.yml
vendored
@@ -1,44 +0,0 @@
|
|||||||
name: Ansible Testing
|
|
||||||
on: [push, pull_request]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
lint:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- name: Setup Python
|
|
||||||
uses: actions/setup-python@v4
|
|
||||||
with:
|
|
||||||
python-version: '3.11'
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
pip install ansible ansible-lint
|
|
||||||
ansible-galaxy collection install -r requirements.yml
|
|
||||||
- name: Run lint
|
|
||||||
run: make role lint
|
|
||||||
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: lint
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
preset: [minimal, default, performance]
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- name: Setup Docker
|
|
||||||
run: |
|
|
||||||
sudo systemctl start docker
|
|
||||||
sudo usermod -aG docker $USER
|
|
||||||
- name: Run tests
|
|
||||||
run: make role test ${{ matrix.preset }}
|
|
||||||
|
|
||||||
deploy-check:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: [lint, test]
|
|
||||||
if: github.ref == 'refs/heads/main'
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- name: Check deployment
|
|
||||||
run: make role deploy
|
|
||||||
env:
|
|
||||||
ANSIBLE_HOST_KEY_CHECKING: false
|
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -180,3 +180,6 @@ cython_debug/
|
|||||||
# Cursor IDE
|
# Cursor IDE
|
||||||
.cursor/
|
.cursor/
|
||||||
|
|
||||||
|
# Kubernetes kubeconfig
|
||||||
|
kubeconfig
|
||||||
|
|
||||||
|
|||||||
118
CHANGELOG.md
Normal file
118
CHANGELOG.md
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
# Changelog - DevOpsLab
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
|
**Версия:** 3.0.0
|
||||||
|
|
||||||
|
## [3.0.0] - 2025-10-27
|
||||||
|
|
||||||
|
### ✨ Новые возможности
|
||||||
|
|
||||||
|
#### 🎯 COD Preset
|
||||||
|
- **Новый preset `cod`** для тестирования российских и зарубежных ОС
|
||||||
|
- **6 контейнеров**: Ubuntu + Debian + Alt + Astra + CentOS + RHEL
|
||||||
|
- **ARM64 поддержка** для нативной производительности
|
||||||
|
- **Автоматическое определение** архитектуры и применение соответствующих настроек
|
||||||
|
|
||||||
|
#### 🔧 Универсальная роль devops
|
||||||
|
- **Создание пользователей** с настройкой пароля
|
||||||
|
- **Установка SSH ключей** для безопасного доступа
|
||||||
|
- **Настройка sudo прав** с гибкой конфигурацией
|
||||||
|
- **Поддержка российских ОС** (Alt Linux, Astra Linux, RedOS)
|
||||||
|
- **Автоматическое определение ОС** и применение соответствующих конфигураций
|
||||||
|
|
||||||
|
#### 🐳 ARM64 поддержка
|
||||||
|
- **Multi-arch сборка** для AMD64 и ARM64
|
||||||
|
- **Нативная производительность** без эмуляции
|
||||||
|
- **Совместимость** с Apple Silicon и ARM серверами
|
||||||
|
- **Оптимизация ресурсов** - меньше потребление CPU и памяти
|
||||||
|
|
||||||
|
#### 📚 Документация
|
||||||
|
- **Новая документация** по COD preset
|
||||||
|
- **Руководство по роли devops** с примерами использования
|
||||||
|
- **ARM64 поддержка** - подробное описание возможностей
|
||||||
|
- **Обновленные примеры** с новыми возможностями
|
||||||
|
|
||||||
|
### 🔄 Изменения
|
||||||
|
|
||||||
|
#### Preset система
|
||||||
|
- **Переименование** `geop` → `cod` для лучшего понимания
|
||||||
|
- **Добавление российских ОС** в основные пресеты
|
||||||
|
- **ARM64 конфигурация** для всех новых пресетов
|
||||||
|
- **Улучшенные разделители** в логах Molecule
|
||||||
|
|
||||||
|
#### Роль devops
|
||||||
|
- **Универсальность** - работает на всех поддерживаемых ОС
|
||||||
|
- **Автоматическое определение** типа ОС
|
||||||
|
- **Поддержка vault** для безопасного хранения секретов
|
||||||
|
- **Гибкая конфигурация** групп и прав доступа
|
||||||
|
|
||||||
|
#### Docker образы
|
||||||
|
- **Multi-arch сборка** для всех образов
|
||||||
|
- **Российские ОС** с ARM64 поддержкой
|
||||||
|
- **Оптимизированные образы** для лучшей производительности
|
||||||
|
- **Автоматическая публикация** в Docker Hub
|
||||||
|
|
||||||
|
### 🐛 Исправления
|
||||||
|
|
||||||
|
#### Molecule тестирование
|
||||||
|
- **Исправлена работа с vault** в тестовых контейнерах
|
||||||
|
- **Автоматическое копирование** секретов в контейнеры
|
||||||
|
- **Улучшенная диагностика** ошибок тестирования
|
||||||
|
- **Оптимизированные логи** с красивыми разделителями
|
||||||
|
|
||||||
|
#### Роль devops
|
||||||
|
- **Исправлено создание групп** для российских ОС
|
||||||
|
- **Улучшена совместимость** с Alt Linux и Astra Linux
|
||||||
|
- **Исправлена работа с sudo** на разных платформах
|
||||||
|
- **Оптимизированы шаблоны** SSH и sudoers
|
||||||
|
|
||||||
|
#### Docker сборка
|
||||||
|
- **Исправлены конфликты пакетов** в RedOS ARM64
|
||||||
|
- **Улучшена совместимость** с CentOS Stream 9
|
||||||
|
- **Оптимизированы Dockerfile** для ARM64
|
||||||
|
- **Исправлена работа с locale** в российских ОС
|
||||||
|
|
||||||
|
### 📊 Статистика
|
||||||
|
|
||||||
|
#### Новые файлы
|
||||||
|
- `molecule/presets/cod.yml` - COD preset конфигурация
|
||||||
|
- `docs/cod-preset.md` - Документация COD preset
|
||||||
|
- `docs/devops-role.md` - Документация роли devops
|
||||||
|
- `docs/arm64-support.md` - ARM64 поддержка
|
||||||
|
- `dockerfiles/astra-linux/Dockerfile.arm64` - Astra Linux ARM64
|
||||||
|
- `dockerfiles/redos/Dockerfile.arm64` - RedOS ARM64
|
||||||
|
|
||||||
|
#### Обновленные файлы
|
||||||
|
- `README.md` - Основная документация
|
||||||
|
- `docs/examples.md` - Примеры использования
|
||||||
|
- `roles/devops/` - Универсальная роль devops
|
||||||
|
- `molecule/default/` - Улучшенные тесты
|
||||||
|
- `Makefile` - ARM64 поддержка
|
||||||
|
|
||||||
|
#### Удаленные файлы
|
||||||
|
- `molecule/presets/geop.yml` - Переименован в cod.yml
|
||||||
|
- `roles/devops/QUICKSTART.md` - Заменен на README.md
|
||||||
|
- `roles/devops/examples.yml` - Интегрирован в vars/main.yml
|
||||||
|
|
||||||
|
### 🎉 Достижения
|
||||||
|
|
||||||
|
- ✅ **COD preset** для тестирования российских и зарубежных ОС
|
||||||
|
- ✅ **ARM64 поддержка** для нативной производительности
|
||||||
|
- ✅ **Универсальная роль devops** с автоматическим определением ОС
|
||||||
|
- ✅ **Multi-arch Docker образы** для всех платформ
|
||||||
|
- ✅ **Улучшенная документация** с подробными примерами
|
||||||
|
- ✅ **Оптимизированное тестирование** с красивыми логами
|
||||||
|
|
||||||
|
### 🚀 Следующие шаги
|
||||||
|
|
||||||
|
- [ ] Добавить поддержку других российских ОС
|
||||||
|
- [ ] Расширить функциональность роли devops
|
||||||
|
- [ ] Добавить больше примеров использования
|
||||||
|
- [ ] Оптимизировать производительность тестирования
|
||||||
|
- [ ] Добавить поддержку других архитектур
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
546
Makefile
546
Makefile
@@ -1,5 +1,5 @@
|
|||||||
# =============================================================================
|
# =============================================================================
|
||||||
# AnsibleLab - Универсальная система тестирования Ansible ролей
|
# DevOpsLab - Универсальная система тестирования Ansible ролей
|
||||||
# Автор: Сергей Антропов
|
# Автор: Сергей Антропов
|
||||||
# Сайт: https://devops.org.ru
|
# Сайт: https://devops.org.ru
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
@@ -20,13 +20,15 @@ WHITE := \033[0;37m
|
|||||||
RESET := \033[0m
|
RESET := \033[0m
|
||||||
|
|
||||||
# Глобальные переменные
|
# Глобальные переменные
|
||||||
PROJECT_NAME ?= ansible-lab
|
PROJECT_NAME ?= devops-lab
|
||||||
VERSION ?= 0.1.0
|
VERSION ?= 0.1.0
|
||||||
AUTHOR ?= "Сергей Антропов"
|
AUTHOR ?= "Сергей Антропов"
|
||||||
SITE ?= "https://devops.org.ru"
|
SITE ?= "https://devops.org.ru"
|
||||||
DOCKER_IMAGE ?= inecs/ansible-lab:ansible-controller-latest
|
DOCKER_IMAGE ?= inecs/ansible-lab:ansible-controller-latest
|
||||||
|
DOCKER_K8S_IMAGE ?= inecs/ansible-lab:k8s-latest
|
||||||
DOCKER_DIND_IMAGE ?= docker:27-dind
|
DOCKER_DIND_IMAGE ?= docker:27-dind
|
||||||
CONTAINER_NAME ?= ansible-controller
|
CONTAINER_NAME ?= ansible-controller
|
||||||
|
EDITOR ?= nano
|
||||||
|
|
||||||
# Переменные для Docker Hub
|
# Переменные для Docker Hub
|
||||||
DOCKER_REGISTRY ?= inecs/ansible-lab
|
DOCKER_REGISTRY ?= inecs/ansible-lab
|
||||||
@@ -40,7 +42,7 @@ DOCKER_BUILDX_BUILDER ?= multiarch-builder
|
|||||||
# Базовые образы и их теги
|
# Базовые образы и их теги
|
||||||
BASE_IMAGES := altlinux/p9 astralinux/astra-1.7 redos/redos:9 registry.access.redhat.com/ubi8/ubi centos:7 quay.io/centos/centos:8 quay.io/centos/centos:stream9 almalinux:8 rockylinux:8 ubuntu:20.04 ubuntu:22.04 ubuntu:24.04 debian:9 debian:10 debian:11 debian:bookworm
|
BASE_IMAGES := altlinux/p9 astralinux/astra-1.7 redos/redos:9 registry.access.redhat.com/ubi8/ubi centos:7 quay.io/centos/centos:8 quay.io/centos/centos:stream9 almalinux:8 rockylinux:8 ubuntu:20.04 ubuntu:22.04 ubuntu:24.04 debian:9 debian:10 debian:11 debian:bookworm
|
||||||
|
|
||||||
.PHONY: role vault git docker presets controller help update-playbooks generate-docs setup-cicd list create delete
|
.PHONY: role vault git docker presets controller k8s help update-playbooks generate-docs setup-cicd list create delete
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# КОМАНДЫ ДЛЯ РАБОТЫ С РОЛЯМИ
|
# КОМАНДЫ ДЛЯ РАБОТЫ С РОЛЯМИ
|
||||||
@@ -87,8 +89,9 @@ role:
|
|||||||
-e ANSIBLE_FORCE_COLOR=1 \
|
-e ANSIBLE_FORCE_COLOR=1 \
|
||||||
-e MOLECULE_PRESET=$$PRESET \
|
-e MOLECULE_PRESET=$$PRESET \
|
||||||
-e MOLECULE_EPHEMERAL_DIRECTORY=/tmp/molecule_workspace \
|
-e MOLECULE_EPHEMERAL_DIRECTORY=/tmp/molecule_workspace \
|
||||||
|
-e MOLECULE_VAULT_ENABLED=$${MOLECULE_VAULT_ENABLED:-false} \
|
||||||
$(DOCKER_IMAGE) \
|
$(DOCKER_IMAGE) \
|
||||||
bash -c "mkdir -p /tmp/molecule_workspace/inventory && cd molecule/default && ansible-playbook -i localhost, create.yml --connection=local -e molecule_ephemeral_directory=/tmp/molecule_workspace && ansible-playbook -i /tmp/molecule_workspace/inventory/hosts.ini site.yml; ansible-playbook -i localhost, destroy.yml --connection=local -e molecule_ephemeral_directory=/tmp/molecule_workspace; echo '✅ Тестирование завершено'";; \
|
bash -c "mkdir -p /tmp/molecule_workspace/inventory && cd molecule/default && ansible-playbook -i localhost, create.yml --connection=local -e molecule_ephemeral_directory=/tmp/molecule_workspace && ansible-playbook -i localhost, converge.yml --connection=local -e molecule_ephemeral_directory=/tmp/molecule_workspace && ansible-playbook -i /tmp/molecule_workspace/inventory/hosts.ini site.yml; ansible-playbook -i localhost, destroy.yml --connection=local -e molecule_ephemeral_directory=/tmp/molecule_workspace; echo '✅ Тестирование завершено'";; \
|
||||||
deploy) \
|
deploy) \
|
||||||
echo "🚀 Развертывание ролей на реальные серверы..."; \
|
echo "🚀 Развертывание ролей на реальные серверы..."; \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
@@ -287,6 +290,7 @@ vault:
|
|||||||
echo "🔐 Создание файла секретов..."; \
|
echo "🔐 Создание файла секретов..."; \
|
||||||
read -p "Введите имя файла (без .yml): " FILE; \
|
read -p "Введите имя файла (без .yml): " FILE; \
|
||||||
docker run --rm -it -v "$(PWD):/workspace" -w /workspace \
|
docker run --rm -it -v "$(PWD):/workspace" -w /workspace \
|
||||||
|
-e EDITOR=$(EDITOR) \
|
||||||
$(DOCKER_IMAGE) \
|
$(DOCKER_IMAGE) \
|
||||||
ansible-vault create --encrypt-vault-id default --vault-password-file vault/.vault vault/$$FILE.yml;; \
|
ansible-vault create --encrypt-vault-id default --vault-password-file vault/.vault vault/$$FILE.yml;; \
|
||||||
edit) \
|
edit) \
|
||||||
@@ -295,6 +299,7 @@ vault:
|
|||||||
echo ""; \
|
echo ""; \
|
||||||
read -p "Введите имя файла (без .yml): " FILE; \
|
read -p "Введите имя файла (без .yml): " FILE; \
|
||||||
docker run --rm -it -v "$(PWD):/workspace" -w /workspace \
|
docker run --rm -it -v "$(PWD):/workspace" -w /workspace \
|
||||||
|
-e EDITOR=$(EDITOR) \
|
||||||
$(DOCKER_IMAGE) \
|
$(DOCKER_IMAGE) \
|
||||||
ansible-vault edit --vault-password-file vault/.vault vault/$$FILE.yml;; \
|
ansible-vault edit --vault-password-file vault/.vault vault/$$FILE.yml;; \
|
||||||
show) \
|
show) \
|
||||||
@@ -333,6 +338,7 @@ vault:
|
|||||||
echo ""; \
|
echo ""; \
|
||||||
read -p "Введите имя файла (без .yml): " FILE; \
|
read -p "Введите имя файла (без .yml): " FILE; \
|
||||||
docker run --rm -it -v "$(PWD):/workspace" -w /workspace \
|
docker run --rm -it -v "$(PWD):/workspace" -w /workspace \
|
||||||
|
-e EDITOR=$(EDITOR) \
|
||||||
$(DOCKER_IMAGE) \
|
$(DOCKER_IMAGE) \
|
||||||
ansible-vault rekey --vault-password-file vault/.vault vault/$$FILE.yml;; \
|
ansible-vault rekey --vault-password-file vault/.vault vault/$$FILE.yml;; \
|
||||||
check) \
|
check) \
|
||||||
@@ -379,10 +385,10 @@ vault:
|
|||||||
echo " 💡 Первая команда для настройки vault"; \
|
echo " 💡 Первая команда для настройки vault"; \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
echo " 🔐 make vault create - создать новый файл секретов"; \
|
echo " 🔐 make vault create - создать новый файл секретов"; \
|
||||||
echo " 💡 Интерактивное создание зашифрованного файла"; \
|
echo " 💡 Интерактивное создание зашифрованного файла с nano"; \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
echo " ✏️ make vault edit - редактировать существующие секреты"; \
|
echo " ✏️ make vault edit - редактировать существующие секреты"; \
|
||||||
echo " 💡 Открывает редактор для изменения секретов"; \
|
echo " 💡 Открывает nano для изменения секретов"; \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
echo " 👁️ make vault show - показать содержимое секретов"; \
|
echo " 👁️ make vault show - показать содержимое секретов"; \
|
||||||
echo " 💡 Расшифровывает и показывает содержимое"; \
|
echo " 💡 Расшифровывает и показывает содержимое"; \
|
||||||
@@ -397,7 +403,7 @@ vault:
|
|||||||
echo " 💡 Создает незашифрованную копию"; \
|
echo " 💡 Создает незашифрованную копию"; \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
echo " 🔑 make vault rekey - сменить пароль шифрования"; \
|
echo " 🔑 make vault rekey - сменить пароль шифрования"; \
|
||||||
echo " 💡 Изменяет пароль для существующего файла"; \
|
echo " 💡 Изменяет пароль для существующего файла с nano"; \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
echo " ✅ make vault check - проверить vault файлы"; \
|
echo " ✅ make vault check - проверить vault файлы"; \
|
||||||
echo " 💡 Проверяет структуру и статус файлов"; \
|
echo " 💡 Проверяет структуру и статус файлов"; \
|
||||||
@@ -413,6 +419,18 @@ git:
|
|||||||
@case "$(word 2, $(MAKECMDGOALS))" in \
|
@case "$(word 2, $(MAKECMDGOALS))" in \
|
||||||
push) \
|
push) \
|
||||||
echo "📤 Отправка изменений в репозиторий..."; \
|
echo "📤 Отправка изменений в репозиторий..."; \
|
||||||
|
if [ -d "vault" ]; then \
|
||||||
|
VAULT_FILES=$$(find vault -maxdepth 1 -type f -name "*.yml" 2>/dev/null); \
|
||||||
|
if [ -n "$$VAULT_FILES" ]; then \
|
||||||
|
echo "🔐 Шифрование vault/*.yml..."; \
|
||||||
|
for f in $$VAULT_FILES; do \
|
||||||
|
if ! grep -q "ANSIBLE_VAULT" "$$f" 2>/dev/null; then \
|
||||||
|
docker run --rm -v "$(PWD):/workspace" -w /workspace $(DOCKER_IMAGE) \
|
||||||
|
ansible-vault encrypt --encrypt-vault-id default --vault-password-file vault/.vault "$$f" || true; \
|
||||||
|
fi; \
|
||||||
|
done; \
|
||||||
|
fi; \
|
||||||
|
fi; \
|
||||||
git add .; \
|
git add .; \
|
||||||
git commit -m "Обновление проекта"; \
|
git commit -m "Обновление проекта"; \
|
||||||
git push origin main;; \
|
git push origin main;; \
|
||||||
@@ -578,6 +596,40 @@ docker:
|
|||||||
$(MAKE) docker setup-builder; \
|
$(MAKE) docker setup-builder; \
|
||||||
$(MAKE) docker-build-image IMAGE=$(IMAGE); \
|
$(MAKE) docker-build-image IMAGE=$(IMAGE); \
|
||||||
echo "✅ Образ $(IMAGE) собран";; \
|
echo "✅ Образ $(IMAGE) собран";; \
|
||||||
|
build-astra-arm64) \
|
||||||
|
echo "🔨 Сборка Astra Linux для ARM64 (совместимый образ)..."; \
|
||||||
|
echo "📋 Платформы: linux/amd64,linux/arm64"; \
|
||||||
|
echo "📋 Builder: $(DOCKER_BUILDX_BUILDER)"; \
|
||||||
|
echo "📋 Registry: $(DOCKER_REGISTRY)"; \
|
||||||
|
echo "⚠️ ВНИМАНИЕ: Используется совместимый образ на базе Debian"; \
|
||||||
|
echo ""; \
|
||||||
|
$(MAKE) docker setup-builder; \
|
||||||
|
cd dockerfiles/astra-linux && \
|
||||||
|
docker buildx build \
|
||||||
|
--platform linux/amd64,linux/arm64 \
|
||||||
|
--tag $(DOCKER_REGISTRY):astra-linux-arm64-latest \
|
||||||
|
--tag $(DOCKER_REGISTRY):astra-linux-latest \
|
||||||
|
--file Dockerfile.arm64 \
|
||||||
|
--push \
|
||||||
|
.; \
|
||||||
|
echo "✅ Astra Linux для ARM64 собран и отправлен";; \
|
||||||
|
build-redos-arm64) \
|
||||||
|
echo "🔨 Сборка RedOS для ARM64 (совместимый образ)..."; \
|
||||||
|
echo "📋 Платформы: linux/amd64,linux/arm64"; \
|
||||||
|
echo "📋 Builder: $(DOCKER_BUILDX_BUILDER)"; \
|
||||||
|
echo "📋 Registry: $(DOCKER_REGISTRY)"; \
|
||||||
|
echo "⚠️ ВНИМАНИЕ: Используется совместимый образ на базе CentOS Stream 9"; \
|
||||||
|
echo ""; \
|
||||||
|
$(MAKE) docker setup-builder; \
|
||||||
|
cd dockerfiles/redos && \
|
||||||
|
docker buildx build \
|
||||||
|
--platform linux/amd64,linux/arm64 \
|
||||||
|
--tag $(DOCKER_REGISTRY):redos-arm64-latest \
|
||||||
|
--tag $(DOCKER_REGISTRY):redos-latest \
|
||||||
|
--file Dockerfile.arm64 \
|
||||||
|
--push \
|
||||||
|
.; \
|
||||||
|
echo "✅ RedOS для ARM64 собран и отправлен";; \
|
||||||
setup-builder) \
|
setup-builder) \
|
||||||
echo "🔧 Настройка multi-arch builder в контейнере..."; \
|
echo "🔧 Настройка multi-arch builder в контейнере..."; \
|
||||||
if $(MAKE) docker-check-builder >/dev/null 2>&1; then \
|
if $(MAKE) docker-check-builder >/dev/null 2>&1; then \
|
||||||
@@ -847,6 +899,16 @@ docker-get-base-tag:
|
|||||||
echo "📦 Загрузка базового образа $$BASE_IMAGE..." >&2; \
|
echo "📦 Загрузка базового образа $$BASE_IMAGE..." >&2; \
|
||||||
docker pull $$BASE_IMAGE >/dev/null 2>&1 || echo "⚠️ Не удалось загрузить $$BASE_IMAGE" >&2; \
|
docker pull $$BASE_IMAGE >/dev/null 2>&1 || echo "⚠️ Не удалось загрузить $$BASE_IMAGE" >&2; \
|
||||||
TAG="latest";; \
|
TAG="latest";; \
|
||||||
|
astra-linux-arm64) \
|
||||||
|
BASE_IMAGE="debian:bookworm-slim"; \
|
||||||
|
echo "📦 Загрузка базового образа $$BASE_IMAGE..." >&2; \
|
||||||
|
docker pull $$BASE_IMAGE >/dev/null 2>&1 || echo "⚠️ Не удалось загрузить $$BASE_IMAGE" >&2; \
|
||||||
|
TAG="latest";; \
|
||||||
|
redos-arm64) \
|
||||||
|
BASE_IMAGE="quay.io/centos/centos:stream9"; \
|
||||||
|
echo "📦 Загрузка базового образа $$BASE_IMAGE..." >&2; \
|
||||||
|
docker pull $$BASE_IMAGE >/dev/null 2>&1 || echo "⚠️ Не удалось загрузить $$BASE_IMAGE" >&2; \
|
||||||
|
TAG="latest";; \
|
||||||
rhel) \
|
rhel) \
|
||||||
BASE_IMAGE="registry.access.redhat.com/ubi8/ubi"; \
|
BASE_IMAGE="registry.access.redhat.com/ubi8/ubi"; \
|
||||||
echo "📦 Загрузка базового образа $$BASE_IMAGE..." >&2; \
|
echo "📦 Загрузка базового образа $$BASE_IMAGE..." >&2; \
|
||||||
@@ -914,6 +976,10 @@ docker-get-base-tag:
|
|||||||
TAG=$$(docker inspect --format='{{.RepoTags}}' $$BASE_IMAGE 2>/dev/null | tr -d '[]' | cut -d',' -f1 | cut -d':' -f2 | tr -d ' ' || echo "latest");; \
|
TAG=$$(docker inspect --format='{{.RepoTags}}' $$BASE_IMAGE 2>/dev/null | tr -d '[]' | cut -d',' -f1 | cut -d':' -f2 | tr -d ' ' || echo "latest");; \
|
||||||
ansible-controller) \
|
ansible-controller) \
|
||||||
TAG="latest";; \
|
TAG="latest";; \
|
||||||
|
k8s) \
|
||||||
|
TAG="latest";; \
|
||||||
|
k8s-portforward) \
|
||||||
|
TAG="latest";; \
|
||||||
*) \
|
*) \
|
||||||
echo "❌ Неизвестный образ: $(IMAGE)"; \
|
echo "❌ Неизвестный образ: $(IMAGE)"; \
|
||||||
exit 1;; \
|
exit 1;; \
|
||||||
@@ -937,6 +1003,16 @@ docker-build-image:
|
|||||||
echo "📋 Registry: $(DOCKER_REGISTRY)"; \
|
echo "📋 Registry: $(DOCKER_REGISTRY)"; \
|
||||||
echo "⚠️ ВНИМАНИЕ: Базовый образ поддерживает только AMD64"; \
|
echo "⚠️ ВНИМАНИЕ: Базовый образ поддерживает только AMD64"; \
|
||||||
echo "=========================================="; \
|
echo "=========================================="; \
|
||||||
|
elif [ "$(IMAGE)" = "astra-linux-arm64" ] || [ "$(IMAGE)" = "redos-arm64" ]; then \
|
||||||
|
PLATFORMS="linux/amd64,linux/arm64"; \
|
||||||
|
echo ""; \
|
||||||
|
echo "=========================================="; \
|
||||||
|
echo "🔨 СБОРКА ОБРАЗА: $(DOCKER_REGISTRY):$(IMAGE)-$$TAG"; \
|
||||||
|
echo "📋 Платформы: $$PLATFORMS (AMD64 + ARM64)"; \
|
||||||
|
echo "📋 Тег: $$TAG"; \
|
||||||
|
echo "📋 Registry: $(DOCKER_REGISTRY)"; \
|
||||||
|
echo "⚠️ ВНИМАНИЕ: Совместимый образ с поддержкой ARM64"; \
|
||||||
|
echo "=========================================="; \
|
||||||
else \
|
else \
|
||||||
PLATFORMS="$(DOCKER_PLATFORMS)"; \
|
PLATFORMS="$(DOCKER_PLATFORMS)"; \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
@@ -948,6 +1024,25 @@ docker-build-image:
|
|||||||
echo "=========================================="; \
|
echo "=========================================="; \
|
||||||
fi; \
|
fi; \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
|
if [ "$(IMAGE)" = "astra-linux-arm64" ]; then \
|
||||||
|
cd dockerfiles/astra-linux && \
|
||||||
|
docker buildx build \
|
||||||
|
--platform $$PLATFORMS \
|
||||||
|
--tag $(DOCKER_REGISTRY):$(IMAGE)-$$TAG \
|
||||||
|
--tag $(DOCKER_REGISTRY):$(IMAGE)-latest \
|
||||||
|
--file Dockerfile.arm64 \
|
||||||
|
--push \
|
||||||
|
.; \
|
||||||
|
elif [ "$(IMAGE)" = "redos-arm64" ]; then \
|
||||||
|
cd dockerfiles/redos && \
|
||||||
|
docker buildx build \
|
||||||
|
--platform $$PLATFORMS \
|
||||||
|
--tag $(DOCKER_REGISTRY):$(IMAGE)-$$TAG \
|
||||||
|
--tag $(DOCKER_REGISTRY):$(IMAGE)-latest \
|
||||||
|
--file Dockerfile.arm64 \
|
||||||
|
--push \
|
||||||
|
.; \
|
||||||
|
else \
|
||||||
cd dockerfiles/$(IMAGE) && \
|
cd dockerfiles/$(IMAGE) && \
|
||||||
docker buildx build \
|
docker buildx build \
|
||||||
--platform $$PLATFORMS \
|
--platform $$PLATFORMS \
|
||||||
@@ -955,6 +1050,7 @@ docker-build-image:
|
|||||||
--tag $(DOCKER_REGISTRY):$(IMAGE)-latest \
|
--tag $(DOCKER_REGISTRY):$(IMAGE)-latest \
|
||||||
--push \
|
--push \
|
||||||
.; \
|
.; \
|
||||||
|
fi; \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
echo "✅ УСПЕШНО: $(DOCKER_REGISTRY):$(IMAGE)-$$TAG собран и отправлен"; \
|
echo "✅ УСПЕШНО: $(DOCKER_REGISTRY):$(IMAGE)-$$TAG собран и отправлен"; \
|
||||||
echo "=========================================="
|
echo "=========================================="
|
||||||
@@ -1022,12 +1118,426 @@ controller:
|
|||||||
echo " 💡 Удаляет: контейнеры и сети";; \
|
echo " 💡 Удаляет: контейнеры и сети";; \
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# КОМАНДЫ ДЛЯ РАБОТЫ С KUBERNETES KIND
|
||||||
|
# =============================================================================
|
||||||
|
k8s:
|
||||||
|
@case "$(word 2, $(MAKECMDGOALS))" in \
|
||||||
|
create) \
|
||||||
|
echo "☸️ Создание Kind кластера..."; \
|
||||||
|
PRESET_ARG="$(word 3, $(MAKECMDGOALS))"; \
|
||||||
|
if [ -z "$$PRESET_ARG" ]; then \
|
||||||
|
PRESET=k8s-minimal; \
|
||||||
|
echo "📋 Используется preset по умолчанию: $$PRESET (минимальный без аддонов)"; \
|
||||||
|
else \
|
||||||
|
PRESET=$$PRESET_ARG; \
|
||||||
|
echo "📋 Используется preset: $$PRESET"; \
|
||||||
|
fi; \
|
||||||
|
if [ ! -f "molecule/presets/k8s/$$PRESET.yml" ]; then \
|
||||||
|
echo "❌ Ошибка: Пресет '$$PRESET' не найден!"; \
|
||||||
|
echo "💡 Доступные пресеты:"; \
|
||||||
|
ls -1 molecule/presets/k8s/*.yml 2>/dev/null | sed 's|molecule/presets/k8s/||g' | sed 's|\.yml||g' | sed 's/^/ - /' || echo " - k8s-minimal"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
CONTAINER_NAME=k8s-controller; \
|
||||||
|
docker run -d --name $$CONTAINER_NAME --rm \
|
||||||
|
-v "$(PWD):/workspace" -w /workspace \
|
||||||
|
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||||
|
-u root \
|
||||||
|
-e ANSIBLE_FORCE_COLOR=1 \
|
||||||
|
-e MOLECULE_PRESET=$$PRESET \
|
||||||
|
-e MOLECULE_EPHEMERAL_DIRECTORY=/tmp/molecule_workspace \
|
||||||
|
$(DOCKER_K8S_IMAGE) \
|
||||||
|
/bin/bash -c 'sleep infinity'; \
|
||||||
|
echo "🚀 Запуск создания кластера..."; \
|
||||||
|
docker exec $$CONTAINER_NAME bash -c "cd /workspace && python3 /workspace/scripts/create_k8s_cluster.py molecule/presets/k8s/$$PRESET.yml $$CONTAINER_NAME"; \
|
||||||
|
echo "✅ Kind кластер создан"; \
|
||||||
|
echo "💡 Для создания port-forward: make k8s portforward create"; \
|
||||||
|
echo "💡 Для подключения используйте: make k8s kubeconfig"; \
|
||||||
|
echo "💡 Для остановки используйте: make k8s stop";; \
|
||||||
|
destroy) \
|
||||||
|
echo "🗑️ Удаление Kind кластера и контейнеров..."; \
|
||||||
|
PRESET_ARG="$(word 3, $(MAKECMDGOALS))"; \
|
||||||
|
PRESET=$${PRESET_ARG:-k8s-minimal}; \
|
||||||
|
CONTAINER_NAME=k8s-controller; \
|
||||||
|
if docker ps | grep -q $$CONTAINER_NAME; then \
|
||||||
|
echo "🗑️ Удаление Kind кластеров..."; \
|
||||||
|
docker exec $$CONTAINER_NAME bash -c "kind delete clusters --all" 2>/dev/null || true; \
|
||||||
|
else \
|
||||||
|
echo "⚠️ Контейнер $$CONTAINER_NAME не запущен"; \
|
||||||
|
fi; \
|
||||||
|
docker rm -f $$CONTAINER_NAME 2>/dev/null || true; \
|
||||||
|
echo "🗑️ Удаление контейнеров из пресета..."; \
|
||||||
|
if [ -f "molecule/presets/k8s/$$PRESET.yml" ]; then \
|
||||||
|
if docker ps | grep -q $$CONTAINER_NAME; then \
|
||||||
|
docker exec $$CONTAINER_NAME bash -c "python3 /workspace/scripts/delete_hosts.py /workspace/molecule/presets/k8s/$$PRESET.yml" 2>/dev/null || true; \
|
||||||
|
else \
|
||||||
|
python3 scripts/delete_hosts.py molecule/presets/k8s/$$PRESET.yml 2>/dev/null || true; \
|
||||||
|
fi; \
|
||||||
|
fi; \
|
||||||
|
echo "✅ Удаление завершено";; \
|
||||||
|
stop) \
|
||||||
|
echo "🛑 Остановка Kind кластера..."; \
|
||||||
|
PRESET_ARG="$(word 3, $(MAKECMDGOALS))"; \
|
||||||
|
if [ -z "$$PRESET_ARG" ]; then \
|
||||||
|
echo "❌ Ошибка: Укажите пресет"; \
|
||||||
|
echo "💡 Пример: make k8s stop kubernetes"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
CONTAINER_NAME=k8s-controller; \
|
||||||
|
if docker ps | grep -q $$CONTAINER_NAME; then \
|
||||||
|
docker exec $$CONTAINER_NAME bash -c "kind get clusters | xargs -I {} kind stop cluster --name {}" 2>/dev/null || true; \
|
||||||
|
echo "✅ Kind кластер остановлен"; \
|
||||||
|
else \
|
||||||
|
echo "⚠️ Контейнер $$CONTAINER_NAME не запущен"; \
|
||||||
|
fi; \
|
||||||
|
echo "💡 Кластер остановлен, но не удален"; \
|
||||||
|
echo "💡 Для перезапуска: make k8s start $$PRESET_ARG"; \
|
||||||
|
echo "💡 Для полного удаления: make k8s destroy $$PRESET_ARG";; \
|
||||||
|
start) \
|
||||||
|
echo "🚀 Запуск Kind кластера..."; \
|
||||||
|
PRESET_ARG="$(word 3, $(MAKECMDGOALS))"; \
|
||||||
|
if [ -z "$$PRESET_ARG" ]; then \
|
||||||
|
echo "❌ Ошибка: Укажите пресет"; \
|
||||||
|
echo "💡 Пример: make k8s start kubernetes"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
CONTAINER_NAME=k8s-controller; \
|
||||||
|
if ! docker ps | grep -q $$CONTAINER_NAME; then \
|
||||||
|
echo "❌ Контейнер $$CONTAINER_NAME не запущен"; \
|
||||||
|
echo "💡 Запустите: make k8s create $$PRESET_ARG"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
docker exec $$CONTAINER_NAME bash -c "kind get clusters | xargs -I {} kind start cluster --name {}" 2>/dev/null || true; \
|
||||||
|
echo "✅ Kind кластер запущен";; \
|
||||||
|
status) \
|
||||||
|
echo "📊 Детальный отчет о состоянии кластера..."; \
|
||||||
|
PRESET_ARG="$(word 3, $(MAKECMDGOALS))"; \
|
||||||
|
if [ -z "$$PRESET_ARG" ]; then \
|
||||||
|
echo "❌ Ошибка: Укажите пресет"; \
|
||||||
|
echo "💡 Пример: make k8s status kubernetes"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
CONTAINER_NAME=k8s-controller; \
|
||||||
|
if docker ps | grep -q $$CONTAINER_NAME; then \
|
||||||
|
python3 scripts/k8s_status.py; \
|
||||||
|
else \
|
||||||
|
echo "⚠️ Контейнер $$CONTAINER_NAME не запущен"; \
|
||||||
|
echo "💡 Запустите: make k8s create $$PRESET_ARG"; \
|
||||||
|
fi;; \
|
||||||
|
config) \
|
||||||
|
echo "📋 Получение kubeconfig..."; \
|
||||||
|
PRESET_ARG="$(word 3, $(MAKECMDGOALS))"; \
|
||||||
|
if [ -z "$$PRESET_ARG" ]; then \
|
||||||
|
echo "❌ Ошибка: Укажите пресет"; \
|
||||||
|
echo "💡 Пример: make k8s config kubernetes"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
CONTAINER_NAME=k8s-controller; \
|
||||||
|
if ! docker ps | grep -q $$CONTAINER_NAME; then \
|
||||||
|
echo "❌ Контейнер $$CONTAINER_NAME не запущен"; \
|
||||||
|
echo "💡 Запустите: make k8s create $$PRESET_ARG"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
KUBECONFIG_FILE="$$(pwd)/kubeconfig"; \
|
||||||
|
docker exec $$CONTAINER_NAME bash -c "kind get kubeconfig" > $$KUBECONFIG_FILE 2>/dev/null || true; \
|
||||||
|
if [ -f $$KUBECONFIG_FILE ] && [ -s $$KUBECONFIG_FILE ]; then \
|
||||||
|
echo "✅ kubeconfig сохранен в: $$KUBECONFIG_FILE"; \
|
||||||
|
echo ""; \
|
||||||
|
echo "💡 Для использования:"; \
|
||||||
|
echo " export KUBECONFIG=$$KUBECONFIG_FILE"; \
|
||||||
|
echo " kubectl get nodes"; \
|
||||||
|
echo ""; \
|
||||||
|
echo "💡 Или для однократного использования:"; \
|
||||||
|
echo " kubectl --kubeconfig=$$KUBECONFIG_FILE get nodes"; \
|
||||||
|
else \
|
||||||
|
echo "❌ Не удалось получить kubeconfig"; \
|
||||||
|
rm -f $$KUBECONFIG_FILE; \
|
||||||
|
fi;; \
|
||||||
|
nodes) \
|
||||||
|
echo "🖥️ Просмотр узлов кластера..."; \
|
||||||
|
PRESET_ARG="$(word 3, $(MAKECMDGOALS))"; \
|
||||||
|
if [ -z "$$PRESET_ARG" ]; then \
|
||||||
|
echo "❌ Ошибка: Укажите пресет"; \
|
||||||
|
echo "💡 Пример: make k8s nodes kubernetes"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
CONTAINER_NAME=k8s-controller; \
|
||||||
|
if ! docker ps | grep -q $$CONTAINER_NAME; then \
|
||||||
|
echo "❌ Контейнер $$CONTAINER_NAME не запущен"; \
|
||||||
|
echo "💡 Запустите: make k8s create $$PRESET_ARG"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
CLUSTER_NAME=$$(docker exec $$CONTAINER_NAME kind get clusters | head -1); \
|
||||||
|
docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; kubectl --server=https://\$${CLUSTER_NAME}-control-plane:6443 --insecure-skip-tls-verify get nodes";; \
|
||||||
|
shell) \
|
||||||
|
echo "🐚 Открытие shell в контейнере..."; \
|
||||||
|
PRESET_ARG="$(word 3, $(MAKECMDGOALS))"; \
|
||||||
|
if [ -z "$$PRESET_ARG" ]; then \
|
||||||
|
echo "❌ Ошибка: Укажите пресет"; \
|
||||||
|
echo "💡 Пример: make k8s shell kubernetes"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
CONTAINER_NAME=k8s-controller; \
|
||||||
|
if docker ps | grep -q $$CONTAINER_NAME; then \
|
||||||
|
docker exec -it $$CONTAINER_NAME bash; \
|
||||||
|
else \
|
||||||
|
echo "❌ Контейнер $$CONTAINER_NAME не запущен"; \
|
||||||
|
echo "💡 Запустите: make k8s create $$PRESET_ARG"; \
|
||||||
|
fi;; \
|
||||||
|
manifest) \
|
||||||
|
echo "📄 Работа с манифестами..."; \
|
||||||
|
MANIFEST_CMD="$(word 3, $(MAKECMDGOALS))"; \
|
||||||
|
PRESET_ARG="$(word 4, $(MAKECMDGOALS))"; \
|
||||||
|
MANIFEST_ARG="$(word 5, $(MAKECMDGOALS))"; \
|
||||||
|
if [ -z "$$MANIFEST_CMD" ] || [ -z "$$PRESET_ARG" ] || [ -z "$$MANIFEST_ARG" ]; then \
|
||||||
|
echo "❌ Ошибка: Укажите команду, пресет и путь к манифесту"; \
|
||||||
|
echo "💡 Пример: make k8s manifest apply kubernetes https://example.com/manifest.yaml"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
CONTAINER_NAME=k8s-controller; \
|
||||||
|
if ! docker ps | grep -q $$CONTAINER_NAME; then \
|
||||||
|
echo "❌ Контейнер $$CONTAINER_NAME не запущен"; \
|
||||||
|
echo "💡 Запустите: make k8s create $$PRESET_ARG"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
CLUSTER_NAME=$$(docker exec $$CONTAINER_NAME kind get clusters | head -1); \
|
||||||
|
case "$$MANIFEST_CMD" in \
|
||||||
|
apply) \
|
||||||
|
echo "📥 Применение манифеста: $$MANIFEST_ARG"; \
|
||||||
|
docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; kubectl --server=https://\$${CLUSTER_NAME}-control-plane:6443 --insecure-skip-tls-verify apply -f $$MANIFEST_ARG";; \
|
||||||
|
delete) \
|
||||||
|
echo "🗑️ Удаление ресурсов из манифеста: $$MANIFEST_ARG"; \
|
||||||
|
docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; kubectl --server=https://\$${CLUSTER_NAME}-control-plane:6443 --insecure-skip-tls-verify delete -f $$MANIFEST_ARG";; \
|
||||||
|
*) \
|
||||||
|
echo "❌ Неизвестная команда: $$MANIFEST_CMD"; \
|
||||||
|
echo "💡 Доступные команды: apply, delete"; \
|
||||||
|
exit 1;; \
|
||||||
|
esac;; \
|
||||||
|
helm) \
|
||||||
|
echo "📦 Работа с Helm..."; \
|
||||||
|
HELM_CMD="$(word 3, $(MAKECMDGOALS))"; \
|
||||||
|
PRESET_ARG="$(word 4, $(MAKECMDGOALS))"; \
|
||||||
|
RELEASE_ARG="$(word 5, $(MAKECMDGOALS))"; \
|
||||||
|
CHART_ARG="$(word 6, $(MAKECMDGOALS))"; \
|
||||||
|
if [ -z "$$HELM_CMD" ] || [ -z "$$PRESET_ARG" ]; then \
|
||||||
|
echo "❌ Ошибка: Укажите команду и пресет"; \
|
||||||
|
echo "💡 Пример: make k8s helm list kubernetes"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
CONTAINER_NAME=k8s-controller; \
|
||||||
|
if ! docker ps | grep -q $$CONTAINER_NAME; then \
|
||||||
|
echo "❌ Контейнер $$CONTAINER_NAME не запущен"; \
|
||||||
|
echo "💡 Запустите: make k8s create $$PRESET_ARG"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
CLUSTER_NAME=$$(docker exec $$CONTAINER_NAME kind get clusters | head -1); \
|
||||||
|
case "$$HELM_CMD" in \
|
||||||
|
apply) \
|
||||||
|
if [ -z "$$RELEASE_ARG" ] || [ -z "$$CHART_ARG" ]; then \
|
||||||
|
echo "❌ Ошибка: Укажите имя релиза и чарт"; \
|
||||||
|
echo "💡 Пример: make k8s helm apply kubernetes my-release stable/nginx-ingress"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
echo "📦 Установка Helm чарта: $$CHART_ARG как $$RELEASE_ARG"; \
|
||||||
|
docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm upgrade --install $$RELEASE_ARG $$CHART_ARG --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy 2>&1 | grep -v '^WARNING' || true";; \
|
||||||
|
delete) \
|
||||||
|
if [ -z "$$RELEASE_ARG" ]; then \
|
||||||
|
echo "❌ Ошибка: Укажите имя релиза"; \
|
||||||
|
echo "💡 Пример: make k8s helm delete kubernetes my-release"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
echo "🗑️ Удаление Helm релиза: $$RELEASE_ARG"; \
|
||||||
|
docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm uninstall $$RELEASE_ARG --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy 2>&1 | grep -v '^WARNING' || true";; \
|
||||||
|
update) \
|
||||||
|
if [ -z "$$RELEASE_ARG" ] || [ -z "$$CHART_ARG" ]; then \
|
||||||
|
echo "❌ Ошибка: Укажите имя релиза и чарт"; \
|
||||||
|
echo "💡 Пример: make k8s helm update kubernetes my-release stable/nginx-ingress"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
echo "🔄 Обновление Helm релиза: $$RELEASE_ARG"; \
|
||||||
|
docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm upgrade $$RELEASE_ARG $$CHART_ARG --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy 2>&1 | grep -v '^WARNING' || true";; \
|
||||||
|
rollback) \
|
||||||
|
if [ -z "$$RELEASE_ARG" ]; then \
|
||||||
|
echo "❌ Ошибка: Укажите имя релиза"; \
|
||||||
|
echo "💡 Пример: make k8s helm rollback kubernetes my-release"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
echo "⏪ Откат Helm релиза: $$RELEASE_ARG"; \
|
||||||
|
docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm rollback $$RELEASE_ARG --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy 2>&1 | grep -v '^WARNING' || true";; \
|
||||||
|
list) \
|
||||||
|
echo "📋 Список Helm релизов:"; \
|
||||||
|
docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm list --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy --all-namespaces 2>&1 | grep -v '^WARNING' || true";; \
|
||||||
|
status) \
|
||||||
|
if [ -z "$$RELEASE_ARG" ]; then \
|
||||||
|
echo "❌ Ошибка: Укажите имя релиза"; \
|
||||||
|
echo "💡 Пример: make k8s helm status kubernetes my-release"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
echo "📊 Статус Helm релиза: $$RELEASE_ARG"; \
|
||||||
|
docker exec $$CONTAINER_NAME bash -c "CLUSTER_NAME=$$CLUSTER_NAME; helm status $$RELEASE_ARG --kube-apiserver=https://\$${CLUSTER_NAME}-control-plane:6443 --kube-token=dummy --kube-context=dummy 2>&1 | grep -v '^WARNING' || true";; \
|
||||||
|
*) \
|
||||||
|
echo "❌ Неизвестная команда: $$HELM_CMD"; \
|
||||||
|
echo "💡 Доступные команды: apply, delete, update, rollback, list, status"; \
|
||||||
|
exit 1;; \
|
||||||
|
esac;; \
|
||||||
|
helmrepo) \
|
||||||
|
echo "🏪 Работа с Helm репозиториями..."; \
|
||||||
|
REPO_CMD="$(word 3, $(MAKECMDGOALS))"; \
|
||||||
|
PRESET_ARG="$(word 4, $(MAKECMDGOALS))"; \
|
||||||
|
NAME_ARG="$(word 5, $(MAKECMDGOALS))"; \
|
||||||
|
URL_ARG="$(word 6, $(MAKECMDGOALS))"; \
|
||||||
|
if [ -z "$$REPO_CMD" ] || [ -z "$$PRESET_ARG" ]; then \
|
||||||
|
echo "❌ Ошибка: Укажите команду и пресет"; \
|
||||||
|
echo "💡 Пример: make k8s helmrepo list kubernetes"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
CONTAINER_NAME=k8s-controller; \
|
||||||
|
if ! docker ps | grep -q $$CONTAINER_NAME; then \
|
||||||
|
echo "❌ Контейнер $$CONTAINER_NAME не запущен"; \
|
||||||
|
echo "💡 Запустите: make k8s create $$PRESET_ARG"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
case "$$REPO_CMD" in \
|
||||||
|
add) \
|
||||||
|
if [ -z "$$NAME_ARG" ] || [ -z "$$URL_ARG" ]; then \
|
||||||
|
echo "❌ Ошибка: Укажите имя и URL репозитория"; \
|
||||||
|
echo "💡 Пример: make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
echo "➕ Добавление Helm репозитория: $$NAME_ARG"; \
|
||||||
|
docker exec $$CONTAINER_NAME bash -c "helm repo add $$NAME_ARG $$URL_ARG 2>&1 | grep -v '^WARNING' || true; helm repo update";; \
|
||||||
|
list) \
|
||||||
|
echo "📋 Список Helm репозиториев:"; \
|
||||||
|
docker exec $$CONTAINER_NAME bash -c "helm repo list 2>&1 | grep -v '^WARNING' || true";; \
|
||||||
|
delete) \
|
||||||
|
if [ -z "$$NAME_ARG" ]; then \
|
||||||
|
echo "❌ Ошибка: Укажите имя репозитория"; \
|
||||||
|
echo "💡 Пример: make k8s helmrepo delete kubernetes stable"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
echo "🗑️ Удаление Helm репозитория: $$NAME_ARG"; \
|
||||||
|
docker exec $$CONTAINER_NAME bash -c "helm repo remove $$NAME_ARG 2>&1 | grep -v '^WARNING' || true";; \
|
||||||
|
update) \
|
||||||
|
echo "🔄 Обновление Helm репозиториев"; \
|
||||||
|
docker exec $$CONTAINER_NAME bash -c "helm repo update 2>&1 | grep -v '^WARNING' || true";; \
|
||||||
|
packages) \
|
||||||
|
if [ -z "$$NAME_ARG" ]; then \
|
||||||
|
echo "❌ Ошибка: Укажите имя репозитория"; \
|
||||||
|
echo "💡 Пример: make k8s helmrepo packages kubernetes stable"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
echo "📦 Пакеты в репозитории: $$NAME_ARG"; \
|
||||||
|
docker exec $$CONTAINER_NAME bash -c "helm search repo $$NAME_ARG 2>&1 | grep -v '^WARNING' || true";; \
|
||||||
|
*) \
|
||||||
|
echo "❌ Неизвестная команда: $$REPO_CMD"; \
|
||||||
|
echo "💡 Доступные команды: add, list, delete, update, packages"; \
|
||||||
|
exit 1;; \
|
||||||
|
esac;; \
|
||||||
|
portforward) \
|
||||||
|
PORTFWD_CMD="$(word 3, $(MAKECMDGOALS))"; \
|
||||||
|
PORT_ARG="$(word 4, $(MAKECMDGOALS))"; \
|
||||||
|
if [ -z "$$PORTFWD_CMD" ]; then \
|
||||||
|
echo "❌ Ошибка: Укажите команду"; \
|
||||||
|
echo "💡 Пример: make k8s portforward create"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
case "$$PORTFWD_CMD" in \
|
||||||
|
create) \
|
||||||
|
echo "🔌 Создание port-forward..."; \
|
||||||
|
python3 scripts/portforward.py create;; \
|
||||||
|
list) \
|
||||||
|
echo "📋 Список активных port-forward..."; \
|
||||||
|
python3 scripts/portforward.py list;; \
|
||||||
|
clear) \
|
||||||
|
echo "🗑️ Очистка всех port-forward..."; \
|
||||||
|
python3 scripts/portforward.py clear;; \
|
||||||
|
recreate) \
|
||||||
|
echo "🔄 Пересоздание port-forward..."; \
|
||||||
|
python3 scripts/portforward.py recreate;; \
|
||||||
|
delete) \
|
||||||
|
if [ -z "$$PORT_ARG" ]; then \
|
||||||
|
echo "❌ Ошибка: Укажите порт"; \
|
||||||
|
echo "💡 Пример: make k8s portforward delete 3000"; \
|
||||||
|
exit 1; \
|
||||||
|
fi; \
|
||||||
|
echo "🗑️ Удаление port-forward на порту $$PORT_ARG..."; \
|
||||||
|
python3 scripts/portforward.py delete $$PORT_ARG;; \
|
||||||
|
*) \
|
||||||
|
echo "❌ Неизвестная команда: $$PORTFWD_CMD"; \
|
||||||
|
echo "💡 Доступные команды: create, list, clear, recreate, delete"; \
|
||||||
|
exit 1;; \
|
||||||
|
esac;; \
|
||||||
|
*) \
|
||||||
|
echo "☸️ Доступные команды:"; \
|
||||||
|
echo ""; \
|
||||||
|
echo " make k8s create [preset] - создать Kind кластер"; \
|
||||||
|
echo " 💡 Без параметра: используется k8s-minimal (без аддонов)"; \
|
||||||
|
echo " 💡 С параметром: используется указанный пресет"; \
|
||||||
|
echo " 💡 Кластер НЕ удаляется автоматически"; \
|
||||||
|
echo ""; \
|
||||||
|
echo " make k8s destroy [preset] - удалить Kind кластер полностью"; \
|
||||||
|
echo " 💡 Удалит: кластер и контейнер ansible-controller"; \
|
||||||
|
echo ""; \
|
||||||
|
echo " make k8s stop [cluster] - остановить Kind кластер (без удаления)"; \
|
||||||
|
echo " 💡 Можно указать имя кластера или остановить все"; \
|
||||||
|
echo " 💡 Для перезапуска: make k8s start"; \
|
||||||
|
echo ""; \
|
||||||
|
echo " make k8s start [cluster] - запустить остановленный кластер"; \
|
||||||
|
echo " 💡 Можно указать имя кластера или запустить все"; \
|
||||||
|
echo ""; \
|
||||||
|
echo " make k8s status [preset] - детальный отчет о состоянии кластера"; \
|
||||||
|
echo " 💡 Показывает: узлы, pods, сервисы, Ingress, события, Helm релизы и т.д."; \
|
||||||
|
echo " 💡 Требует: пресет"; \
|
||||||
|
echo " 💡 Пример: make k8s status kubernetes"; \
|
||||||
|
echo ""; \
|
||||||
|
echo " make k8s config [cluster] - получить kubeconfig для подключения"; \
|
||||||
|
echo " 💡 Сохраняет: kubeconfig в корне проекта"; \
|
||||||
|
echo " 💡 Можно указать имя конкретного кластера"; \
|
||||||
|
echo ""; \
|
||||||
|
echo " make k8s nodes [preset] - показать узлы кластера"; \
|
||||||
|
echo " 💡 Требует: пресет"; \
|
||||||
|
echo " 💡 Пример: make k8s nodes kubernetes"; \
|
||||||
|
echo ""; \
|
||||||
|
echo " make k8s shell [preset] - открыть shell в контейнере"; \
|
||||||
|
echo " 💡 Для: ручного управления kubectl/kind"; \
|
||||||
|
echo " 💡 Пример: make k8s shell kubernetes"; \
|
||||||
|
echo ""; \
|
||||||
|
echo " make k8s manifest [cmd] [preset] [url] - работа с манифестами"; \
|
||||||
|
echo " 💡 Команды: apply, delete"; \
|
||||||
|
echo " 💡 Пример: make k8s manifest apply kubernetes https://example.com/deploy.yaml"; \
|
||||||
|
echo ""; \
|
||||||
|
echo " make k8s helm [cmd] [preset] [release] [chart] - работа с Helm"; \
|
||||||
|
echo " 💡 Команды: apply, delete, update, rollback, list, status"; \
|
||||||
|
echo " 💡 Пример: make k8s helm apply kubernetes nginx stable/nginx-ingress"; \
|
||||||
|
echo ""; \
|
||||||
|
echo " make k8s helmrepo [cmd] [preset] [name] [url] - работа с Helm репозиториями"; \
|
||||||
|
echo " 💡 Команды: add, list, delete, update, packages"; \
|
||||||
|
echo " 💡 Пример: make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable"; \
|
||||||
|
echo ""; \
|
||||||
|
echo " make k8s portforward [cmd] - управление port-forward"; \
|
||||||
|
echo " 💡 Команды: create, list, clear, recreate, delete [port]"; \
|
||||||
|
echo " 💡 Пример: make k8s portforward create"; \
|
||||||
|
echo ""; \
|
||||||
|
echo "💡 Примеры:"; \
|
||||||
|
echo " make k8s create # создать минимальный кластер"; \
|
||||||
|
echo " make k8s create kubernetes # создать кластер с аддонами"; \
|
||||||
|
echo " make k8s nodes kubernetes # показать узлы кластера"; \
|
||||||
|
echo " make k8s config kubernetes # получить kubeconfig для кластера"; \
|
||||||
|
echo " export KUBECONFIG=kubeconfig # использовать конфиг"; \
|
||||||
|
echo " kubectl get nodes # проверить узлы"; \
|
||||||
|
echo " make k8s manifest apply kubernetes https://example.com/manifest.yaml # установить манифест"; \
|
||||||
|
echo " make k8s stop kubernetes # остановить кластер"; \
|
||||||
|
echo " make k8s start kubernetes # запустить кластер"; \
|
||||||
|
echo " make k8s destroy kubernetes # удалить кластер с пресетом kubernetes";; \
|
||||||
|
esac
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# СПРАВКА
|
# СПРАВКА
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
help:
|
help:
|
||||||
@echo "=========================================="
|
@echo "=========================================="
|
||||||
@echo "AnsibleLab - Универсальная система"
|
@echo "DevOpsLab - Универсальная система"
|
||||||
@echo "тестирования Ansible ролей"
|
@echo "тестирования Ansible ролей"
|
||||||
@echo "=========================================="
|
@echo "=========================================="
|
||||||
@echo ""
|
@echo ""
|
||||||
@@ -1063,7 +1573,7 @@ help:
|
|||||||
@echo " make presets info - подробная информация о preset'е"
|
@echo " make presets info - подробная информация о preset'е"
|
||||||
@echo " make presets test - запустить тест с preset'ом"
|
@echo " make presets test - запустить тест с preset'ом"
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo "🖼️ СОБСТВЕННЫЕ ОБРАЗЫ (AnsibleLab):"
|
@echo "🖼️ СОБСТВЕННЫЕ ОБРАЗЫ (DevOpsLab):"
|
||||||
@echo " make custom-images test [minimal|full|performance] - тест с собственными образами"
|
@echo " make custom-images test [minimal|full|performance] - тест с собственными образами"
|
||||||
@echo " make custom-images check - проверить наличие собственных образов"
|
@echo " make custom-images check - проверить наличие собственных образов"
|
||||||
@echo " make custom-images build - собрать все образы для тестирования"
|
@echo " make custom-images build - собрать все образы для тестирования"
|
||||||
@@ -1115,6 +1625,20 @@ help:
|
|||||||
@echo " make controller run - запустить ansible-controller"
|
@echo " make controller run - запустить ansible-controller"
|
||||||
@echo " make controller stop - остановить ansible-controller"
|
@echo " make controller stop - остановить ansible-controller"
|
||||||
@echo ""
|
@echo ""
|
||||||
|
@echo "☸️ KUBERNETES (Kind кластеры):"
|
||||||
|
@echo " make k8s create [preset] - создать Kind кластер (по умолчанию: k8s-minimal)"
|
||||||
|
@echo " make k8s destroy [preset] - удалить Kind кластер"
|
||||||
|
@echo " make k8s start [preset] - запустить Kind кластер"
|
||||||
|
@echo " make k8s stop [preset] - остановить Kind кластер"
|
||||||
|
@echo " make k8s status [preset] - детальный отчет о состоянии кластера"
|
||||||
|
@echo " make k8s nodes [preset] - показать узлы кластера"
|
||||||
|
@echo " make k8s config [preset] - получить kubeconfig для подключения"
|
||||||
|
@echo " make k8s manifest [cmd] [preset] [url] - работа с манифестами (apply, delete)"
|
||||||
|
@echo " make k8s helm [cmd] [preset] [release] [chart] - работа с Helm"
|
||||||
|
@echo " make k8s helmrepo [cmd] [preset] [name] [url] - управление Helm репозиториями"
|
||||||
|
@echo " make k8s portforward [cmd] - управление port-forward (create, list, clear)"
|
||||||
|
@echo " make k8s shell [preset] - открыть shell в контейнере k8s"
|
||||||
|
@echo ""
|
||||||
@echo "💡 ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ:"
|
@echo "💡 ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ:"
|
||||||
@echo " make presets list # показать все preset'ы"
|
@echo " make presets list # показать все preset'ы"
|
||||||
@echo " make presets test PRESET=etcd-patroni # тест с etcd-patroni"
|
@echo " make presets test PRESET=etcd-patroni # тест с etcd-patroni"
|
||||||
@@ -1140,7 +1664,7 @@ help:
|
|||||||
custom-images:
|
custom-images:
|
||||||
@case "$(word 2, $(MAKECMDGOALS))" in \
|
@case "$(word 2, $(MAKECMDGOALS))" in \
|
||||||
test) \
|
test) \
|
||||||
echo "🧪 Тестирование с собственными образами AnsibleLab..."; \
|
echo "🧪 Тестирование с собственными образами DevOpsLab..."; \
|
||||||
if [ -z "$(word 3, $(MAKECMDGOALS))" ]; then \
|
if [ -z "$(word 3, $(MAKECMDGOALS))" ]; then \
|
||||||
echo "💡 Использование: make custom-images test [minimal|full|performance]"; \
|
echo "💡 Использование: make custom-images test [minimal|full|performance]"; \
|
||||||
echo "💡 По умолчанию: minimal"; \
|
echo "💡 По умолчанию: minimal"; \
|
||||||
@@ -1168,7 +1692,7 @@ custom-images:
|
|||||||
echo ""; \
|
echo ""; \
|
||||||
echo " 🔨 make custom-images build - собрать все образы для тестирования"; \
|
echo " 🔨 make custom-images build - собрать все образы для тестирования"; \
|
||||||
echo " 💡 Выполняет: make docker build"; \
|
echo " 💡 Выполняет: make docker build"; \
|
||||||
echo " 💡 Собирает: все образы AnsibleLab"; \
|
echo " 💡 Собирает: все образы DevOpsLab"; \
|
||||||
echo ""; \
|
echo ""; \
|
||||||
echo "💡 Пресеты для тестирования:"; \
|
echo "💡 Пресеты для тестирования:"; \
|
||||||
echo " - custom-minimal.yml - минимальный тест (4 хоста)"; \
|
echo " - custom-minimal.yml - минимальный тест (4 хоста)"; \
|
||||||
|
|||||||
233
README.md
233
README.md
@@ -2,20 +2,42 @@
|
|||||||
|
|
||||||
**Автор:** Сергей Антропов
|
**Автор:** Сергей Антропов
|
||||||
**Сайт:** https://devops.org.ru
|
**Сайт:** https://devops.org.ru
|
||||||
**Версия:** 2.0.0
|
**Версия:** 3.0.0
|
||||||
|
|
||||||
## 📋 Описание
|
## 📋 Описание
|
||||||
|
|
||||||
DevOpsLab - это универсальная система для разработки, тестирования и развертывания Ansible ролей с использованием Docker, Molecule и preset конфигураций. Система поддерживает тестирование на различных ОС через Docker контейнеры.
|
DevOpsLab - это универсальная DevOps платформа для разработки, тестирования и развертывания инфраструктуры. Система объединяет Ansible роли, Docker контейнеры и Kubernetes кластеры в единую среду для автоматизации и управления инфраструктурой.
|
||||||
|
|
||||||
|
**Ключевые компоненты:**
|
||||||
|
- **Ansible** - автоматизация конфигурации и развертывания
|
||||||
|
- **Docker** - контейнеризация для изоляции и переносимости
|
||||||
|
- **Molecule** - тестирование Ansible ролей
|
||||||
|
- **Kubernetes (Kind)** - локальные K8s кластеры для разработки
|
||||||
|
- **Multi-arch поддержка** - сборка для amd64 и arm64 архитектур
|
||||||
|
|
||||||
## ✨ Ключевые возможности
|
## ✨ Ключевые возможности
|
||||||
|
|
||||||
|
### 🔧 Ansible
|
||||||
- **Тестирование ролей** через Molecule с Docker
|
- **Тестирование ролей** через Molecule с Docker
|
||||||
- **Preset система** для быстрого выбора окружений тестирования
|
- **Preset система** для быстрого выбора окружений тестирования
|
||||||
- **Мультиплатформенное тестирование** (Ubuntu, Debian, CentOS, AlmaLinux, RHEL и другие)
|
- **Мультиплатформенное тестирование** (Ubuntu, Debian, CentOS, AlmaLinux, RHEL, Alt Linux, Astra Linux и другие)
|
||||||
- **Автоматическая проверка** синтаксиса Ansible ролей
|
- **Автоматическая проверка** синтаксиса Ansible ролей
|
||||||
- **Управление секретами** через Ansible Vault
|
- **Управление секретами** через Ansible Vault
|
||||||
- **Готовые Docker образы** для разных ОС
|
- **Универсальная роль devops** для настройки пользователей и SSH ключей
|
||||||
|
- **Автоматическое определение ОС** и применение соответствующих конфигураций
|
||||||
|
|
||||||
|
### 🐳 Docker
|
||||||
|
- **Готовые Docker образы** для разных ОС с поддержкой systemd
|
||||||
|
- **Multi-arch сборка** (amd64, arm64)
|
||||||
|
- **Автоматическая публикация** в Docker Hub
|
||||||
|
- **Контейнеры для тестирования** Ansible ролей
|
||||||
|
|
||||||
|
### ☸️ Kubernetes
|
||||||
|
- **Kind кластеры** для локального тестирования
|
||||||
|
- **Автоматическая установка аддонов** (Istio, Prometheus, Grafana, Kiali, Ingress, Metrics Server)
|
||||||
|
- **Управление через Helm** и Kubernetes манифесты
|
||||||
|
- **Port-forward** для доступа к сервисам
|
||||||
|
- **Детальный мониторинг** состояния кластера
|
||||||
|
|
||||||
## 📁 Структура проекта
|
## 📁 Структура проекта
|
||||||
|
|
||||||
@@ -31,22 +53,65 @@ DevOpsLab/
|
|||||||
│ │ └── molecule.yml # Конфигурация Molecule
|
│ │ └── molecule.yml # Конфигурация Molecule
|
||||||
│ └── presets/ # Preset конфигурации
|
│ └── presets/ # Preset конфигурации
|
||||||
│ ├── default.yml # Стандартный preset
|
│ ├── default.yml # Стандартный preset
|
||||||
│ ├── minimal.yml # Минимальный preset
|
|
||||||
│ ├── mytest.yml # Кастомный preset
|
│ ├── mytest.yml # Кастомный preset
|
||||||
│ ├── presets.yml # Основные preset'ы
|
│ ├── examples/ # Примеры preset'ов
|
||||||
│ └── examples/ # Примеры preset'ов
|
│ │ ├── all-images.yml # Все образы (16 хостов)
|
||||||
│ ├── all-images.yml # Все образы (16 хостов)
|
│ │ ├── centos-all.yml # CentOS 7/8/9
|
||||||
│ ├── multi-os.yml # Multi-OS тестирование
|
│ │ ├── debian-all.yml # Debian 9/10/11/12
|
||||||
│ ├── performance.yml # Тест производительности
|
│ │ ├── ubuntu-all.yml # Ubuntu 20/22/24
|
||||||
│ ├── security.yml # Тест безопасности
|
│ │ ├── multi-os.yml # Multi-OS тестирование
|
||||||
│ └── ...
|
│ │ ├── performance.yml # Тест производительности
|
||||||
|
│ │ ├── security.yml # Тест безопасности
|
||||||
|
│ │ ├── minimal.yml # Минимальный preset
|
||||||
|
│ │ └── ...
|
||||||
|
│ └── k8s/ # Kubernetes preset'ы
|
||||||
|
│ ├── kubernetes.yml # Полный K8s кластер с аддонами
|
||||||
|
│ └── k8s-minimal.yml # Минимальный K8s кластер
|
||||||
├── roles/ # Ansible роли
|
├── roles/ # Ansible роли
|
||||||
│ ├── docker/ # Роль установки Docker
|
│ ├── docker/ # Роль установки Docker
|
||||||
|
│ │ ├── defaults/ # Переменные по умолчанию
|
||||||
|
│ │ ├── handlers/ # Обработчики
|
||||||
|
│ │ ├── meta/ # Метаданные
|
||||||
|
│ │ ├── tasks/ # Задачи
|
||||||
|
│ │ ├── templates/ # Шаблоны
|
||||||
|
│ │ ├── tests/ # Тесты
|
||||||
|
│ │ ├── vars/ # Переменные
|
||||||
|
│ │ ├── README.md
|
||||||
|
│ │ └── examples.yml
|
||||||
│ ├── devops/ # Роль DevOps инструментов
|
│ ├── devops/ # Роль DevOps инструментов
|
||||||
|
│ │ ├── defaults/
|
||||||
|
│ │ ├── files/
|
||||||
|
│ │ ├── handlers/
|
||||||
|
│ │ ├── meta/
|
||||||
|
│ │ ├── tasks/
|
||||||
|
│ │ ├── templates/
|
||||||
|
│ │ ├── tests/
|
||||||
|
│ │ ├── vars/
|
||||||
|
│ │ ├── README.md
|
||||||
|
│ │ ├── QUICKSTART.md
|
||||||
|
│ │ ├── examples.yml
|
||||||
|
│ │ └── playbook.yml
|
||||||
│ ├── ping/ # Роль для ping проверок
|
│ ├── ping/ # Роль для ping проверок
|
||||||
|
│ │ ├── defaults/
|
||||||
|
│ │ ├── handlers/
|
||||||
|
│ │ ├── meta/
|
||||||
|
│ │ ├── tasks/
|
||||||
|
│ │ ├── templates/
|
||||||
|
│ │ ├── README.md
|
||||||
|
│ │ ├── QUICKSTART.md
|
||||||
|
│ │ └── playbook.yml
|
||||||
│ └── deploy.yml # Playbook для развертывания
|
│ └── deploy.yml # Playbook для развертывания
|
||||||
├── dockerfiles/ # Docker образы
|
├── dockerfiles/ # Docker образы
|
||||||
│ ├── ansible-controller/ # Ansible контроллер
|
│ ├── 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
|
||||||
│ ├── ubuntu20/ # Ubuntu 20.04
|
│ ├── ubuntu20/ # Ubuntu 20.04
|
||||||
│ ├── ubuntu22/ # Ubuntu 22.04
|
│ ├── ubuntu22/ # Ubuntu 22.04
|
||||||
│ ├── ubuntu24/ # Ubuntu 24.04
|
│ ├── ubuntu24/ # Ubuntu 24.04
|
||||||
@@ -60,20 +125,53 @@ DevOpsLab/
|
|||||||
│ ├── alma/ # AlmaLinux 8
|
│ ├── alma/ # AlmaLinux 8
|
||||||
│ ├── rocky/ # Rocky Linux 8
|
│ ├── rocky/ # Rocky Linux 8
|
||||||
│ ├── rhel/ # RHEL 8
|
│ ├── rhel/ # RHEL 8
|
||||||
│ ├── alt9/ # ALT Linux P9
|
│ ├── alt-linux/ # ALT Linux P9
|
||||||
│ ├── astra-linux/ # Astra Linux 1.7
|
│ ├── astra-linux/ # Astra Linux 1.7
|
||||||
│ └── redos/ # RED OS 9
|
│ ├── redos/ # RED OS 9
|
||||||
|
│ └── README.md
|
||||||
├── cicd/ # CI/CD конфигурации
|
├── cicd/ # CI/CD конфигурации
|
||||||
│ ├── azure-devops/ # Azure DevOps
|
│ ├── azure-devops/ # Azure DevOps
|
||||||
|
│ │ └── azure-pipelines.yml
|
||||||
│ ├── github/ # GitHub Actions
|
│ ├── github/ # GitHub Actions
|
||||||
|
│ │ └── workflows.yml
|
||||||
│ ├── gitlab/ # GitLab CI
|
│ ├── gitlab/ # GitLab CI
|
||||||
|
│ │ ├── config.json
|
||||||
|
│ │ ├── docker-compose.yaml
|
||||||
|
│ │ └── runner/
|
||||||
|
│ │ └── config.toml
|
||||||
│ └── jenkins/ # Jenkins
|
│ └── jenkins/ # Jenkins
|
||||||
├── vault/ # Зашифрованные секреты
|
│ └── Jenkinsfile
|
||||||
├── inventory/ # Инвентори файлы
|
|
||||||
├── scripts/ # Вспомогательные скрипты
|
├── scripts/ # Вспомогательные скрипты
|
||||||
|
│ ├── create_k8s_cluster.py # Создание K8s кластера
|
||||||
|
│ ├── delete_hosts.py # Удаление хостов
|
||||||
|
│ ├── k8s_status.py # Статус K8s кластера
|
||||||
|
│ ├── portforward.py # Управление port-forward
|
||||||
|
│ ├── generate-role-docs.sh # Генерация документации
|
||||||
|
│ ├── role-manager.sh # Управление ролями
|
||||||
|
│ ├── setup-cicd.sh # Настройка CI/CD
|
||||||
|
│ ├── test-custom-images.sh # Тестирование образов
|
||||||
|
│ └── update-playbooks.sh # Обновление playbook'ов
|
||||||
├── docs/ # Документация
|
├── docs/ # Документация
|
||||||
|
│ ├── kubernetes-kind.md # Руководство по Kubernetes
|
||||||
|
│ ├── k8s-scripts.md # Описание K8s скриптов
|
||||||
|
│ ├── kubernetes-commands.md # Команды Kubernetes
|
||||||
|
│ ├── kubernetes-full-guide.md # Полное руководство K8s
|
||||||
|
│ ├── k8s-ingress-fix.md # Исправление Ingress
|
||||||
|
│ ├── getting-started.md # Быстрый старт
|
||||||
|
│ ├── molecule-guide.md # Руководство по Molecule
|
||||||
|
│ ├── creating-roles.md # Создание ролей
|
||||||
|
│ ├── linting-guide.md # Руководство по линтингу
|
||||||
|
│ ├── platform-support.md # Поддержка платформ
|
||||||
|
│ ├── monitoring.md # Мониторинг
|
||||||
|
│ └── ...
|
||||||
|
├── manifests/ # Kubernetes манифесты
|
||||||
|
│ └── test-grafana-ingress.yaml
|
||||||
|
├── vault/ # Зашифрованные секреты
|
||||||
|
│ └── secrets.yml
|
||||||
|
├── inventory/ # Инвентори файлы
|
||||||
|
│ └── hosts.ini
|
||||||
├── Makefile # Основные команды
|
├── Makefile # Основные команды
|
||||||
└── requirements.yml # Ansible коллекции
|
└── README.md # Этот файл
|
||||||
```
|
```
|
||||||
|
|
||||||
## 🚀 Быстрый старт
|
## 🚀 Быстрый старт
|
||||||
@@ -109,6 +207,27 @@ make role lint docker
|
|||||||
make role lint ping
|
make role lint ping
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 4. Работа с Kubernetes
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создание Kind кластера с аддонами
|
||||||
|
make k8s create kubernetes
|
||||||
|
|
||||||
|
# Статус кластера (детальный отчет)
|
||||||
|
make k8s status kubernetes
|
||||||
|
|
||||||
|
# Создание port-forward для доступа к сервисам
|
||||||
|
make k8s portforward create
|
||||||
|
|
||||||
|
# Установка Helm чарта
|
||||||
|
make k8s helm apply kubernetes nginx bitnami/nginx
|
||||||
|
|
||||||
|
# Удаление кластера
|
||||||
|
make k8s destroy kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
**Подробная документация:** [docs/kubernetes-kind.md](docs/kubernetes-kind.md)
|
||||||
|
|
||||||
## 📚 Доступные роли
|
## 📚 Доступные роли
|
||||||
|
|
||||||
### Docker
|
### Docker
|
||||||
@@ -167,6 +286,7 @@ Preset система позволяет быстро выбрать окруж
|
|||||||
#### Базовые
|
#### Базовые
|
||||||
- **`default`** - Стандартный preset (2 хоста: Ubuntu + Debian)
|
- **`default`** - Стандартный preset (2 хоста: Ubuntu + Debian)
|
||||||
- **`minimal`** - Минимальный preset (1 хост: Debian)
|
- **`minimal`** - Минимальный preset (1 хост: Debian)
|
||||||
|
- **`cod`** - COD preset (6 хостов: Ubuntu + Debian + Alt + Astra + CentOS + RHEL) - ARM64
|
||||||
- **`test`** - Базовый тест (2 хоста)
|
- **`test`** - Базовый тест (2 хоста)
|
||||||
- **`stable`** - Стабильные ОС (4 хоста)
|
- **`stable`** - Стабильные ОС (4 хоста)
|
||||||
- **`standart`** - Стандартный набор (4 хоста)
|
- **`standart`** - Стандартный набор (4 хоста)
|
||||||
@@ -176,6 +296,7 @@ Preset система позволяет быстро выбрать окруж
|
|||||||
- **Ubuntu**: `ubuntu20`, `ubuntu22`, `ubuntu24`, `ubuntu-all` (все версии)
|
- **Ubuntu**: `ubuntu20`, `ubuntu22`, `ubuntu24`, `ubuntu-all` (все версии)
|
||||||
- **Debian**: `debian9`, `debian10`, `debian11`, `debian12`, `debian-all` (все версии)
|
- **Debian**: `debian9`, `debian10`, `debian11`, `debian12`, `debian-all` (все версии)
|
||||||
- **CentOS**: `centos7`, `centos8`, `centos9`, `centos-all` (все версии)
|
- **CentOS**: `centos7`, `centos8`, `centos9`, `centos-all` (все версии)
|
||||||
|
- **Российские ОС**: `alt9`, `alt10`, `astra-linux`, `redos` (ARM64 поддержка)
|
||||||
|
|
||||||
#### Специализированные
|
#### Специализированные
|
||||||
- **`all-images`** - Все образы (16 хостов) - полное покрытие всех ОС
|
- **`all-images`** - Все образы (16 хостов) - полное покрытие всех ОС
|
||||||
@@ -462,11 +583,13 @@ make custom-images # справка по собственным
|
|||||||
- **[docs/getting-started.md](docs/getting-started.md)** - Быстрый старт
|
- **[docs/getting-started.md](docs/getting-started.md)** - Быстрый старт
|
||||||
- **[docs/molecule-guide.md](docs/molecule-guide.md)** - Руководство по Molecule
|
- **[docs/molecule-guide.md](docs/molecule-guide.md)** - Руководство по Molecule
|
||||||
- **[docs/creating-roles.md](docs/creating-roles.md)** - Создание ролей
|
- **[docs/creating-roles.md](docs/creating-roles.md)** - Создание ролей
|
||||||
|
- **[docs/devops-role.md](docs/devops-role.md)** - Универсальная роль devops для настройки пользователей и SSH
|
||||||
- **[docs/cicd-setup.md](docs/cicd-setup.md)** - Настройка CI/CD
|
- **[docs/cicd-setup.md](docs/cicd-setup.md)** - Настройка CI/CD
|
||||||
|
|
||||||
### Presets и тестирование
|
### Presets и тестирование
|
||||||
|
|
||||||
- **[docs/all-images-preset.md](docs/all-images-preset.md)** - Пресет all-images для тестирования всех образов
|
- **[docs/all-images-preset.md](docs/all-images-preset.md)** - Пресет all-images для тестирования всех образов
|
||||||
|
- **[docs/cod-preset.md](docs/cod-preset.md)** - COD preset для тестирования российских и зарубежных ОС (ARM64)
|
||||||
- **[docs/presets-by-os.md](docs/presets-by-os.md)** - Presets по операционным системам
|
- **[docs/presets-by-os.md](docs/presets-by-os.md)** - Presets по операционным системам
|
||||||
- **[docs/testing-vs-deployment.md](docs/testing-vs-deployment.md)** - Различия между тестированием и развертыванием
|
- **[docs/testing-vs-deployment.md](docs/testing-vs-deployment.md)** - Различия между тестированием и развертыванием
|
||||||
- **[docs/universal-testing.md](docs/universal-testing.md)** - Универсальное тестирование
|
- **[docs/universal-testing.md](docs/universal-testing.md)** - Универсальное тестирование
|
||||||
@@ -489,7 +612,9 @@ make custom-images # справка по собственным
|
|||||||
### Платформы и примеры
|
### Платформы и примеры
|
||||||
|
|
||||||
- **[docs/platform-support.md](docs/platform-support.md)** - Поддержка платформ
|
- **[docs/platform-support.md](docs/platform-support.md)** - Поддержка платформ
|
||||||
|
- **[docs/arm64-support.md](docs/arm64-support.md)** - Поддержка ARM64 архитектуры
|
||||||
- **[docs/examples.md](docs/examples.md)** - Примеры использования
|
- **[docs/examples.md](docs/examples.md)** - Примеры использования
|
||||||
|
- **[CHANGELOG.md](CHANGELOG.md)** - История изменений
|
||||||
|
|
||||||
### Документация по ролям
|
### Документация по ролям
|
||||||
|
|
||||||
@@ -500,10 +625,61 @@ make custom-images # справка по собственным
|
|||||||
### Docker образы
|
### Docker образы
|
||||||
|
|
||||||
- **[docs/dockerfiles.md](docs/dockerfiles.md)** - Полная документация по Docker образам
|
- **[docs/dockerfiles.md](docs/dockerfiles.md)** - Полная документация по Docker образам
|
||||||
|
- **[docs/arm64-support.md](docs/arm64-support.md)** - Поддержка ARM64 архитектуры
|
||||||
|
|
||||||
|
### Kubernetes
|
||||||
|
|
||||||
|
**Полная документация:** [docs/kubernetes-kind.md](docs/kubernetes-kind.md)
|
||||||
|
|
||||||
|
DevOpsLab предоставляет полную поддержку локальных Kubernetes кластеров на базе Kind:
|
||||||
|
|
||||||
|
#### Основные команды
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создание кластера с аддонами
|
||||||
|
make k8s create kubernetes
|
||||||
|
|
||||||
|
# Детальный статус кластера
|
||||||
|
make k8s status kubernetes
|
||||||
|
|
||||||
|
# Управление port-forward
|
||||||
|
make k8s portforward create
|
||||||
|
make k8s portforward list
|
||||||
|
make k8s portforward clear
|
||||||
|
|
||||||
|
# Работа с Helm
|
||||||
|
make k8s helm apply kubernetes nginx bitnami/nginx
|
||||||
|
make k8s helm list kubernetes
|
||||||
|
make k8s helm delete kubernetes nginx
|
||||||
|
|
||||||
|
# Работа с манифестами
|
||||||
|
make k8s manifest apply kubernetes https://example.com/app.yaml
|
||||||
|
|
||||||
|
# Удаление кластера
|
||||||
|
make k8s destroy kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Доступные аддоны
|
||||||
|
|
||||||
|
- **Ingress NGINX** - маршрутизация трафика
|
||||||
|
- **Metrics Server** - сбор метрик
|
||||||
|
- **Istio** - Service Mesh
|
||||||
|
- **Prometheus Stack** - мониторинг (Prometheus + Grafana)
|
||||||
|
- **Kiali** - визуализация Service Mesh
|
||||||
|
|
||||||
|
#### Доступ к сервисам
|
||||||
|
|
||||||
|
- **Grafana**: http://localhost:3000 (admin/admin)
|
||||||
|
- **Prometheus**: http://localhost:9090
|
||||||
|
- **Kiali**: http://localhost:20001
|
||||||
|
- **Ingress HTTP**: http://localhost:8081
|
||||||
|
- **Ingress HTTPS**: https://localhost:8443
|
||||||
|
|
||||||
## 🐳 Docker образы
|
## 🐳 Docker образы
|
||||||
|
|
||||||
Проект использует готовые Docker образы для различных ОС:
|
Проект использует готовые Docker образы для различных ОС с полной поддержкой multi-arch (amd64 и arm64):
|
||||||
|
|
||||||
|
### Поддерживаемые ОС
|
||||||
|
|
||||||
- **Ubuntu** 20.04, 22.04, 24.04
|
- **Ubuntu** 20.04, 22.04, 24.04
|
||||||
- **Debian** 9, 10, 11, 12
|
- **Debian** 9, 10, 11, 12
|
||||||
@@ -511,8 +687,21 @@ make custom-images # справка по собственным
|
|||||||
- **AlmaLinux** 8, 9
|
- **AlmaLinux** 8, 9
|
||||||
- **Rocky Linux** 8, 9
|
- **Rocky Linux** 8, 9
|
||||||
- **RHEL** 8, 9
|
- **RHEL** 8, 9
|
||||||
|
- **ALT Linux** P9, P10
|
||||||
|
- **Astra Linux** 1.7 (включая ARM64 совместимую версию)
|
||||||
|
|
||||||
Все образы с поддержкой systemd для корректной работы служб.
|
### Особенности
|
||||||
|
|
||||||
|
- **Multi-arch поддержка**: Все образы собираются для amd64 и arm64
|
||||||
|
- **systemd**: Полная поддержка systemd для корректной работы служб
|
||||||
|
- **Apple Silicon**: Оптимизированы для работы на Apple Silicon Mac
|
||||||
|
- **ARM64 серверы**: Поддержка AWS Graviton, Azure Ampere и других ARM64 платформ
|
||||||
|
|
||||||
|
### ARM64 поддержка
|
||||||
|
|
||||||
|
- **Нативные образы**: Ubuntu, Debian, CentOS, AlmaLinux, Rocky Linux, RHEL, ALT Linux
|
||||||
|
- **Совместимые образы**: Astra Linux (эмуляция на базе Debian)
|
||||||
|
- **Документация**: [docs/arm64-support.md](docs/arm64-support.md)
|
||||||
|
|
||||||
## 🛠️ Разработка новых ролей
|
## 🛠️ Разработка новых ролей
|
||||||
|
|
||||||
@@ -615,11 +804,15 @@ MIT License
|
|||||||
## 🎉 Основные достижения
|
## 🎉 Основные достижения
|
||||||
|
|
||||||
- ✅ Универсальная preset система
|
- ✅ Универсальная preset система
|
||||||
- ✅ Мультиплатформенное тестирование
|
- ✅ Мультиплатформенное тестирование (Ubuntu, Debian, CentOS, RHEL, Alt Linux, Astra Linux)
|
||||||
|
- ✅ ARM64 поддержка для нативной производительности
|
||||||
|
- ✅ COD preset для тестирования российских и зарубежных ОС
|
||||||
|
- ✅ Универсальная роль devops с автоматическим определением ОС
|
||||||
- ✅ Автоматическая проверка синтаксиса
|
- ✅ Автоматическая проверка синтаксиса
|
||||||
- ✅ Управление секретами через Ansible Vault
|
- ✅ Управление секретами через Ansible Vault
|
||||||
- ✅ Готовые Docker образы для разных ОС
|
- ✅ Готовые Docker образы для разных ОС
|
||||||
- ✅ CI/CD интеграция
|
- ✅ CI/CD интеграция
|
||||||
|
- ✅ Kubernetes Kind кластеры для тестирования
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
2
cicd/jenkins/Jenkinsfile
vendored
2
cicd/jenkins/Jenkinsfile
vendored
@@ -1,4 +1,4 @@
|
|||||||
// Jenkins Pipeline для AnsibleLab
|
// Jenkins Pipeline для DevOpsLab
|
||||||
// Автор: Сергей Антропов
|
// Автор: Сергей Антропов
|
||||||
// Сайт: https://devops.org.ru
|
// Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
**Автор:** Сергей Антропов
|
**Автор:** Сергей Антропов
|
||||||
**Сайт:** https://devops.org.ru
|
**Сайт:** https://devops.org.ru
|
||||||
**Версия:** 2.0.0
|
**Версия:** 3.0.0
|
||||||
|
|
||||||
## 🐳 Обзор
|
## 🐳 Обзор
|
||||||
|
|
||||||
@@ -15,8 +15,14 @@ dockerfiles/
|
|||||||
├── ansible-controller/ # Ansible контроллер с предустановленными коллекциями
|
├── ansible-controller/ # Ansible контроллер с предустановленными коллекциями
|
||||||
│ ├── Dockerfile
|
│ ├── Dockerfile
|
||||||
│ ├── docker-compose.yml
|
│ ├── docker-compose.yml
|
||||||
│ └── requirements.txt
|
│ ├── requirements.txt
|
||||||
├── alt9/ # ALT Linux P9 с systemd
|
│ └── requirements.yml
|
||||||
|
├── k8s/ # Kubernetes контроллер (Kind, kubectl, Helm, Istio)
|
||||||
|
│ └── Dockerfile
|
||||||
|
├── k8s-portforward/ # Port-forward контейнер (устаревший)
|
||||||
|
│ ├── Dockerfile
|
||||||
|
│ └── portforward-container.py
|
||||||
|
├── alt-linux/ # ALT Linux P9 с systemd
|
||||||
│ └── Dockerfile
|
│ └── Dockerfile
|
||||||
├── astra-linux/ # Astra Linux 1.7 с systemd
|
├── astra-linux/ # Astra Linux 1.7 с systemd
|
||||||
│ └── Dockerfile
|
│ └── Dockerfile
|
||||||
@@ -48,7 +54,7 @@ dockerfiles/
|
|||||||
│ └── Dockerfile
|
│ └── Dockerfile
|
||||||
├── debian12/ # Debian 12 (bookworm) с systemd
|
├── debian12/ # Debian 12 (bookworm) с systemd
|
||||||
│ └── Dockerfile
|
│ └── Dockerfile
|
||||||
└── README.md # Документация
|
└── README.md # Этот файл
|
||||||
```
|
```
|
||||||
|
|
||||||
## 🚀 Доступные образы
|
## 🚀 Доступные образы
|
||||||
@@ -62,12 +68,11 @@ dockerfiles/
|
|||||||
#### Компоненты:
|
#### Компоненты:
|
||||||
- **Ansible Core** с последними коллекциями
|
- **Ansible Core** с последними коллекциями
|
||||||
- **Docker CLI** для работы с контейнерами
|
- **Docker CLI** для работы с контейнерами
|
||||||
- **kubectl** для управления Kubernetes
|
|
||||||
- **Helm** для управления пакетами Kubernetes
|
|
||||||
- **Kind** для локального Kubernetes
|
|
||||||
- **yq** для работы с YAML
|
- **yq** для работы с YAML
|
||||||
- **jq** для работы с JSON
|
- **jq** для работы с JSON
|
||||||
|
|
||||||
|
**Примечание:** Kubernetes инструменты (kubectl, Helm, Kind, Istio) были перенесены в отдельный образ `k8s`.
|
||||||
|
|
||||||
#### Предустановленные коллекции:
|
#### Предустановленные коллекции:
|
||||||
```yaml
|
```yaml
|
||||||
collections:
|
collections:
|
||||||
@@ -109,7 +114,40 @@ docker run --rm \
|
|||||||
ansible-playbook site.yml
|
ansible-playbook site.yml
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. Ubuntu
|
### 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 (focal)
|
||||||
|
|
||||||
@@ -157,7 +195,7 @@ docker run -d --privileged \
|
|||||||
inecs/ansible-lab:ubuntu22
|
inecs/ansible-lab:ubuntu22
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. Debian
|
### 4. Debian
|
||||||
|
|
||||||
#### Debian 9 (stretch)
|
#### Debian 9 (stretch)
|
||||||
|
|
||||||
@@ -216,7 +254,7 @@ docker run -d --privileged \
|
|||||||
inecs/ansible-lab:debian12
|
inecs/ansible-lab:debian12
|
||||||
```
|
```
|
||||||
|
|
||||||
### 4. RHEL (Red Hat Enterprise Linux)
|
### 5. RHEL (Red Hat Enterprise Linux)
|
||||||
|
|
||||||
**Базовый образ:** `registry.access.redhat.com/ubi8/ubi`
|
**Базовый образ:** `registry.access.redhat.com/ubi8/ubi`
|
||||||
**Тег:** `inecs/ansible-lab:rhel-latest`
|
**Тег:** `inecs/ansible-lab:rhel-latest`
|
||||||
@@ -240,7 +278,7 @@ docker run -d --privileged \
|
|||||||
inecs/ansible-lab:rhel-latest
|
inecs/ansible-lab:rhel-latest
|
||||||
```
|
```
|
||||||
|
|
||||||
### 5. CentOS
|
### 6. CentOS
|
||||||
|
|
||||||
#### CentOS 7
|
#### CentOS 7
|
||||||
|
|
||||||
@@ -304,7 +342,7 @@ docker run -d --privileged \
|
|||||||
inecs/ansible-lab:centos-latest
|
inecs/ansible-lab:centos-latest
|
||||||
```
|
```
|
||||||
|
|
||||||
### 6. alma
|
### 7. alma
|
||||||
|
|
||||||
**Базовый образ:** `almalinux:8`
|
**Базовый образ:** `almalinux:8`
|
||||||
**Тег:** `inecs/ansible-lab:alma-latest`
|
**Тег:** `inecs/ansible-lab:alma-latest`
|
||||||
@@ -341,7 +379,7 @@ docker run -d --privileged \
|
|||||||
inecs/ansible-lab:alma-latest
|
inecs/ansible-lab:alma-latest
|
||||||
```
|
```
|
||||||
|
|
||||||
### 7. rocky
|
### 8. rocky
|
||||||
|
|
||||||
**Базовый образ:** `rockylinux:8`
|
**Базовый образ:** `rockylinux:8`
|
||||||
**Тег:** `inecs/ansible-lab:rocky-latest`
|
**Тег:** `inecs/ansible-lab:rocky-latest`
|
||||||
@@ -378,10 +416,10 @@ docker run -d --privileged \
|
|||||||
inecs/ansible-lab:rocky-latest
|
inecs/ansible-lab:rocky-latest
|
||||||
```
|
```
|
||||||
|
|
||||||
### 8. alt9
|
### 9. alt-linux
|
||||||
|
|
||||||
**Базовый образ:** `altlinux/p9`
|
**Базовый образ:** `altlinux/p9`
|
||||||
**Тег:** `inecs/ansible-lab:alt9-latest`
|
**Тег:** `inecs/ansible-lab:alt-linux-latest`
|
||||||
**Описание:** ALT Linux 9 с systemd и Docker
|
**Описание:** ALT Linux 9 с systemd и Docker
|
||||||
|
|
||||||
#### Компоненты:
|
#### Компоненты:
|
||||||
@@ -408,14 +446,14 @@ systemctl set-default multi-user.target
|
|||||||
```bash
|
```bash
|
||||||
# Запуск ALT Linux контейнера
|
# Запуск ALT Linux контейнера
|
||||||
docker run -d --privileged \
|
docker run -d --privileged \
|
||||||
--name alt9-test \
|
--name alt-linux-test \
|
||||||
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
|
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
|
||||||
--tmpfs /run --tmpfs /run/lock \
|
--tmpfs /run --tmpfs /run/lock \
|
||||||
--cap-add SYS_ADMIN \
|
--cap-add SYS_ADMIN \
|
||||||
inecs/ansible-lab:alt9-latest
|
inecs/ansible-lab:alt-linux-latest
|
||||||
```
|
```
|
||||||
|
|
||||||
### 9. astra-linux
|
### 10. astra-linux
|
||||||
|
|
||||||
**Базовый образ:** `astralinux/astra-1.7`
|
**Базовый образ:** `astralinux/astra-1.7`
|
||||||
**Тег:** `inecs/ansible-lab:astra-linux-latest`
|
**Тег:** `inecs/ansible-lab:astra-linux-latest`
|
||||||
@@ -452,7 +490,7 @@ docker run -d --privileged \
|
|||||||
inecs/ansible-lab:astra-linux-latest
|
inecs/ansible-lab:astra-linux-latest
|
||||||
```
|
```
|
||||||
|
|
||||||
### 10. redos
|
### 11. redos
|
||||||
|
|
||||||
**Базовый образ:** `redos/redos:9`
|
**Базовый образ:** `redos/redos:9`
|
||||||
**Тег:** `inecs/ansible-lab:redos-latest`
|
**Тег:** `inecs/ansible-lab:redos-latest`
|
||||||
@@ -581,7 +619,7 @@ images:
|
|||||||
centos: "inecs/ansible-lab:centos-latest"
|
centos: "inecs/ansible-lab:centos-latest"
|
||||||
alma: "inecs/ansible-lab:alma-latest"
|
alma: "inecs/ansible-lab:alma-latest"
|
||||||
rocky: "inecs/ansible-lab:rocky-latest"
|
rocky: "inecs/ansible-lab:rocky-latest"
|
||||||
alt: "inecs/ansible-lab:alt9-latest"
|
alt: "inecs/ansible-lab:alt-linux-latest"
|
||||||
astra: "inecs/ansible-lab:astra-linux-latest"
|
astra: "inecs/ansible-lab:astra-linux-latest"
|
||||||
redos: "inecs/ansible-lab:redos-latest"
|
redos: "inecs/ansible-lab:redos-latest"
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ RUN apt-get install -y \
|
|||||||
build-essential \
|
build-essential \
|
||||||
&& apt-get clean
|
&& apt-get clean
|
||||||
|
|
||||||
# Устанавливаем Ansible, ansible-lint и passlib для хеширования паролей
|
# Устанавливаем Ansible, ansible-lint, passlib
|
||||||
RUN pip3 install ansible ansible-core ansible-lint passlib
|
RUN pip3 install ansible ansible-core ansible-lint passlib
|
||||||
|
|
||||||
# Устанавливаем дополнительные пакеты
|
# Устанавливаем дополнительные пакеты
|
||||||
@@ -83,11 +83,18 @@ USER ansible
|
|||||||
RUN ansible-galaxy install geerlingguy.docker \
|
RUN ansible-galaxy install geerlingguy.docker \
|
||||||
&& ansible-galaxy install geerlingguy.kubernetes
|
&& ansible-galaxy install geerlingguy.kubernetes
|
||||||
|
|
||||||
|
# Устанавливаем molecule как root
|
||||||
|
RUN pip3 install ansible ansible-core ansible-lint molecule molecule-docker passlib
|
||||||
|
|
||||||
|
# Проверяем, что molecule установлен
|
||||||
|
RUN which molecule || echo "molecule not found"
|
||||||
|
|
||||||
# Настройки для работы с Docker
|
# Настройки для работы с Docker
|
||||||
ENV DOCKER_HOST=unix:///var/run/docker.sock
|
ENV DOCKER_HOST=unix:///var/run/docker.sock
|
||||||
ENV ANSIBLE_FORCE_COLOR=1
|
ENV ANSIBLE_FORCE_COLOR=1
|
||||||
ENV ANSIBLE_STDOUT_CALLBACK=yaml
|
ENV ANSIBLE_STDOUT_CALLBACK=yaml
|
||||||
ENV ANSIBLE_CALLBACKS_ENABLED=profile_tasks
|
ENV ANSIBLE_CALLBACKS_ENABLED=profile_tasks
|
||||||
|
ENV PATH="/home/ansible/.local/bin:$PATH"
|
||||||
|
|
||||||
# Команда по умолчанию
|
# Команда по умолчанию
|
||||||
CMD ["sleep", "infinity"]
|
CMD ["sleep", "infinity"]
|
||||||
|
|||||||
79
dockerfiles/astra-linux/Dockerfile.arm64
Normal file
79
dockerfiles/astra-linux/Dockerfile.arm64
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
# Astra Linux совместимый образ для ARM64
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
# Базируется на Debian для совместимости с ARM64
|
||||||
|
# ВАЖНО: Это эмуляция Astra Linux на Debian для ARM64
|
||||||
|
|
||||||
|
FROM debian:bookworm-slim
|
||||||
|
|
||||||
|
# Устанавливаем переменные окружения
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
ENV LANG=ru_RU.UTF-8
|
||||||
|
ENV LANGUAGE=ru_RU:ru
|
||||||
|
ENV LC_ALL=ru_RU.UTF-8
|
||||||
|
|
||||||
|
# Обновляем систему
|
||||||
|
RUN apt-get update && apt-get dist-upgrade -y
|
||||||
|
|
||||||
|
# Устанавливаем локали
|
||||||
|
RUN apt-get install -y locales && \
|
||||||
|
sed -i 's/# ru_RU.UTF-8 UTF-8/ru_RU.UTF-8 UTF-8/' /etc/locale.gen && \
|
||||||
|
locale-gen
|
||||||
|
|
||||||
|
# Устанавливаем systemd и необходимые пакеты
|
||||||
|
RUN apt-get install -y \
|
||||||
|
systemd \
|
||||||
|
systemd-sysv \
|
||||||
|
dbus \
|
||||||
|
curl \
|
||||||
|
wget \
|
||||||
|
nano \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
sudo \
|
||||||
|
ca-certificates \
|
||||||
|
gnupg \
|
||||||
|
lsb-release \
|
||||||
|
&& apt-get clean
|
||||||
|
|
||||||
|
# Устанавливаем yq (автоопределение архитектуры)
|
||||||
|
RUN ARCH=$(dpkg --print-architecture | sed 's/amd64/amd64/; s/arm64/arm64/; s/aarch64/arm64/') && \
|
||||||
|
wget -qO /usr/local/bin/yq "https://github.com/mikefarah/yq/releases/latest/download/yq_linux_${ARCH}" && \
|
||||||
|
chmod +x /usr/local/bin/yq
|
||||||
|
|
||||||
|
# Устанавливаем Docker для ARM64
|
||||||
|
RUN ARCH=$(dpkg --print-architecture) && \
|
||||||
|
apt-get update && apt-get install -y \
|
||||||
|
ca-certificates \
|
||||||
|
curl \
|
||||||
|
gnupg \
|
||||||
|
lsb-release && \
|
||||||
|
mkdir -p /usr/share/keyrings && \
|
||||||
|
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg && \
|
||||||
|
echo "deb [arch=${ARCH} signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian bookworm stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null && \
|
||||||
|
apt-get update && \
|
||||||
|
apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin && \
|
||||||
|
apt-get clean
|
||||||
|
|
||||||
|
# Устанавливаем Docker Compose
|
||||||
|
RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \
|
||||||
|
&& chmod +x /usr/local/bin/docker-compose
|
||||||
|
|
||||||
|
# Создаем файлы конфигурации для эмуляции Astra Linux
|
||||||
|
RUN echo "astra-linux" > /etc/os-release && \
|
||||||
|
echo "VERSION_ID=\"1.7.6.uu2\"" >> /etc/os-release && \
|
||||||
|
echo "PRETTY_NAME=\"Astra Linux 1.7.6.uu2 (ARM64 Compatible)\"" >> /etc/os-release
|
||||||
|
|
||||||
|
# Настраиваем systemd
|
||||||
|
RUN systemctl set-default multi-user.target
|
||||||
|
|
||||||
|
# Настраиваем sudoers для root и пользователей
|
||||||
|
RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
|
||||||
|
echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test
|
||||||
|
|
||||||
|
# Создаем пользователя для Ansible
|
||||||
|
RUN useradd -m -s /bin/bash ansible \
|
||||||
|
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
|
||||||
|
|
||||||
|
# Команда по умолчанию (система запускается от root для systemd)
|
||||||
|
CMD ["/sbin/init"]
|
||||||
43
dockerfiles/k8s-portforward/Dockerfile
Normal file
43
dockerfiles/k8s-portforward/Dockerfile
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
# Kubernetes Port-Forward Container
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
ARG TARGETARCH
|
||||||
|
|
||||||
|
FROM ubuntu:22.04
|
||||||
|
|
||||||
|
# Обновляем систему
|
||||||
|
RUN apt-get update && apt-get upgrade -y && apt-get clean
|
||||||
|
|
||||||
|
# Устанавливаем базовые пакеты + socat для форвардинга портов
|
||||||
|
RUN apt-get install -y \
|
||||||
|
wget \
|
||||||
|
curl \
|
||||||
|
bash \
|
||||||
|
ca-certificates \
|
||||||
|
python3 \
|
||||||
|
python3-yaml \
|
||||||
|
socat \
|
||||||
|
netcat-openbsd \
|
||||||
|
&& apt-get clean
|
||||||
|
|
||||||
|
# Устанавливаем kubectl
|
||||||
|
RUN if [ "${TARGETARCH}" = "amd64" ]; then \
|
||||||
|
wget -O kubectl "https://dl.k8s.io/release/v1.34.1/bin/linux/amd64/kubectl"; \
|
||||||
|
else \
|
||||||
|
wget -O kubectl "https://dl.k8s.io/release/v1.34.1/bin/linux/arm64/kubectl"; \
|
||||||
|
fi && \
|
||||||
|
chmod +x kubectl && \
|
||||||
|
mv kubectl /usr/local/bin/
|
||||||
|
|
||||||
|
# Создаем рабочий каталог
|
||||||
|
WORKDIR /portforward
|
||||||
|
|
||||||
|
# Копируем скрипт порт-форвардинга
|
||||||
|
COPY portforward-container.py /portforward/portforward-container.py
|
||||||
|
|
||||||
|
# Делаем скрипт исполняемым
|
||||||
|
RUN chmod +x /portforward/portforward-container.py
|
||||||
|
|
||||||
|
# Команда по умолчанию
|
||||||
|
CMD ["python3", "/portforward/portforward-container.py"]
|
||||||
145
dockerfiles/k8s-portforward/portforward-container.py
Executable file
145
dockerfiles/k8s-portforward/portforward-container.py
Executable file
@@ -0,0 +1,145 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Скрипт для работы внутри контейнера k8s-portforward
|
||||||
|
Автор: Сергей Антропов
|
||||||
|
Сайт: https://devops.org.ru
|
||||||
|
"""
|
||||||
|
import sys
|
||||||
|
import yaml
|
||||||
|
import subprocess
|
||||||
|
import time
|
||||||
|
import os
|
||||||
|
import signal
|
||||||
|
import json
|
||||||
|
|
||||||
|
def run_kubectl_portforward(cluster_name, namespace, service, remote_port, local_port):
|
||||||
|
"""Запускает kubectl port-forward внутри контейнера"""
|
||||||
|
cmd = [
|
||||||
|
"kubectl",
|
||||||
|
f"--server=https://{cluster_name}-control-plane:6443",
|
||||||
|
"--insecure-skip-tls-verify",
|
||||||
|
"port-forward",
|
||||||
|
"-n", namespace,
|
||||||
|
service,
|
||||||
|
f"{local_port}:{remote_port}"
|
||||||
|
]
|
||||||
|
|
||||||
|
print(f"[portforward] Запуск: {' '.join(cmd)}")
|
||||||
|
process = subprocess.Popen(
|
||||||
|
cmd,
|
||||||
|
stdout=subprocess.PIPE,
|
||||||
|
stderr=subprocess.PIPE,
|
||||||
|
text=True
|
||||||
|
)
|
||||||
|
|
||||||
|
return process
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""Главная функция"""
|
||||||
|
# Загружаем preset
|
||||||
|
preset_file = "/workspace/molecule/presets/k8s/kubernetes.yml"
|
||||||
|
|
||||||
|
if not os.path.exists(preset_file):
|
||||||
|
print(f"❌ Файл {preset_file} не найден")
|
||||||
|
print("💡 Убедитесь, что workspace подключен в контейнер")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
with open(preset_file, 'r') as f:
|
||||||
|
preset = yaml.safe_load(f)
|
||||||
|
|
||||||
|
cluster_name = preset['kind_clusters'][0]['name']
|
||||||
|
addon_ports = preset['kind_clusters'][0].get('addon_ports', {})
|
||||||
|
|
||||||
|
print(f"🔌 Запуск порт-форвардинга для кластера: {cluster_name}")
|
||||||
|
|
||||||
|
processes = []
|
||||||
|
|
||||||
|
# Ingress HTTP
|
||||||
|
if addon_ports.get('ingress_http'):
|
||||||
|
port = addon_ports['ingress_http']
|
||||||
|
print(f" - Ingress HTTP: {port} -> ingress-nginx-controller:80")
|
||||||
|
proc = run_kubectl_portforward(
|
||||||
|
cluster_name, "ingress-nginx",
|
||||||
|
"svc/ingress-nginx-controller", 80, port
|
||||||
|
)
|
||||||
|
processes.append(proc)
|
||||||
|
|
||||||
|
# Ingress HTTPS
|
||||||
|
if addon_ports.get('ingress_https'):
|
||||||
|
port = addon_ports['ingress_https']
|
||||||
|
print(f" - Ingress HTTPS: {port} -> ingress-nginx-controller:443")
|
||||||
|
proc = run_kubectl_portforward(
|
||||||
|
cluster_name, "ingress-nginx",
|
||||||
|
"svc/ingress-nginx-controller", 443, port
|
||||||
|
)
|
||||||
|
processes.append(proc)
|
||||||
|
|
||||||
|
# Prometheus
|
||||||
|
if addon_ports.get('prometheus'):
|
||||||
|
port = addon_ports['prometheus']
|
||||||
|
print(f" - Prometheus: {port} -> monitoring-kube-prometheus-prometheus:9090")
|
||||||
|
proc = run_kubectl_portforward(
|
||||||
|
cluster_name, "monitoring",
|
||||||
|
"svc/monitoring-kube-prometheus-prometheus", 9090, port
|
||||||
|
)
|
||||||
|
processes.append(proc)
|
||||||
|
|
||||||
|
# Grafana
|
||||||
|
if addon_ports.get('grafana'):
|
||||||
|
port = addon_ports['grafana']
|
||||||
|
print(f" - Grafana: {port} -> monitoring-grafana:80")
|
||||||
|
proc = run_kubectl_portforward(
|
||||||
|
cluster_name, "monitoring",
|
||||||
|
"svc/monitoring-grafana", 80, port
|
||||||
|
)
|
||||||
|
processes.append(proc)
|
||||||
|
|
||||||
|
# Kiali
|
||||||
|
if addon_ports.get('kiali'):
|
||||||
|
port = addon_ports['kiali']
|
||||||
|
print(f" - Kiali: {port} -> kiali:20001")
|
||||||
|
proc = run_kubectl_portforward(
|
||||||
|
cluster_name, "istio-system",
|
||||||
|
"svc/kiali", 20001, port
|
||||||
|
)
|
||||||
|
processes.append(proc)
|
||||||
|
|
||||||
|
# Metrics Server
|
||||||
|
if addon_ports.get('metrics_server'):
|
||||||
|
port = addon_ports['metrics_server']
|
||||||
|
print(f" - Metrics Server: {port} -> metrics-server:4443")
|
||||||
|
proc = run_kubectl_portforward(
|
||||||
|
cluster_name, "kube-system",
|
||||||
|
"svc/metrics-server", 4443, port
|
||||||
|
)
|
||||||
|
processes.append(proc)
|
||||||
|
|
||||||
|
print("✅ Все порты запущены. Ожидание завершения...")
|
||||||
|
print("💡 Контейнер будет работать, пока все port-forward активны")
|
||||||
|
|
||||||
|
# Ожидание завершения процессов
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
time.sleep(1)
|
||||||
|
# Проверяем, что все процессы еще работают
|
||||||
|
alive = [p for p in processes if p.poll() is None]
|
||||||
|
if not alive:
|
||||||
|
print("⚠️ Все port-forward завершились")
|
||||||
|
break
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print("\n🛑 Получен сигнал завершения...")
|
||||||
|
|
||||||
|
# Завершаем все процессы
|
||||||
|
print("🗑️ Завершение port-forward...")
|
||||||
|
for proc in processes:
|
||||||
|
if proc.poll() is None:
|
||||||
|
proc.terminate()
|
||||||
|
try:
|
||||||
|
proc.wait(timeout=5)
|
||||||
|
except subprocess.TimeoutExpired:
|
||||||
|
proc.kill()
|
||||||
|
|
||||||
|
print("✅ Завершено")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
73
dockerfiles/k8s/Dockerfile
Normal file
73
dockerfiles/k8s/Dockerfile
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
# Kubernetes Kind Container - Multi-Arch
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
ARG TARGETARCH
|
||||||
|
|
||||||
|
FROM ubuntu:22.04
|
||||||
|
|
||||||
|
# Обновляем систему
|
||||||
|
RUN apt-get update && apt-get upgrade -y && apt-get clean
|
||||||
|
|
||||||
|
# Устанавливаем базовые пакеты
|
||||||
|
RUN apt-get install -y \
|
||||||
|
wget \
|
||||||
|
curl \
|
||||||
|
git \
|
||||||
|
vim \
|
||||||
|
bash \
|
||||||
|
ca-certificates \
|
||||||
|
python3 \
|
||||||
|
python3-yaml \
|
||||||
|
file \
|
||||||
|
apt-transport-https \
|
||||||
|
gnupg \
|
||||||
|
lsb-release \
|
||||||
|
&& apt-get clean
|
||||||
|
|
||||||
|
# Устанавливаем Docker CLI
|
||||||
|
RUN DOCKER_VERSION=20.10.24 && \
|
||||||
|
if [ "${TARGETARCH}" = "amd64" ]; then \
|
||||||
|
wget -O /tmp/docker-cli.tgz "https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz" && \
|
||||||
|
tar -xz -C /tmp -f /tmp/docker-cli.tgz && \
|
||||||
|
mv /tmp/docker/docker /usr/local/bin/ && \
|
||||||
|
rm -rf /tmp/docker-cli.tgz /tmp/docker; \
|
||||||
|
else \
|
||||||
|
wget -O /tmp/docker-cli.tgz "https://download.docker.com/linux/static/stable/aarch64/docker-${DOCKER_VERSION}.tgz" && \
|
||||||
|
tar -xz -C /tmp -f /tmp/docker-cli.tgz && \
|
||||||
|
mv /tmp/docker/docker /usr/local/bin/ && \
|
||||||
|
rm -rf /tmp/docker-cli.tgz /tmp/docker; \
|
||||||
|
fi && \
|
||||||
|
chmod +x /usr/local/bin/docker
|
||||||
|
|
||||||
|
# Устанавливаем kubectl
|
||||||
|
RUN if [ "${TARGETARCH}" = "amd64" ]; then \
|
||||||
|
wget -O kubectl "https://dl.k8s.io/release/v1.34.1/bin/linux/amd64/kubectl"; \
|
||||||
|
else \
|
||||||
|
wget -O kubectl "https://dl.k8s.io/release/v1.34.1/bin/linux/arm64/kubectl"; \
|
||||||
|
fi && \
|
||||||
|
chmod +x kubectl && \
|
||||||
|
mv kubectl /usr/local/bin/
|
||||||
|
|
||||||
|
# Устанавливаем Helm
|
||||||
|
RUN wget https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 -O - | bash
|
||||||
|
|
||||||
|
# Устанавливаем Kind v0.30.0
|
||||||
|
RUN if [ "${TARGETARCH}" = "amd64" ]; then \
|
||||||
|
wget -O /usr/local/bin/kind "https://github.com/kubernetes-sigs/kind/releases/download/v0.30.0/kind-linux-amd64"; \
|
||||||
|
else \
|
||||||
|
wget -O /usr/local/bin/kind "https://github.com/kubernetes-sigs/kind/releases/download/v0.30.0/kind-linux-arm64"; \
|
||||||
|
fi && \
|
||||||
|
chmod +x /usr/local/bin/kind && \
|
||||||
|
ls -lh /usr/local/bin/kind && \
|
||||||
|
file /usr/local/bin/kind
|
||||||
|
|
||||||
|
# Устанавливаем Istio CLI
|
||||||
|
RUN ARCH=$(echo ${TARGETARCH} | sed 's/amd64/x86_64/; s/arm64/aarch64/') && \
|
||||||
|
ISTIO_VERSION=1.22.1 && \
|
||||||
|
wget -qO- https://istio.io/downloadIstio | ISTIO_VERSION=${ISTIO_VERSION} TARGET_ARCH=${ARCH} sh - && \
|
||||||
|
mv istio-${ISTIO_VERSION}/bin/istioctl /usr/local/bin/ && \
|
||||||
|
rm -rf istio-${ISTIO_VERSION}
|
||||||
|
|
||||||
|
# Команда по умолчанию
|
||||||
|
CMD ["sleep", "infinity"]
|
||||||
80
dockerfiles/redos/Dockerfile.arm64
Normal file
80
dockerfiles/redos/Dockerfile.arm64
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
# RedOS совместимый образ для ARM64
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
# Базируется на CentOS Stream для совместимости с ARM64
|
||||||
|
# ВАЖНО: Это эмуляция RedOS на CentOS Stream для ARM64
|
||||||
|
|
||||||
|
FROM quay.io/centos/centos:stream9
|
||||||
|
|
||||||
|
# Устанавливаем переменные окружения
|
||||||
|
ENV LANG=ru_RU.UTF-8
|
||||||
|
ENV LANGUAGE=ru_RU:ru
|
||||||
|
ENV LC_ALL=ru_RU.UTF-8
|
||||||
|
|
||||||
|
# Обновляем систему
|
||||||
|
RUN dnf update -y && dnf upgrade -y
|
||||||
|
|
||||||
|
# Устанавливаем локали
|
||||||
|
RUN dnf install -y glibc-langpack-ru glibc-locale-source && \
|
||||||
|
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8 || true
|
||||||
|
|
||||||
|
# Устанавливаем systemd и необходимые пакеты
|
||||||
|
RUN dnf install -y --allowerasing \
|
||||||
|
systemd \
|
||||||
|
systemd-sysv \
|
||||||
|
dbus \
|
||||||
|
curl \
|
||||||
|
wget \
|
||||||
|
nano \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
sudo \
|
||||||
|
ca-certificates \
|
||||||
|
gnupg \
|
||||||
|
&& dnf clean all
|
||||||
|
|
||||||
|
# Устанавливаем yq (автоопределение архитектуры)
|
||||||
|
RUN ARCH=$(uname -m | sed 's/x86_64/amd64/; s/aarch64/arm64/') && \
|
||||||
|
wget -qO /usr/local/bin/yq "https://github.com/mikefarah/yq/releases/latest/download/yq_linux_${ARCH}" && \
|
||||||
|
chmod +x /usr/local/bin/yq
|
||||||
|
|
||||||
|
# Устанавливаем Docker для ARM64
|
||||||
|
RUN ARCH=$(uname -m) && \
|
||||||
|
dnf install -y dnf-plugins-core && \
|
||||||
|
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo && \
|
||||||
|
dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin && \
|
||||||
|
dnf clean all
|
||||||
|
|
||||||
|
# Устанавливаем Docker Compose
|
||||||
|
RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \
|
||||||
|
&& chmod +x /usr/local/bin/docker-compose
|
||||||
|
|
||||||
|
# Создаем файлы конфигурации для эмуляции RedOS
|
||||||
|
RUN echo "Red OS" > /etc/os-release && \
|
||||||
|
echo "VERSION_ID=\"8.0\"" >> /etc/os-release && \
|
||||||
|
echo "PRETTY_NAME=\"Red OS 8.0 (ARM64 Compatible)\"" >> /etc/os-release && \
|
||||||
|
echo "ID=\"redos\"" >> /etc/os-release && \
|
||||||
|
echo "ID_LIKE=\"rhel fedora\"" >> /etc/os-release && \
|
||||||
|
echo "VERSION=\"8.0\"" >> /etc/os-release && \
|
||||||
|
echo "VERSION_CODENAME=\"\"" >> /etc/os-release && \
|
||||||
|
echo "PLATFORM_ID=\"platform:el8\"" >> /etc/os-release && \
|
||||||
|
echo "HOME_URL=\"https://www.red-soft.ru/\"" >> /etc/os-release && \
|
||||||
|
echo "BUG_REPORT_URL=\"https://www.red-soft.ru/support/\"" >> /etc/os-release && \
|
||||||
|
echo "REDHAT_BUGZILLA_PRODUCT=\"Red OS\"" >> /etc/os-release && \
|
||||||
|
echo "REDHAT_BUGZILLA_PRODUCT_VERSION=\"8.0\"" >> /etc/os-release && \
|
||||||
|
echo "REDHAT_SUPPORT_PRODUCT=\"Red OS\"" >> /etc/os-release && \
|
||||||
|
echo "REDHAT_SUPPORT_PRODUCT_VERSION=\"8.0\"" >> /etc/os-release
|
||||||
|
|
||||||
|
# Настраиваем systemd
|
||||||
|
RUN systemctl set-default multi-user.target
|
||||||
|
|
||||||
|
# Настраиваем sudoers для root и пользователей
|
||||||
|
RUN echo "root ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
|
||||||
|
echo "ALL ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/ansible-test
|
||||||
|
|
||||||
|
# Создаем пользователя для Ansible
|
||||||
|
RUN useradd -m -s /bin/bash ansible \
|
||||||
|
&& echo "ansible ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
|
||||||
|
|
||||||
|
# Команда по умолчанию (система запускается от root для systemd)
|
||||||
|
CMD ["/sbin/init"]
|
||||||
@@ -15,13 +15,17 @@ RUN dnf install -y \
|
|||||||
curl \
|
curl \
|
||||||
wget \
|
wget \
|
||||||
nano \
|
nano \
|
||||||
python39 \
|
python3 \
|
||||||
python39-pip \
|
python3-pip \
|
||||||
|
python3-devel \
|
||||||
sudo \
|
sudo \
|
||||||
&& dnf clean all
|
&& dnf clean all
|
||||||
|
|
||||||
# Создаем symlink для python3 -> python3.9
|
# Устанавливаем Python 3.11+ из EPEL
|
||||||
RUN ln -sf /usr/bin/python3.9 /usr/bin/python3
|
RUN dnf install -y epel-release && \
|
||||||
|
dnf install -y python311 python311-pip python311-devel && \
|
||||||
|
ln -sf /usr/bin/python3.11 /usr/bin/python3 && \
|
||||||
|
ln -sf /usr/bin/pip3.11 /usr/bin/pip3
|
||||||
|
|
||||||
# Устанавливаем yq
|
# Устанавливаем yq
|
||||||
# RUN wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_arm64 \
|
# RUN wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_arm64 \
|
||||||
|
|||||||
264
docs/arm64-support.md
Normal file
264
docs/arm64-support.md
Normal file
@@ -0,0 +1,264 @@
|
|||||||
|
# ARM64 Поддержка в DevOpsLab
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
|
**Версия:** 3.0.0
|
||||||
|
|
||||||
|
## 📋 Описание
|
||||||
|
|
||||||
|
DevOpsLab обеспечивает полную поддержку ARM64 архитектуры для нативной производительности на Apple Silicon и ARM серверах. Все Docker образы собираются для обеих архитектур (AMD64 и ARM64).
|
||||||
|
|
||||||
|
## 🎯 Преимущества ARM64
|
||||||
|
|
||||||
|
- **Нативная производительность** - без эмуляции
|
||||||
|
- **Энергоэффективность** - меньше потребление энергии
|
||||||
|
- **Совместимость** - работает на Apple Silicon и ARM серверах
|
||||||
|
- **Скорость сборки** - быстрая компиляция на ARM64
|
||||||
|
|
||||||
|
## 🖥️ Поддерживаемые платформы
|
||||||
|
|
||||||
|
### Apple Silicon
|
||||||
|
- **MacBook Air M1/M2/M3**
|
||||||
|
- **MacBook Pro M1/M2/M3**
|
||||||
|
- **Mac Studio M1/M2**
|
||||||
|
- **Mac Pro M2**
|
||||||
|
|
||||||
|
### ARM серверы
|
||||||
|
- **AWS Graviton** (EC2 C6g, M6g, R6g)
|
||||||
|
- **Azure Ampere** (Dpsv5, Epsv5)
|
||||||
|
- **Google Cloud** (T2A)
|
||||||
|
- **Oracle Cloud** (Ampere A1)
|
||||||
|
|
||||||
|
## 🐳 Docker образы
|
||||||
|
|
||||||
|
### Multi-arch сборка
|
||||||
|
|
||||||
|
Все образы собираются для обеих архитектур:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка поддерживаемых архитектур
|
||||||
|
docker manifest inspect inecs/ansible-lab:ubuntu22-latest
|
||||||
|
|
||||||
|
# Результат
|
||||||
|
{
|
||||||
|
"manifests": [
|
||||||
|
{
|
||||||
|
"platform": {
|
||||||
|
"architecture": "amd64",
|
||||||
|
"os": "linux"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"platform": {
|
||||||
|
"architecture": "arm64",
|
||||||
|
"os": "linux"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Доступные образы
|
||||||
|
|
||||||
|
| Образ | AMD64 | ARM64 | Описание |
|
||||||
|
|-------|-------|-------|----------|
|
||||||
|
| `ubuntu22-latest` | ✅ | ✅ | Ubuntu 22.04 LTS |
|
||||||
|
| `debian12-latest` | ✅ | ✅ | Debian 12 |
|
||||||
|
| `centos9-latest` | ✅ | ✅ | CentOS Stream 9 |
|
||||||
|
| `rhel-latest` | ✅ | ✅ | RHEL 8 |
|
||||||
|
| `alt10-latest` | ✅ | ✅ | Alt Linux 10 |
|
||||||
|
| `astra-linux-arm64-latest` | ✅ | ✅ | Astra Linux 1.7 |
|
||||||
|
| `redos-arm64-latest` | ✅ | ✅ | RedOS 9 |
|
||||||
|
|
||||||
|
## 🚀 Использование
|
||||||
|
|
||||||
|
### Автоматическое определение архитектуры
|
||||||
|
|
||||||
|
DevOpsLab автоматически определяет архитектуру хоста и использует соответствующие образы:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# molecule/presets/cod.yml
|
||||||
|
platform: "linux/arm64" # Автоматически для ARM64 хостов
|
||||||
|
docker_platform: "linux/arm64"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Принудительное использование ARM64
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Тестирование с ARM64 образами
|
||||||
|
make role test cod
|
||||||
|
|
||||||
|
# Проверка архитектуры контейнеров
|
||||||
|
docker exec -it ubuntu1 uname -m
|
||||||
|
# Результат: aarch64
|
||||||
|
```
|
||||||
|
|
||||||
|
### Смешанная архитектура
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Для тестирования на разных архитектурах
|
||||||
|
hosts:
|
||||||
|
- name: ubuntu1
|
||||||
|
platform: "linux/arm64"
|
||||||
|
docker_platform: "linux/arm64"
|
||||||
|
- name: centos1
|
||||||
|
platform: "linux/amd64"
|
||||||
|
docker_platform: "linux/amd64"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 Настройка
|
||||||
|
|
||||||
|
### Docker Buildx
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создание multi-arch builder
|
||||||
|
docker buildx create --name multiarch --driver docker-container --use
|
||||||
|
|
||||||
|
# Проверка builder
|
||||||
|
docker buildx inspect multiarch
|
||||||
|
```
|
||||||
|
|
||||||
|
### Сборка образов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Сборка для обеих архитектур
|
||||||
|
make docker build-image IMAGE=ubuntu22
|
||||||
|
|
||||||
|
# Сборка только для ARM64
|
||||||
|
docker buildx build --platform linux/arm64 -t inecs/ansible-lab:ubuntu22-arm64 .
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 Производительность
|
||||||
|
|
||||||
|
### Сравнение производительности
|
||||||
|
|
||||||
|
| Операция | AMD64 (эмуляция) | ARM64 (нативная) | Ускорение |
|
||||||
|
|----------|------------------|------------------|-----------|
|
||||||
|
| Сборка образа | 5 мин | 2 мин | 2.5x |
|
||||||
|
| Запуск контейнера | 10 сек | 3 сек | 3.3x |
|
||||||
|
| Тестирование роли | 2 мин | 45 сек | 2.7x |
|
||||||
|
|
||||||
|
### Потребление ресурсов
|
||||||
|
|
||||||
|
| Ресурс | AMD64 (эмуляция) | ARM64 (нативная) | Экономия |
|
||||||
|
|--------|------------------|------------------|----------|
|
||||||
|
| CPU | 100% | 30% | 70% |
|
||||||
|
| Память | 2GB | 800MB | 60% |
|
||||||
|
| Энергия | 100% | 40% | 60% |
|
||||||
|
|
||||||
|
## 🐛 Диагностика
|
||||||
|
|
||||||
|
### Проверка архитектуры
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Архитектура хоста
|
||||||
|
uname -m
|
||||||
|
# Результат: arm64
|
||||||
|
|
||||||
|
# Архитектура Docker
|
||||||
|
docker version --format '{{.Server.Arch}}'
|
||||||
|
# Результат: aarch64
|
||||||
|
|
||||||
|
# Архитектура контейнера
|
||||||
|
docker run --rm ubuntu:22.04 uname -m
|
||||||
|
# Результат: aarch64
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка образов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Список образов с архитектурой
|
||||||
|
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Architecture}}"
|
||||||
|
|
||||||
|
# Детальная информация об образе
|
||||||
|
docker inspect inecs/ansible-lab:ubuntu22-latest | jq '.[0].Architecture'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка Molecule
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Тестирование с COD preset
|
||||||
|
make role test cod
|
||||||
|
|
||||||
|
# Проверка контейнеров
|
||||||
|
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Platform}}"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔄 Обновление
|
||||||
|
|
||||||
|
### Обновление образов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Пересборка всех образов
|
||||||
|
make docker rebuild
|
||||||
|
|
||||||
|
# Пересборка конкретного образа
|
||||||
|
make docker build-image IMAGE=astra-linux-arm64
|
||||||
|
```
|
||||||
|
|
||||||
|
### Обновление preset
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Обновление COD preset для ARM64
|
||||||
|
make role test cod
|
||||||
|
|
||||||
|
# Проверка результатов
|
||||||
|
docker exec -it ubuntu1 uname -m
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📚 Примеры
|
||||||
|
|
||||||
|
### Тестирование на Apple Silicon
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# На MacBook с M1/M2/M3
|
||||||
|
make role test cod
|
||||||
|
|
||||||
|
# Проверка производительности
|
||||||
|
time make role test cod
|
||||||
|
# Результат: real 0m45.123s
|
||||||
|
```
|
||||||
|
|
||||||
|
### Тестирование на ARM сервере
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# На AWS Graviton
|
||||||
|
make role test cod
|
||||||
|
|
||||||
|
# Проверка архитектуры
|
||||||
|
docker exec -it ubuntu1 lscpu | grep Architecture
|
||||||
|
# Результат: Architecture: aarch64
|
||||||
|
```
|
||||||
|
|
||||||
|
### Смешанное тестирование
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# molecule/presets/mixed.yml
|
||||||
|
hosts:
|
||||||
|
- name: ubuntu1
|
||||||
|
platform: "linux/arm64"
|
||||||
|
- name: centos1
|
||||||
|
platform: "linux/amd64"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🎉 Заключение
|
||||||
|
|
||||||
|
ARM64 поддержка в DevOpsLab обеспечивает:
|
||||||
|
|
||||||
|
1. **Нативную производительность** - без эмуляции
|
||||||
|
2. **Энергоэффективность** - меньше потребление ресурсов
|
||||||
|
3. **Совместимость** - работает на всех ARM платформах
|
||||||
|
4. **Автоматизацию** - автоматическое определение архитектуры
|
||||||
|
5. **Гибкость** - поддержка смешанных конфигураций
|
||||||
|
|
||||||
|
Используйте ARM64 для:
|
||||||
|
- Разработки на Apple Silicon
|
||||||
|
- Тестирования на ARM серверах
|
||||||
|
- Оптимизации производительности
|
||||||
|
- Экономии ресурсов
|
||||||
|
- Ускорения CI/CD пайплайнов
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
266
docs/cod-preset.md
Normal file
266
docs/cod-preset.md
Normal file
@@ -0,0 +1,266 @@
|
|||||||
|
# COD Preset - Тестирование российских и зарубежных ОС
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
|
**Версия:** 3.0.0
|
||||||
|
|
||||||
|
## 📋 Описание
|
||||||
|
|
||||||
|
COD preset (Code of Operations Development) - это специализированный пресет для тестирования Ansible ролей на российских и зарубежных операционных системах с поддержкой ARM64 архитектуры.
|
||||||
|
|
||||||
|
## 🎯 Цель
|
||||||
|
|
||||||
|
Обеспечить комплексное тестирование инфраструктурных решений на:
|
||||||
|
- **Зарубежных ОС**: Ubuntu, Debian, CentOS, RHEL
|
||||||
|
- **Российских ОС**: Alt Linux, Astra Linux
|
||||||
|
- **Архитектура**: ARM64 (нативная поддержка)
|
||||||
|
|
||||||
|
## 🖥️ Поддерживаемые ОС
|
||||||
|
|
||||||
|
### Зарубежные ОС
|
||||||
|
- **Ubuntu 22.04 LTS** - популярная Linux дистрибуция
|
||||||
|
- **Debian 12** - стабильная основа для многих дистрибуций
|
||||||
|
- **CentOS Stream 9** - community версия RHEL
|
||||||
|
- **RHEL 8** - корпоративная Linux платформа
|
||||||
|
|
||||||
|
### Российские ОС
|
||||||
|
- **Alt Linux 10** - российская Linux дистрибуция
|
||||||
|
- **Astra Linux 1.7** - защищенная ОС для государственных организаций
|
||||||
|
|
||||||
|
## 🚀 Использование
|
||||||
|
|
||||||
|
### Базовое тестирование
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Запуск тестирования с COD preset
|
||||||
|
make role test cod
|
||||||
|
|
||||||
|
# Проверка статуса контейнеров
|
||||||
|
docker ps -a --filter "network=labnet" --format "table {{.Names}}\t{{.Status}}\t{{.Image}}"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Тестирование конкретной роли
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Тестирование роли devops
|
||||||
|
make role test cod
|
||||||
|
|
||||||
|
# Тестирование роли docker
|
||||||
|
make role test cod
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка результатов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка пользователя devops на всех хостах
|
||||||
|
docker exec -it ubuntu1 id devops
|
||||||
|
docker exec -it debian1 id devops
|
||||||
|
docker exec -it alt1 id devops
|
||||||
|
docker exec -it astra1 id devops
|
||||||
|
docker exec -it centos1 id devops
|
||||||
|
docker exec -it rhel1 id devops
|
||||||
|
|
||||||
|
# Проверка SSH ключей
|
||||||
|
docker exec -it ubuntu1 cat /home/devops/.ssh/authorized_keys
|
||||||
|
docker exec -it alt1 cat /home/devops/.ssh/authorized_keys
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 Конфигурация
|
||||||
|
|
||||||
|
### Структура preset
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
# COD пресет с 6 контейнерами (Ubuntu + Debian + Alt + Astra + CentOS + RHEL)
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
|
||||||
|
# Образы для ARM64
|
||||||
|
images:
|
||||||
|
ubuntu: "inecs/ansible-lab:ubuntu22-latest"
|
||||||
|
debian: "inecs/ansible-lab:debian12-latest"
|
||||||
|
alt: "inecs/ansible-lab:alt10-latest"
|
||||||
|
astra: "inecs/ansible-lab:astra-linux-arm64-latest"
|
||||||
|
centos: "inecs/ansible-lab:centos9-latest"
|
||||||
|
rhel: "inecs/ansible-lab:rhel-latest"
|
||||||
|
|
||||||
|
# ARM64 платформа
|
||||||
|
platform: "linux/arm64"
|
||||||
|
docker_platform: "linux/arm64"
|
||||||
|
|
||||||
|
# Хосты
|
||||||
|
hosts:
|
||||||
|
- name: ubuntu1
|
||||||
|
family: ubuntu
|
||||||
|
groups: [cod, ubuntu]
|
||||||
|
platform: "linux/arm64"
|
||||||
|
# ... остальные хосты
|
||||||
|
```
|
||||||
|
|
||||||
|
### Группы хостов
|
||||||
|
|
||||||
|
- **`cod`** - все хосты COD preset
|
||||||
|
- **`ubuntu`** - Ubuntu хосты
|
||||||
|
- **`debian`** - Debian хосты
|
||||||
|
- **`alt`** - Alt Linux хосты
|
||||||
|
- **`astra`** - Astra Linux хосты
|
||||||
|
- **`centos`** - CentOS хосты
|
||||||
|
- **`rhel`** - RHEL хосты
|
||||||
|
|
||||||
|
## 🔧 Особенности
|
||||||
|
|
||||||
|
### ARM64 поддержка
|
||||||
|
|
||||||
|
- **Нативная архитектура** - все контейнеры собираются для ARM64
|
||||||
|
- **Оптимальная производительность** - без эмуляции
|
||||||
|
- **Совместимость** - работает на Apple Silicon и ARM серверах
|
||||||
|
|
||||||
|
### Российские ОС
|
||||||
|
|
||||||
|
- **Alt Linux** - полная поддержка пакетного менеджера apt
|
||||||
|
- **Astra Linux** - совместимый образ на базе Debian
|
||||||
|
- **Автоматическое определение** ОС в роли devops
|
||||||
|
|
||||||
|
### Универсальная роль devops
|
||||||
|
|
||||||
|
Роль автоматически определяет тип ОС и применяет соответствующие конфигурации:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Для российских ОС
|
||||||
|
devops_russian_os_config:
|
||||||
|
clearlinux: # Astra Linux
|
||||||
|
package_manager: "apt"
|
||||||
|
sudo_group: "sudo"
|
||||||
|
additional_groups: ["sudo", "docker", "systemd-journal"]
|
||||||
|
altlinux: # Alt Linux
|
||||||
|
package_manager: "apt"
|
||||||
|
sudo_group: "sudo"
|
||||||
|
additional_groups: ["sudo", "docker", "systemd-journal"]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📈 Примеры использования
|
||||||
|
|
||||||
|
### Тестирование инфраструктурных ролей
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Тестирование роли мониторинга
|
||||||
|
make role test cod
|
||||||
|
|
||||||
|
# Проверка установки пакетов на разных ОС
|
||||||
|
docker exec -it ubuntu1 dpkg -l | grep monitoring
|
||||||
|
docker exec -it centos1 rpm -qa | grep monitoring
|
||||||
|
```
|
||||||
|
|
||||||
|
### Тестирование безопасности
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Тестирование роли безопасности
|
||||||
|
make role test cod
|
||||||
|
|
||||||
|
# Проверка настроек безопасности
|
||||||
|
docker exec -it astra1 cat /etc/ssh/sshd_config | grep PermitRootLogin
|
||||||
|
docker exec -it rhel1 cat /etc/ssh/sshd_config | grep PermitRootLogin
|
||||||
|
```
|
||||||
|
|
||||||
|
### Тестирование контейнеризации
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Тестирование роли Docker
|
||||||
|
make role test cod
|
||||||
|
|
||||||
|
# Проверка Docker на разных ОС
|
||||||
|
docker exec -it ubuntu1 docker --version
|
||||||
|
docker exec -it alt1 docker --version
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🐛 Диагностика
|
||||||
|
|
||||||
|
### Проверка контейнеров
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Статус всех контейнеров
|
||||||
|
docker ps -a --filter "network=labnet"
|
||||||
|
|
||||||
|
# Логи конкретного контейнера
|
||||||
|
docker logs ubuntu1
|
||||||
|
docker logs alt1
|
||||||
|
docker logs astra1
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка сети
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Информация о сети
|
||||||
|
docker network inspect labnet
|
||||||
|
|
||||||
|
# Проверка связности
|
||||||
|
docker exec -it ubuntu1 ping -c 3 debian1
|
||||||
|
docker exec -it alt1 ping -c 3 astra1
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка роли devops
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка пользователя
|
||||||
|
docker exec -it ubuntu1 id devops
|
||||||
|
docker exec -it alt1 id devops
|
||||||
|
|
||||||
|
# Проверка групп
|
||||||
|
docker exec -it ubuntu1 groups devops
|
||||||
|
docker exec -it centos1 groups devops
|
||||||
|
|
||||||
|
# Проверка sudo прав
|
||||||
|
docker exec -it ubuntu1 sudo -l -U devops
|
||||||
|
docker exec -it rhel1 sudo -l -U devops
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔄 Обновление
|
||||||
|
|
||||||
|
### Обновление образов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Пересборка всех образов
|
||||||
|
make docker rebuild
|
||||||
|
|
||||||
|
# Пересборка конкретного образа
|
||||||
|
make docker build-image IMAGE=astra-linux-arm64
|
||||||
|
make docker build-image IMAGE=redos-arm64
|
||||||
|
```
|
||||||
|
|
||||||
|
### Обновление preset
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка синтаксиса
|
||||||
|
make presets info PRESET=cod
|
||||||
|
|
||||||
|
# Тестирование обновленного preset
|
||||||
|
make role test cod
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📚 Связанная документация
|
||||||
|
|
||||||
|
- **[examples.md](examples.md)** - Примеры использования
|
||||||
|
- **[creating-roles.md](creating-roles.md)** - Создание ролей
|
||||||
|
- **[universal-testing.md](universal-testing.md)** - Универсальное тестирование
|
||||||
|
- **[presets-by-os.md](presets-by-os.md)** - Presets по ОС
|
||||||
|
|
||||||
|
## 🎉 Заключение
|
||||||
|
|
||||||
|
COD preset обеспечивает:
|
||||||
|
|
||||||
|
1. **Комплексное тестирование** на российских и зарубежных ОС
|
||||||
|
2. **ARM64 поддержку** для оптимальной производительности
|
||||||
|
3. **Универсальность** - одна роль работает на всех ОС
|
||||||
|
4. **Автоматизацию** - минимальные настройки для максимального результата
|
||||||
|
5. **Надежность** - проверка совместимости с реальными системами
|
||||||
|
|
||||||
|
Используйте COD preset для:
|
||||||
|
- Тестирования инфраструктурных решений
|
||||||
|
- Проверки совместимости с российскими ОС
|
||||||
|
- Разработки универсальных Ansible ролей
|
||||||
|
- Валидации безопасности на разных платформах
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
**Автор:** Сергей Антропов
|
**Автор:** Сергей Антропов
|
||||||
**Сайт:** https://devops.org.ru
|
**Сайт:** https://devops.org.ru
|
||||||
**Версия:** 2.0.0
|
**Версия:** 3.0.0
|
||||||
|
|
||||||
## 🚀 Быстрый старт
|
## 🚀 Быстрый старт
|
||||||
|
|
||||||
|
|||||||
325
docs/devops-role.md
Normal file
325
docs/devops-role.md
Normal file
@@ -0,0 +1,325 @@
|
|||||||
|
# Роль devops - Универсальная настройка пользователей и SSH
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
|
**Версия:** 3.0.0
|
||||||
|
|
||||||
|
## 📋 Описание
|
||||||
|
|
||||||
|
Роль `devops` - это универсальная Ansible роль для настройки пользователей и SSH ключей на всех поддерживаемых операционных системах. Роль автоматически определяет тип ОС и применяет соответствующие конфигурации.
|
||||||
|
|
||||||
|
## 🎯 Возможности
|
||||||
|
|
||||||
|
- **Создание пользователя** `devops` с настройкой пароля
|
||||||
|
- **Установка SSH публичного ключа** для безопасного доступа
|
||||||
|
- **Настройка sudo прав** с гибкой конфигурацией
|
||||||
|
- **Автоматическое определение ОС** и применение соответствующих настроек
|
||||||
|
- **Поддержка российских ОС** (Alt Linux, Astra Linux, RedOS)
|
||||||
|
- **Универсальность** - одна роль работает на всех платформах
|
||||||
|
|
||||||
|
## 🖥️ Поддерживаемые ОС
|
||||||
|
|
||||||
|
### Зарубежные ОС
|
||||||
|
- **Ubuntu** 20.04, 22.04, 24.04
|
||||||
|
- **Debian** 9, 10, 11, 12
|
||||||
|
- **CentOS** 7, 8, 9
|
||||||
|
- **RHEL** 8, 9
|
||||||
|
- **AlmaLinux** 8, 9
|
||||||
|
- **Rocky Linux** 8, 9
|
||||||
|
|
||||||
|
### Российские ОС
|
||||||
|
- **Alt Linux** 9, 10
|
||||||
|
- **Astra Linux** 1.7 (совместимый образ)
|
||||||
|
- **RedOS** 9 (совместимый образ)
|
||||||
|
|
||||||
|
## 🚀 Использование
|
||||||
|
|
||||||
|
### Базовое использование
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
- name: Настройка пользователя devops
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
roles:
|
||||||
|
- devops
|
||||||
|
vars:
|
||||||
|
devops_user: "devops"
|
||||||
|
devops_password: "{{ vault_devops_password }}"
|
||||||
|
devops_ssh_public_key: "{{ vault_devops_ssh_public_key }}"
|
||||||
|
```
|
||||||
|
|
||||||
|
### С кастомными настройками
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
- name: Настройка пользователя devops
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
roles:
|
||||||
|
- devops
|
||||||
|
vars:
|
||||||
|
devops_user: "admin"
|
||||||
|
devops_password: "{{ vault_admin_password }}"
|
||||||
|
devops_ssh_public_key: "{{ vault_admin_ssh_key }}"
|
||||||
|
devops_additional_groups: ["sudo", "docker", "wheel"]
|
||||||
|
devops_sudo_nopasswd: true
|
||||||
|
```
|
||||||
|
|
||||||
|
## ⚙️ Переменные
|
||||||
|
|
||||||
|
### Основные переменные
|
||||||
|
|
||||||
|
| Переменная | Описание | По умолчанию |
|
||||||
|
|------------|----------|--------------|
|
||||||
|
| `devops_user` | Имя пользователя | `devops` |
|
||||||
|
| `devops_password` | Пароль пользователя | `""` |
|
||||||
|
| `devops_ssh_public_key` | SSH публичный ключ | `""` |
|
||||||
|
| `devops_additional_groups` | Дополнительные группы | `["sudo"]` |
|
||||||
|
| `devops_sudo_nopasswd` | Sudo без пароля | `false` |
|
||||||
|
| `devops_shell` | Оболочка пользователя | `/bin/bash` |
|
||||||
|
|
||||||
|
### Vault переменные
|
||||||
|
|
||||||
|
| Переменная | Описание | Пример |
|
||||||
|
|------------|----------|--------|
|
||||||
|
| `vault_devops_password` | Пароль из vault | `"secure_password"` |
|
||||||
|
| `vault_devops_ssh_public_key` | SSH ключ из vault | `"ssh-rsa AAAAB3..."` |
|
||||||
|
|
||||||
|
## 🔧 Конфигурация по ОС
|
||||||
|
|
||||||
|
### Автоматическое определение
|
||||||
|
|
||||||
|
Роль автоматически определяет ОС и применяет соответствующие настройки:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Для Debian/Ubuntu
|
||||||
|
devops_debian_config:
|
||||||
|
package_manager: "apt"
|
||||||
|
sudo_group: "sudo"
|
||||||
|
additional_groups: ["sudo", "docker", "systemd-journal"]
|
||||||
|
|
||||||
|
# Для RHEL/CentOS
|
||||||
|
devops_rhel_config:
|
||||||
|
package_manager: "yum"
|
||||||
|
sudo_group: "wheel"
|
||||||
|
additional_groups: ["wheel", "docker", "systemd-journal"]
|
||||||
|
|
||||||
|
# Для российских ОС
|
||||||
|
devops_russian_os_config:
|
||||||
|
clearlinux: # Astra Linux
|
||||||
|
package_manager: "apt"
|
||||||
|
sudo_group: "sudo"
|
||||||
|
altlinux: # Alt Linux
|
||||||
|
package_manager: "apt"
|
||||||
|
sudo_group: "sudo"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 Примеры использования
|
||||||
|
|
||||||
|
### Тестирование с COD preset
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Тестирование на всех ОС
|
||||||
|
make role test cod
|
||||||
|
|
||||||
|
# Проверка результатов
|
||||||
|
docker exec -it ubuntu1 id devops
|
||||||
|
docker exec -it alt1 id devops
|
||||||
|
docker exec -it astra1 id devops
|
||||||
|
```
|
||||||
|
|
||||||
|
### Использование в других ролях
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
- name: Настройка инфраструктуры
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
roles:
|
||||||
|
- devops # Сначала настраиваем пользователя
|
||||||
|
- docker # Затем устанавливаем Docker
|
||||||
|
- monitoring # И мониторинг
|
||||||
|
```
|
||||||
|
|
||||||
|
### Создание пользователей для разных целей
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
---
|
||||||
|
- name: Настройка пользователей
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
tasks:
|
||||||
|
- name: Создание пользователя devops
|
||||||
|
include_role:
|
||||||
|
name: devops
|
||||||
|
vars:
|
||||||
|
devops_user: "devops"
|
||||||
|
devops_password: "{{ vault_devops_password }}"
|
||||||
|
devops_ssh_public_key: "{{ vault_devops_ssh_key }}"
|
||||||
|
|
||||||
|
- name: Создание пользователя admin
|
||||||
|
include_role:
|
||||||
|
name: devops
|
||||||
|
vars:
|
||||||
|
devops_user: "admin"
|
||||||
|
devops_password: "{{ vault_admin_password }}"
|
||||||
|
devops_ssh_public_key: "{{ vault_admin_ssh_key }}"
|
||||||
|
devops_additional_groups: ["sudo", "docker", "wheel"]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔐 Безопасность
|
||||||
|
|
||||||
|
### SSH ключи
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# В vault/secrets.yml
|
||||||
|
vault_devops_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC..."
|
||||||
|
vault_devops_password: "secure_password_123"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Sudo права
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Базовые sudo права
|
||||||
|
devops_sudo_nopasswd: false
|
||||||
|
|
||||||
|
# Расширенные права
|
||||||
|
devops_additional_groups: ["sudo", "docker", "wheel", "systemd-journal"]
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🐛 Диагностика
|
||||||
|
|
||||||
|
### Проверка пользователя
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка существования пользователя
|
||||||
|
id devops
|
||||||
|
|
||||||
|
# Проверка групп
|
||||||
|
groups devops
|
||||||
|
|
||||||
|
# Проверка sudo прав
|
||||||
|
sudo -l -U devops
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка SSH
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка SSH ключей
|
||||||
|
cat /home/devops/.ssh/authorized_keys
|
||||||
|
|
||||||
|
# Проверка прав доступа
|
||||||
|
ls -la /home/devops/.ssh/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка конфигурации
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка sudo конфигурации
|
||||||
|
cat /etc/sudoers.d/devops
|
||||||
|
|
||||||
|
# Проверка SSH конфигурации
|
||||||
|
grep -i "permitrootlogin" /etc/ssh/sshd_config
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📚 Шаблоны
|
||||||
|
|
||||||
|
### SSH конфигурация
|
||||||
|
|
||||||
|
```jinja2
|
||||||
|
# templates/devops_ssh_config.j2
|
||||||
|
# SSH конфигурация для пользователя {{ devops_user }}
|
||||||
|
Match User {{ devops_user }}
|
||||||
|
PasswordAuthentication yes
|
||||||
|
PubkeyAuthentication yes
|
||||||
|
AuthorizedKeysFile .ssh/authorized_keys
|
||||||
|
```
|
||||||
|
|
||||||
|
### Sudo конфигурация
|
||||||
|
|
||||||
|
```jinja2
|
||||||
|
# templates/devops_sudoers.j2
|
||||||
|
# Sudo права для пользователя {{ devops_user }}
|
||||||
|
{{ devops_user }} ALL=(ALL) {% if devops_sudo_nopasswd %}NOPASSWD:{% endif %}ALL
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔄 Обновление
|
||||||
|
|
||||||
|
### Обновление роли
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка синтаксиса
|
||||||
|
make role lint devops
|
||||||
|
|
||||||
|
# Тестирование
|
||||||
|
make role test cod
|
||||||
|
|
||||||
|
# Развертывание
|
||||||
|
make role deploy
|
||||||
|
```
|
||||||
|
|
||||||
|
### Обновление переменных
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Редактирование vault
|
||||||
|
make vault edit
|
||||||
|
# Имя файла: secrets
|
||||||
|
|
||||||
|
# Проверка vault
|
||||||
|
make vault check
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📈 Лучшие практики
|
||||||
|
|
||||||
|
### 1. Используйте Vault для секретов
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Хорошо
|
||||||
|
devops_password: "{{ vault_devops_password }}"
|
||||||
|
|
||||||
|
# Плохо
|
||||||
|
devops_password: "hardcoded_password"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Настраивайте группы по необходимости
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Для Docker хостов
|
||||||
|
devops_additional_groups: ["sudo", "docker"]
|
||||||
|
|
||||||
|
# Для мониторинга
|
||||||
|
devops_additional_groups: ["sudo", "systemd-journal"]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Используйте условную логику
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# В вашем playbook
|
||||||
|
- name: Настройка devops пользователя
|
||||||
|
include_role:
|
||||||
|
name: devops
|
||||||
|
when: ansible_os_family in ['Debian', 'RedHat', 'Altlinux', 'Clearlinux']
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🎉 Заключение
|
||||||
|
|
||||||
|
Роль `devops` обеспечивает:
|
||||||
|
|
||||||
|
1. **Универсальность** - работает на всех поддерживаемых ОС
|
||||||
|
2. **Автоматизацию** - минимальные настройки для максимального результата
|
||||||
|
3. **Безопасность** - правильная настройка SSH и sudo
|
||||||
|
4. **Гибкость** - настройка под любые требования
|
||||||
|
5. **Надежность** - проверенная конфигурация для всех платформ
|
||||||
|
|
||||||
|
Используйте роль `devops` для:
|
||||||
|
- Настройки базовых пользователей
|
||||||
|
- Установки SSH ключей
|
||||||
|
- Конфигурации sudo прав
|
||||||
|
- Подготовки инфраструктуры
|
||||||
|
- Тестирования на разных ОС
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
**Автор:** Сергей Антропов
|
**Автор:** Сергей Антропов
|
||||||
**Сайт:** https://devops.org.ru
|
**Сайт:** https://devops.org.ru
|
||||||
**Версия:** 2.0.0
|
**Версия:** 3.0.0
|
||||||
|
|
||||||
## 🐳 Обзор
|
## 🐳 Обзор
|
||||||
|
|
||||||
@@ -13,7 +13,16 @@ DevOpsLab использует предварительно собранные D
|
|||||||
```
|
```
|
||||||
dockerfiles/
|
dockerfiles/
|
||||||
├── ansible-controller/ # Ansible контроллер
|
├── ansible-controller/ # Ansible контроллер
|
||||||
├── alt9/ # ALT Linux P9
|
│ ├── 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
|
├── astra-linux/ # Astra Linux 1.7
|
||||||
├── redos/ # RED OS 9
|
├── redos/ # RED OS 9
|
||||||
├── rhel/ # Red Hat Enterprise Linux 8
|
├── rhel/ # Red Hat Enterprise Linux 8
|
||||||
@@ -28,7 +37,8 @@ dockerfiles/
|
|||||||
├── debian9/ # Debian 9 Stretch
|
├── debian9/ # Debian 9 Stretch
|
||||||
├── debian10/ # Debian 10 Buster
|
├── debian10/ # Debian 10 Buster
|
||||||
├── debian11/ # Debian 11 Bullseye
|
├── debian11/ # Debian 11 Bullseye
|
||||||
└── debian12/ # Debian 12 Bookworm
|
├── debian12/ # Debian 12 Bookworm
|
||||||
|
└── README.md # Документация по Dockerfiles
|
||||||
```
|
```
|
||||||
|
|
||||||
## 🚀 Доступные образы
|
## 🚀 Доступные образы
|
||||||
@@ -44,13 +54,12 @@ Ansible контроллер с предустановленными колле
|
|||||||
#### Компоненты:
|
#### Компоненты:
|
||||||
- Ansible Core с последними коллекциями
|
- Ansible Core с последними коллекциями
|
||||||
- Docker CLI для работы с контейнерами
|
- Docker CLI для работы с контейнерами
|
||||||
- kubectl для управления Kubernetes
|
|
||||||
- Helm для управления пакетами Kubernetes
|
|
||||||
- Kind для локального Kubernetes
|
|
||||||
- yq для работы с YAML
|
- yq для работы с YAML
|
||||||
- jq для работы с JSON
|
- jq для работы с JSON
|
||||||
- Molecule для тестирования ролей
|
- Molecule для тестирования ролей
|
||||||
|
|
||||||
|
**Примечание:** Kubernetes инструменты (kubectl, Helm, Kind, Istio) были перенесены в отдельный образ `k8s`.
|
||||||
|
|
||||||
#### Предустановленные коллекции:
|
#### Предустановленные коллекции:
|
||||||
```yaml
|
```yaml
|
||||||
collections:
|
collections:
|
||||||
@@ -82,6 +91,41 @@ docker run --rm \
|
|||||||
ansible-playbook site.yml
|
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
|
||||||
|
|
||||||
**Базовые образы:**
|
**Базовые образы:**
|
||||||
@@ -193,19 +237,77 @@ Red Hat Enterprise Linux 8 с systemd.
|
|||||||
|
|
||||||
### ALT Linux
|
### ALT Linux
|
||||||
|
|
||||||
**Базовый образ:** `altlinux/p9`
|
**Базовые образы:**
|
||||||
**Тег:** `inecs/ansible-lab:alt9-latest`
|
- `altlinux/p9` → `inecs/ansible-lab:alt9-latest`
|
||||||
**Платформы:** linux/amd64 (ограничение базового образа)
|
- `altlinux/p10` → `inecs/ansible-lab:alt10-latest`
|
||||||
|
|
||||||
ALT Linux P9 с systemd.
|
**Платформы:** linux/amd64, linux/arm64
|
||||||
|
|
||||||
|
ALT Linux P9 и P10 с systemd.
|
||||||
|
|
||||||
|
#### Компоненты:
|
||||||
|
- systemd для управления сервисами
|
||||||
|
- Python 3 с pip
|
||||||
|
- Пользователь ansible с sudo правами
|
||||||
|
- Основные утилиты (curl, wget, nano, sudo)
|
||||||
|
|
||||||
|
#### Использование:
|
||||||
|
```bash
|
||||||
|
docker run -d --privileged \
|
||||||
|
--name alt-test \
|
||||||
|
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
|
||||||
|
--tmpfs /run --tmpfs /run/lock \
|
||||||
|
--cap-add SYS_ADMIN \
|
||||||
|
inecs/ansible-lab:alt9-latest
|
||||||
|
```
|
||||||
|
|
||||||
### Astra Linux
|
### Astra Linux
|
||||||
|
|
||||||
**Базовый образ:** `registry.astralinux.ru/library/astra/ubi17:1.7.6.uu2`
|
**Базовые образы:**
|
||||||
**Тег:** `inecs/ansible-lab:astra-linux-latest`
|
- `registry.astralinux.ru/library/astra/ubi17:1.7.6.uu2` → `inecs/ansible-lab:astra-linux-latest` (AMD64)
|
||||||
**Платформы:** linux/amd64 (ограничение базового образа)
|
- `debian:bookworm-slim` → `inecs/ansible-lab:astra-linux-arm64-latest` (ARM64 совместимый)
|
||||||
|
|
||||||
Astra Linux 1.7 с systemd.
|
**Платформы:** linux/amd64, linux/arm64
|
||||||
|
|
||||||
|
Astra Linux 1.7 с systemd. Для ARM64 используется совместимый образ на базе Debian.
|
||||||
|
|
||||||
|
#### Компоненты:
|
||||||
|
- systemd для управления сервисами
|
||||||
|
- Python 3 с pip
|
||||||
|
- Пользователь ansible с sudo правами
|
||||||
|
- Docker CE и Docker Compose
|
||||||
|
- yq для работы с YAML
|
||||||
|
- Основные утилиты (curl, wget, nano, sudo)
|
||||||
|
|
||||||
|
#### Особенности ARM64 версии:
|
||||||
|
- Эмулирует Astra Linux через настройку `/etc/os-release`
|
||||||
|
- Максимально совместим с оригинальным Astra Linux
|
||||||
|
- Поддерживает все необходимые пакеты и конфигурации
|
||||||
|
|
||||||
|
#### Использование:
|
||||||
|
```bash
|
||||||
|
# AMD64 версия (оригинальная)
|
||||||
|
docker run -d --privileged \
|
||||||
|
--name astra-test \
|
||||||
|
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
|
||||||
|
--tmpfs /run --tmpfs /run/lock \
|
||||||
|
--cap-add SYS_ADMIN \
|
||||||
|
inecs/ansible-lab:astra-linux-latest
|
||||||
|
|
||||||
|
# ARM64 версия (совместимая)
|
||||||
|
docker run -d --privileged \
|
||||||
|
--name astra-arm64-test \
|
||||||
|
-v /sys/fs/cgroup:/sys/fs/cgroup:rw \
|
||||||
|
--tmpfs /run --tmpfs /run/lock \
|
||||||
|
--cap-add SYS_ADMIN \
|
||||||
|
inecs/ansible-lab:astra-linux-arm64-latest
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Сборка ARM64 версии:
|
||||||
|
```bash
|
||||||
|
# Специальная команда для сборки Astra Linux с поддержкой ARM64
|
||||||
|
make docker build-astra-arm64
|
||||||
|
```
|
||||||
|
|
||||||
### RED OS
|
### RED OS
|
||||||
|
|
||||||
@@ -348,18 +450,20 @@ docker run -d --privileged \
|
|||||||
|
|
||||||
## 📋 Матрица совместимости
|
## 📋 Матрица совместимости
|
||||||
|
|
||||||
| Образ | Платформы | systemd | Docker | Python 3 |
|
| Образ | Платформы | systemd | Docker | Python 3 | Kubernetes Tools |
|
||||||
|-------|-----------|---------|--------|----------|
|
|-------|-----------|---------|--------|----------|------------------|
|
||||||
| ansible-controller | amd64, arm64 | ✅ | ✅ | ✅ |
|
| ansible-controller | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||||
| ubuntu20/22/24 | amd64, arm64 | ✅ | ✅ | ✅ |
|
| k8s | amd64, arm64 | ❌ | ✅ | ✅ | ✅ (kubectl, Helm, Kind, Istio) |
|
||||||
| debian9/10/11/12 | amd64, arm64 | ✅ | ✅ | ✅ |
|
| ubuntu20/22/24 | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||||
| centos7/8/9 | amd64, arm64 | ✅ | ✅ | ✅ |
|
| debian9/10/11/12 | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||||
| alma | amd64, arm64 | ✅ | ✅ | ✅ |
|
| centos7/8/9 | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||||
| rocky | amd64, arm64 | ✅ | ✅ | ✅ |
|
| alma | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||||
| rhel | amd64, arm64 | ✅ | ✅ | ✅ |
|
| rocky | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||||
| alt9 | amd64 | ✅ | ✅ | ✅ |
|
| rhel | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||||
| astra-linux | amd64 | ✅ | ✅ | ✅ |
|
| alt9/alt10 | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||||
| redos | amd64 | ✅ | ✅ | ✅ |
|
| astra-linux | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||||
|
| astra-linux-arm64 | amd64, arm64 | ✅ | ✅ | ✅ | ❌ |
|
||||||
|
| redos | amd64 | ✅ | ✅ | ✅ | ❌ |
|
||||||
|
|
||||||
## 🛠️ Управление образами
|
## 🛠️ Управление образами
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
**Автор:** Сергей Антропов
|
**Автор:** Сергей Антропов
|
||||||
**Сайт:** https://devops.org.ru
|
**Сайт:** https://devops.org.ru
|
||||||
**Версия:** 2.0.0
|
**Версия:** 3.0.0
|
||||||
|
|
||||||
## Быстрый старт
|
## Быстрый старт
|
||||||
|
|
||||||
@@ -60,7 +60,45 @@ docker logs $(docker ps -aq --filter "network=labnet" | head -1)
|
|||||||
docker exec -it $(docker ps -aq --filter "network=labnet" | head -1) bash
|
docker exec -it $(docker ps -aq --filter "network=labnet" | head -1) bash
|
||||||
```
|
```
|
||||||
|
|
||||||
## Пример 2: Создание собственной роли
|
## Пример 2: Использование роли devops
|
||||||
|
|
||||||
|
### Описание роли devops
|
||||||
|
|
||||||
|
Роль `devops` - это универсальная роль для настройки пользователей и SSH ключей на всех поддерживаемых ОС.
|
||||||
|
|
||||||
|
**Возможности:**
|
||||||
|
- Создание пользователя `devops` с настройкой пароля
|
||||||
|
- Установка SSH публичного ключа
|
||||||
|
- Настройка sudo прав
|
||||||
|
- Автоматическое определение ОС и применение соответствующих конфигураций
|
||||||
|
- Поддержка российских ОС (Alt Linux, Astra Linux, RedOS)
|
||||||
|
|
||||||
|
### Тестирование роли devops
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Тестирование с COD preset (6 хостов)
|
||||||
|
make role test cod
|
||||||
|
|
||||||
|
# Проверка результатов
|
||||||
|
docker exec -it ubuntu1 id devops
|
||||||
|
docker exec -it alt1 id devops
|
||||||
|
docker exec -it astra1 id devops
|
||||||
|
```
|
||||||
|
|
||||||
|
### Использование в других ролях
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# В вашем playbook
|
||||||
|
- name: Настройка пользователя devops
|
||||||
|
include_role:
|
||||||
|
name: devops
|
||||||
|
vars:
|
||||||
|
devops_user: "devops"
|
||||||
|
devops_password: "{{ vault_devops_password }}"
|
||||||
|
devops_ssh_public_key: "{{ vault_devops_ssh_public_key }}"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Пример 3: Создание собственной роли
|
||||||
|
|
||||||
### Создание роли
|
### Создание роли
|
||||||
|
|
||||||
@@ -105,7 +143,7 @@ make role test minimal
|
|||||||
docker exec -it $(docker ps -aq --filter "network=labnet" | head -1) systemctl status nginx
|
docker exec -it $(docker ps -aq --filter "network=labnet" | head -1) systemctl status nginx
|
||||||
```
|
```
|
||||||
|
|
||||||
## Пример 3: Использование preset'ов
|
## Пример 4: Использование preset'ов
|
||||||
|
|
||||||
### Minimal preset (1 хост)
|
### Minimal preset (1 хост)
|
||||||
|
|
||||||
@@ -127,6 +165,22 @@ make role test default
|
|||||||
docker ps -a --filter "network=labnet"
|
docker ps -a --filter "network=labnet"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### COD preset (6 хостов) - ARM64
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Тестирование на Ubuntu + Debian + Alt + Astra + CentOS + RHEL
|
||||||
|
make role test cod
|
||||||
|
|
||||||
|
# Проверка всех контейнеров
|
||||||
|
docker ps -a --filter "network=labnet" --format "table {{.Names}}\t{{.Status}}"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Особенности COD preset:**
|
||||||
|
- **Платформа**: ARM64 (нативная поддержка)
|
||||||
|
- **ОС**: Ubuntu 22.04, Debian 12, Alt Linux 10, Astra Linux, CentOS Stream 9, RHEL
|
||||||
|
- **Группы**: `cod`, `ubuntu`, `debian`, `alt`, `astra`, `centos`, `rhel`
|
||||||
|
- **Использование**: Полное тестирование на российских и зарубежных ОС
|
||||||
|
|
||||||
### All-images preset (16 хостов)
|
### All-images preset (16 хостов)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -150,7 +204,7 @@ make role test debian-all
|
|||||||
make role test centos-all
|
make role test centos-all
|
||||||
```
|
```
|
||||||
|
|
||||||
## Пример 4: Работа с Ansible Vault
|
## Пример 5: Работа с Ansible Vault
|
||||||
|
|
||||||
### Создание секретов
|
### Создание секретов
|
||||||
|
|
||||||
@@ -179,7 +233,7 @@ make vault show
|
|||||||
|
|
||||||
Секреты автоматически расшифровываются при запуске тестов и шифруются обратно после завершения.
|
Секреты автоматически расшифровываются при запуске тестов и шифруются обратно после завершения.
|
||||||
|
|
||||||
## Пример 5: CI/CD интеграция
|
## Пример 6: CI/CD интеграция
|
||||||
|
|
||||||
### GitHub Actions
|
### GitHub Actions
|
||||||
|
|
||||||
@@ -210,7 +264,7 @@ test:
|
|||||||
- main
|
- main
|
||||||
```
|
```
|
||||||
|
|
||||||
## Пример 6: Диагностика и отладка
|
## Пример 7: Диагностика и отладка
|
||||||
|
|
||||||
### Проверка линтинга
|
### Проверка линтинга
|
||||||
|
|
||||||
@@ -307,11 +361,13 @@ make vault check
|
|||||||
Эти примеры демонстрируют основные возможности DevOpsLab:
|
Эти примеры демонстрируют основные возможности DevOpsLab:
|
||||||
|
|
||||||
1. **Быстрое тестирование** с minimal preset
|
1. **Быстрое тестирование** с minimal preset
|
||||||
2. **Полное тестирование** с all-images preset
|
2. **Универсальная роль devops** для настройки пользователей и SSH
|
||||||
3. **Создание ролей** через интерактивные команды
|
3. **COD preset** для тестирования российских и зарубежных ОС (ARM64)
|
||||||
4. **Работа с Vault** для секретов
|
4. **Полное тестирование** с all-images preset
|
||||||
5. **Диагностика** и отладка тестов
|
5. **Создание ролей** через интерактивные команды
|
||||||
6. **Интеграция CI/CD** для автоматизации
|
6. **Работа с Vault** для секретов
|
||||||
|
7. **Диагностика** и отладка тестов
|
||||||
|
8. **Интеграция CI/CD** для автоматизации
|
||||||
|
|
||||||
Для получения дополнительной информации:
|
Для получения дополнительной информации:
|
||||||
- Используйте `make help` для списка команд
|
- Используйте `make help` для списка команд
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
**Автор:** Сергей Антропов
|
**Автор:** Сергей Антропов
|
||||||
**Сайт:** https://devops.org.ru
|
**Сайт:** https://devops.org.ru
|
||||||
**Версия:** 2.0.0
|
**Версия:** 3.0.0
|
||||||
|
|
||||||
## 🚀 Установка и настройка
|
## 🚀 Установка и настройка
|
||||||
|
|
||||||
|
|||||||
110
docs/k8s-ingress-fix.md
Normal file
110
docs/k8s-ingress-fix.md
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
# Исправление проблемы с Ingress
|
||||||
|
|
||||||
|
## Проблема
|
||||||
|
|
||||||
|
После создания Kubernetes кластера Ingress ресурсы не доступны по доменным именам.
|
||||||
|
|
||||||
|
## Причина
|
||||||
|
|
||||||
|
1. **extraPortMappings не добавлялись в конфигурацию Kind** - порты 80 и 443 не пробрасывались на host
|
||||||
|
2. **Записи в /etc/hosts не добавлялись автоматически** при применении манифестов
|
||||||
|
|
||||||
|
## Решение
|
||||||
|
|
||||||
|
### Вариант 1: Быстрое исправление (без пересоздания кластера)
|
||||||
|
|
||||||
|
1. **Добавьте запись в `/etc/hosts` вручную:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
echo "127.0.0.1 grafana.local #k8s" | sudo tee -a /etc/hosts
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Создайте port-forward для Ingress напрямую:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Подключитесь к кластеру
|
||||||
|
export KUBECONFIG=$(docker exec k8s-controller cat /root/.kube/config)
|
||||||
|
|
||||||
|
# Замените 0.0.0.0 на localhost в kubeconfig
|
||||||
|
export KUBECONFIG=$(echo "$KUBECONFIG" | sed 's/0\.0\.0\.0:6443/localhost:6443/g' > /tmp/kubeconfig-local.yaml && echo /tmp/kubeconfig-local.yaml)
|
||||||
|
|
||||||
|
# Создайте port-forward для Ingress HTTP
|
||||||
|
kubectl port-forward -n ingress-nginx svc/ingress-nginx-controller 8081:80 &
|
||||||
|
|
||||||
|
# Проверьте доступность
|
||||||
|
curl -H "Host: grafana.local" http://localhost:8081
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Откройте в браузере:**
|
||||||
|
|
||||||
|
```
|
||||||
|
http://grafana.local:8081
|
||||||
|
```
|
||||||
|
|
||||||
|
### Вариант 2: Пересоздание кластера (рекомендуется)
|
||||||
|
|
||||||
|
Исправления уже внесены в код. Просто пересоздайте кластер:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Удалите старый кластер
|
||||||
|
make k8s destroy kubernetes
|
||||||
|
|
||||||
|
# Создайте новый (с исправлениями)
|
||||||
|
make k8s create kubernetes
|
||||||
|
|
||||||
|
# Примените манифест с Ingress
|
||||||
|
make k8s manifest apply kubernetes manifests/test-grafana-ingress.yaml
|
||||||
|
|
||||||
|
# Запись в /etc/hosts добавится автоматически
|
||||||
|
# Проверьте
|
||||||
|
cat /etc/hosts | grep k8s
|
||||||
|
|
||||||
|
# Откройте в браузере
|
||||||
|
open http://grafana.local:8081
|
||||||
|
```
|
||||||
|
|
||||||
|
## Проверка
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Проверьте Ingress
|
||||||
|
docker exec k8s-controller kubectl --server=https://lab-control-plane:6443 --insecure-skip-tls-verify get ingress --all-namespaces
|
||||||
|
|
||||||
|
# 2. Проверьте ports control-plane
|
||||||
|
docker port lab-control-plane
|
||||||
|
|
||||||
|
# Должны быть:
|
||||||
|
# 6443/tcp -> 0.0.0.0:6443
|
||||||
|
# 80/tcp -> 0.0.0.0:8081 <- после исправления
|
||||||
|
# 443/tcp -> 0.0.0.0:8443 <- после исправления
|
||||||
|
|
||||||
|
# 3. Проверьте доступность
|
||||||
|
curl -H "Host: grafana.local" http://localhost:8081
|
||||||
|
```
|
||||||
|
|
||||||
|
## Что было исправлено
|
||||||
|
|
||||||
|
1. В `scripts/create_k8s_cluster.py` исправлена логика добавления `extraPortMappings` в конфигурацию Kind
|
||||||
|
2. Порты 80 и 443 теперь правильно пробрасываются на host (8081 и 8443)
|
||||||
|
3. Манифест Ingress можно применить и автоматически добавить запись в `/etc/hosts`
|
||||||
|
|
||||||
|
## Дополнительно
|
||||||
|
|
||||||
|
Если Ingress всё ещё не работает:
|
||||||
|
|
||||||
|
1. **Проверьте статус подов Ingress Controller:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec k8s-controller kubectl --server=https://lab-control-plane:6443 --insecure-skip-tls-verify get pods -n ingress-nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Проверьте логи Ingress Controller:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec k8s-controller kubectl --server=https://lab-control-plane:6443 --insecure-skip-tls-verify logs -n ingress-nginx -l app.kubernetes.io/component=controller
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Проверьте события:**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec k8s-controller kubectl --server=https://lab-control-plane:6443 --insecure-skip-tls-verify get events -n monitoring
|
||||||
|
```
|
||||||
232
docs/k8s-scripts.md
Normal file
232
docs/k8s-scripts.md
Normal file
@@ -0,0 +1,232 @@
|
|||||||
|
# Скрипты управления Kubernetes
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
|
|
||||||
|
## Обзор
|
||||||
|
|
||||||
|
В проекте используются несколько Python скриптов для автоматизации работы с Kubernetes кластерами на базе Kind. Все скрипты находятся в директории `scripts/`.
|
||||||
|
|
||||||
|
## Скрипты
|
||||||
|
|
||||||
|
### 1. `create_k8s_cluster.py`
|
||||||
|
|
||||||
|
**Назначение:** Создание Kind кластера, установка аддонов и создание Docker контейнеров из пресета.
|
||||||
|
|
||||||
|
**Принцип работы:**
|
||||||
|
|
||||||
|
1. **Парсинг пресета:** Читает YAML файл пресета (например, `molecule/presets/k8s/kubernetes.yml`)
|
||||||
|
|
||||||
|
2. **Создание Docker сети:**
|
||||||
|
- Проверяет наличие сети (по умолчанию `labnet`)
|
||||||
|
- Создает сеть если её нет
|
||||||
|
|
||||||
|
3. **Создание Docker контейнеров:**
|
||||||
|
- Читает секцию `hosts` из пресета
|
||||||
|
- Для каждого хоста создает Docker контейнер с настройками из `systemd_defaults`
|
||||||
|
- Использует образы из секции `images`
|
||||||
|
|
||||||
|
4. **Создание Kind кластера:**
|
||||||
|
- Генерирует конфигурацию Kind в формате YAML
|
||||||
|
- Настраивает `extraPortMappings` для Ingress портов
|
||||||
|
- Создает кластер через команду `kind create cluster`
|
||||||
|
|
||||||
|
5. **Установка аддонов:**
|
||||||
|
- **Ingress NGINX:** Устанавливает ingress-nginx controller через kubectl apply
|
||||||
|
- **Metrics Server:** Устанавливает metrics-server с патчем для insecure TLS
|
||||||
|
- **Istio:** Устанавливает Istio через istioctl с профилем demo
|
||||||
|
- **Kiali:** Устанавливает Kiali через Helm (использует Helm chart)
|
||||||
|
- **Prometheus Stack:** Устанавливает Prometheus + Grafana через Helm (kube-prometheus-stack)
|
||||||
|
|
||||||
|
6. **Подключение к сети Kind:** Подключает контейнер `k8s-controller` к сети `kind` для доступа к API серверу
|
||||||
|
|
||||||
|
**Параметры:**
|
||||||
|
```bash
|
||||||
|
python3 scripts/create_k8s_cluster.py <preset_file> <container_name>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Пример:**
|
||||||
|
```bash
|
||||||
|
python3 scripts/create_k8s_cluster.py molecule/presets/k8s/kubernetes.yml k8s-controller
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. `delete_hosts.py`
|
||||||
|
|
||||||
|
**Назначение:** Удаление Docker контейнеров, созданных из секции `hosts` пресета.
|
||||||
|
|
||||||
|
**Принцип работы:**
|
||||||
|
|
||||||
|
1. **Парсинг пресета:** Читает YAML файл пресета
|
||||||
|
2. **Получение списка хостов:** Извлекает секцию `hosts`
|
||||||
|
3. **Удаление контейнеров:** Для каждого хоста выполняет `docker rm -f <host_name>`
|
||||||
|
|
||||||
|
**Параметры:**
|
||||||
|
```bash
|
||||||
|
python3 scripts/delete_hosts.py <preset_file>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Пример:**
|
||||||
|
```bash
|
||||||
|
python3 scripts/delete_hosts.py molecule/presets/k8s/kubernetes.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. `portforward.py`
|
||||||
|
|
||||||
|
**Назначение:** Управление port-forward для доступа к сервисам Kubernetes извне кластера.
|
||||||
|
|
||||||
|
**Принцип работы:**
|
||||||
|
|
||||||
|
1. **Загрузка пресета:** Читает файл `molecule/presets/k8s/kubernetes.yml`
|
||||||
|
|
||||||
|
2. **Получение kubeconfig:**
|
||||||
|
- Копирует kubeconfig из контейнера `k8s-controller` через `docker exec`
|
||||||
|
- Сохраняет во временный файл
|
||||||
|
|
||||||
|
3. **Модификация kubeconfig:**
|
||||||
|
- Заменяет `server: https://0.0.0.0:6443` на `server: https://localhost:6443`
|
||||||
|
- Это необходимо для доступа с локальной машины
|
||||||
|
|
||||||
|
4. **Создание port-forward:**
|
||||||
|
- Запускает `kubectl port-forward` для каждого сервиса из `addon_ports`
|
||||||
|
- Использует формат: `kubectl port-forward -n <namespace> svc/<service> <local_port>:<remote_port>`
|
||||||
|
- Управляет процессами через PID
|
||||||
|
|
||||||
|
**Команды:**
|
||||||
|
- `create` - создает port-forward для всех сервисов
|
||||||
|
- `list` - показывает список активных портов
|
||||||
|
- `clear` - останавливает все port-forward процессы
|
||||||
|
- `recreate` - очищает и заново создает port-forward
|
||||||
|
- `delete <port>` - удаляет конкретный port-forward
|
||||||
|
|
||||||
|
**Пример использования:**
|
||||||
|
```bash
|
||||||
|
python3 scripts/portforward.py create
|
||||||
|
python3 scripts/portforward.py list
|
||||||
|
python3 scripts/portforward.py delete 3000
|
||||||
|
python3 scripts/portforward.py clear
|
||||||
|
```
|
||||||
|
|
||||||
|
**Важно:** Скрипт должен запускаться на локальной машине, где установлены `kubectl` и Python 3.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. `k8s_status.py`
|
||||||
|
|
||||||
|
**Назначение:** Детальный отчет о состоянии Kubernetes кластера.
|
||||||
|
|
||||||
|
**Принцип работы:**
|
||||||
|
|
||||||
|
1. **Подключение к кластеру:**
|
||||||
|
- Получает имя кластера через `kind get clusters`
|
||||||
|
- Формирует адрес API сервера: `https://<cluster_name>-control-plane:6443`
|
||||||
|
- Выполняет все kubectl команды через `docker exec k8s-controller`
|
||||||
|
|
||||||
|
2. **Сбор информации:**
|
||||||
|
- **Общая информация:** версия Kubernetes
|
||||||
|
- **Узлы:** статус, ресурсы, описание каждого узла
|
||||||
|
- **Namespaces:** список всех namespace
|
||||||
|
- **Использование ресурсов:** метрики через metrics-server (если установлен)
|
||||||
|
- **Pods:** поды по каждому namespace
|
||||||
|
- **Deployments:** deployments по namespace
|
||||||
|
- **DaemonSets:** daemonsets по namespace
|
||||||
|
- **StatefulSets:** statefulsets по namespace
|
||||||
|
- **Services:** сервисы по namespace
|
||||||
|
- **Ingress:** ingress ресурсы
|
||||||
|
- **PVC:** PersistentVolumeClaims
|
||||||
|
- **События:** последние 20 событий по namespace
|
||||||
|
- **Helm релизы:** список установленных через Helm
|
||||||
|
|
||||||
|
3. **Форматирование вывода:**
|
||||||
|
- Использует секции с разделителями
|
||||||
|
- Группирует информацию по namespace
|
||||||
|
- Показывает только непустые секции
|
||||||
|
|
||||||
|
**Пример использования:**
|
||||||
|
```bash
|
||||||
|
python3 scripts/k8s_status.py
|
||||||
|
```
|
||||||
|
|
||||||
|
**Интеграция:**
|
||||||
|
- Автоматически вызывается командой `make k8s status [preset]`
|
||||||
|
|
||||||
|
**Особенности:**
|
||||||
|
- Выполняет все команды внутри контейнера `k8s-controller`
|
||||||
|
- Использует прямой адрес control-plane для подключения
|
||||||
|
- Обходит проблемы с kubeconfig через `--insecure-skip-tls-verify`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Архитектура взаимодействия
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────────────┐
|
||||||
|
│ Локальная машина │
|
||||||
|
│ │
|
||||||
|
│ Makefile → Python скрипты → Docker API │
|
||||||
|
│ ↓ ↓ ↓ │
|
||||||
|
│ make k8s scripts/*.py docker exec │
|
||||||
|
└─────────────────────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
↓
|
||||||
|
┌─────────────────────────────────────────────────────┐
|
||||||
|
│ Docker контейнер │
|
||||||
|
│ k8s-controller │
|
||||||
|
│ ┌──────────────────────────────────────────┐ │
|
||||||
|
│ │ kind, kubectl, helm, istioctl │ │
|
||||||
|
│ └──────────────────────────────────────────┘ │
|
||||||
|
└─────────────────────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
↓
|
||||||
|
┌─────────────────────────────────────────────────────┐
|
||||||
|
│ Docker сеть: kind │
|
||||||
|
│ ┌──────────────────────────────────────────┐ │
|
||||||
|
│ │ Kind Kubernetes Cluster │ │
|
||||||
|
│ │ • Control Plane (6443) │ │
|
||||||
|
│ │ • Worker Nodes │ │
|
||||||
|
│ │ • Services (ClusterIP) │ │
|
||||||
|
│ │ • Ingress │ │
|
||||||
|
│ └──────────────────────────────────────────┘ │
|
||||||
|
└─────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## Общие принципы
|
||||||
|
|
||||||
|
1. **Изоляция:** Все kubectl команды выполняются внутри контейнера `k8s-controller`
|
||||||
|
2. **Безопасность:** Используется `--insecure-skip-tls-verify` для обхода проблем с сертификатами
|
||||||
|
3. **Автоматизация:** Скрипты вызываются автоматически через Makefile
|
||||||
|
4. **Логгирование:** Все скрипты выводят подробную информацию о своих действиях
|
||||||
|
|
||||||
|
## Требования
|
||||||
|
|
||||||
|
- Python 3 (на локальной машине)
|
||||||
|
- kubectl (на локальной машине, для portforward.py)
|
||||||
|
- Docker
|
||||||
|
- Docker контейнер `k8s-controller` должен быть запущен
|
||||||
|
|
||||||
|
## Отладка
|
||||||
|
|
||||||
|
Если что-то не работает:
|
||||||
|
|
||||||
|
1. **Проверьте контейнер:**
|
||||||
|
```bash
|
||||||
|
docker ps | grep k8s-controller
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Запустите скрипт вручную:**
|
||||||
|
```bash
|
||||||
|
python3 scripts/k8s_status.py
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Посмотрите логи:**
|
||||||
|
```bash
|
||||||
|
docker logs k8s-controller
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Проверьте кластер:**
|
||||||
|
```bash
|
||||||
|
docker exec k8s-controller kubectl get nodes
|
||||||
|
```
|
||||||
395
docs/kubernetes-commands.md
Normal file
395
docs/kubernetes-commands.md
Normal file
@@ -0,0 +1,395 @@
|
|||||||
|
# Команды для работы с Kubernetes
|
||||||
|
|
||||||
|
Автор: Сергей Антропов
|
||||||
|
Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
## Содержание
|
||||||
|
|
||||||
|
- [Работа с манифестами](#работа-с-манифестами)
|
||||||
|
- [Работа с Helm](#работа-с-helm)
|
||||||
|
- [Работа с Helm репозиториями](#работа-с-helm-репозиториями)
|
||||||
|
|
||||||
|
## Работа с манифестами
|
||||||
|
|
||||||
|
Команды для применения, удаления и обновления манифестов YAML в кластере.
|
||||||
|
|
||||||
|
### Синтаксис
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s manifest [команда] [пресет] [URL_или_путь_к_файлу]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Команды
|
||||||
|
|
||||||
|
#### `apply` - Применение манифеста
|
||||||
|
|
||||||
|
Применяет манифест YAML к кластеру.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s manifest apply kubernetes https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
**Примеры:**
|
||||||
|
```bash
|
||||||
|
# Применение манифеста из URL
|
||||||
|
make k8s manifest apply kubernetes https://example.com/deploy.yaml
|
||||||
|
|
||||||
|
# Применение локального манифеста
|
||||||
|
make k8s manifest apply kubernetes ./manifests/my-app.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `delete` - Удаление ресурсов
|
||||||
|
|
||||||
|
Удаляет ресурсы из кластера по манифесту.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s manifest delete kubernetes https://example.com/deploy.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `update` - Обновление манифеста
|
||||||
|
|
||||||
|
Обновляет ресурсы в кластере, используя манифест.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s manifest update kubernetes https://example.com/deploy.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Примеры использования
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Установка NGINX Ingress Controller
|
||||||
|
make k8s manifest apply kubernetes https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
|
||||||
|
|
||||||
|
# Удаление ресурсов
|
||||||
|
make k8s manifest delete kubernetes https://example.com/deploy.yaml
|
||||||
|
|
||||||
|
# Обновление конфигурации
|
||||||
|
make k8s manifest update kubernetes https://example.com/deploy.yaml --force
|
||||||
|
```
|
||||||
|
|
||||||
|
## Работа с Helm
|
||||||
|
|
||||||
|
Команды для установки, обновления и управления Helm чартами в кластере.
|
||||||
|
|
||||||
|
### Синтаксис
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s helm [команда] [пресет] [релиз] [чант]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Команды
|
||||||
|
|
||||||
|
#### `apply` - Установка/обновление чарта
|
||||||
|
|
||||||
|
Устанавливает новый релиз или обновляет существующий.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s helm apply kubernetes my-nginx nginx/nginx-ingress
|
||||||
|
```
|
||||||
|
|
||||||
|
**Параметры:**
|
||||||
|
- `пресет` - имя пресета кластера
|
||||||
|
- `релиз` - имя релиза (например: my-nginx)
|
||||||
|
- `чарт` - имя чарта (например: nginx/nginx-ingress)
|
||||||
|
|
||||||
|
**Примеры:**
|
||||||
|
```bash
|
||||||
|
# Установка nginx-ingress
|
||||||
|
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress
|
||||||
|
|
||||||
|
# Установка с указанием репозитория
|
||||||
|
make k8s helm apply kubernetes prometheus prometheus-community/prometheus
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `delete` - Удаление релиза
|
||||||
|
|
||||||
|
Удаляет Helm релиз из кластера.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s helm delete kubernetes my-nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
**Примеры:**
|
||||||
|
```bash
|
||||||
|
# Удаление релиза
|
||||||
|
make k8s helm delete kubernetes nginx-ingress
|
||||||
|
|
||||||
|
# Удаление с флагом --keep-history
|
||||||
|
# (не поддерживается в текущей реализации)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `update` - Обновление релиза
|
||||||
|
|
||||||
|
Обновляет существующий Helm релиз.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s helm update kubernetes my-nginx nginx/nginx-ingress
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `rollback` - Откат релиза
|
||||||
|
|
||||||
|
Откатывает релиз к предыдущей версии.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s helm rollback kubernetes my-nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
**Примеры:**
|
||||||
|
```bash
|
||||||
|
# Откат к предыдущей ревизии
|
||||||
|
make k8s helm rollback kubernetes my-nginx
|
||||||
|
|
||||||
|
# Откат к конкретной ревизии (не поддерживается в текущей реализации)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `list` - Список релизов
|
||||||
|
|
||||||
|
Показывает список всех установленных Helm релизов.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s helm list kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
**Пример вывода:**
|
||||||
|
```
|
||||||
|
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
|
||||||
|
nginx-ingress default 1 2024-01-15 12:00:00.000000 +0000 UTC deployed nginx-ingress-0.1.0 1.0.0
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `status` - Статус релиза
|
||||||
|
|
||||||
|
Показывает подробную информацию о статусе релиза.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s helm status kubernetes my-nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
### Примеры использования
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Установка NGINX Ingress Controller
|
||||||
|
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress
|
||||||
|
|
||||||
|
# 2. Проверка статуса
|
||||||
|
make k8s helm status kubernetes nginx-ingress
|
||||||
|
|
||||||
|
# 3. Обновление релиза
|
||||||
|
make k8s helm update kubernetes nginx-ingress nginx/nginx-ingress
|
||||||
|
|
||||||
|
# 4. Просмотр списка релизов
|
||||||
|
make k8s helm list kubernetes
|
||||||
|
|
||||||
|
# 5. Откат релиза
|
||||||
|
make k8s helm rollback kubernetes nginx-ingress
|
||||||
|
|
||||||
|
# 6. Удаление релиза
|
||||||
|
make k8s helm delete kubernetes nginx-ingress
|
||||||
|
```
|
||||||
|
|
||||||
|
## Работа с Helm репозиториями
|
||||||
|
|
||||||
|
Команды для управления Helm репозиториями.
|
||||||
|
|
||||||
|
### Синтаксис
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s helmrepo [команда] [пресет] [имя] [URL]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Команды
|
||||||
|
|
||||||
|
#### `add` - Добавление репозитория
|
||||||
|
|
||||||
|
Добавляет новый Helm репозиторий.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
|
||||||
|
```
|
||||||
|
|
||||||
|
**Примеры:**
|
||||||
|
```bash
|
||||||
|
# Добавление официального репозитория Helm
|
||||||
|
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
|
||||||
|
|
||||||
|
# Добавление репозитория Bitnami
|
||||||
|
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||||
|
|
||||||
|
# Добавление репозитория NGINX
|
||||||
|
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
|
||||||
|
|
||||||
|
# Добавление репозитория Prometheus
|
||||||
|
make k8s helmrepo add kubernetes prometheus-community https://prometheus-community.github.io/helm-charts
|
||||||
|
|
||||||
|
# Добавление пользовательского репозитория
|
||||||
|
make k8s helmrepo add kubernetes my-repo https://charts.example.com
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `list` - Список репозиториев
|
||||||
|
|
||||||
|
Показывает список всех добавленных Helm репозиториев.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s helmrepo list kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
**Пример вывода:**
|
||||||
|
```
|
||||||
|
NAME URL
|
||||||
|
stable https://charts.helm.sh/stable
|
||||||
|
bitnami https://charts.bitnami.com/bitnami
|
||||||
|
nginx https://helm.nginx.com/stable
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `delete` - Удаление репозитория
|
||||||
|
|
||||||
|
Удаляет Helm репозиторий.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s helmrepo delete kubernetes stable
|
||||||
|
```
|
||||||
|
|
||||||
|
**Примеры:**
|
||||||
|
```bash
|
||||||
|
# Удаление репозитория
|
||||||
|
make k8s helmrepo delete kubernetes stable
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `update` - Обновление репозиториев
|
||||||
|
|
||||||
|
Обновляет информацию о всех Helm репозиториях.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s helmrepo update kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
**Примеры:**
|
||||||
|
```bash
|
||||||
|
# Обновление всех репозиториев
|
||||||
|
make k8s helmrepo update kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `packages` - Список пакетов
|
||||||
|
|
||||||
|
Показывает список пакетов в указанном репозитории.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s helmrepo packages kubernetes stable
|
||||||
|
```
|
||||||
|
|
||||||
|
**Примеры:**
|
||||||
|
```bash
|
||||||
|
# Просмотр пакетов в репозитории stable
|
||||||
|
make k8s helmrepo packages kubernetes stable
|
||||||
|
|
||||||
|
# Просмотр пакетов в репозитории nginx
|
||||||
|
make k8s helmrepo packages kubernetes nginx
|
||||||
|
|
||||||
|
# Поиск конкретного пакета
|
||||||
|
make k8s helmrepo packages kubernetes stable | grep nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
### Примеры использования
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Добавление нескольких репозиториев
|
||||||
|
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
|
||||||
|
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||||
|
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
|
||||||
|
|
||||||
|
# 2. Просмотр списка репозиториев
|
||||||
|
make k8s helmrepo list kubernetes
|
||||||
|
|
||||||
|
# 3. Обновление репозиториев
|
||||||
|
make k8s helmrepo update kubernetes
|
||||||
|
|
||||||
|
# 4. Поиск пакетов в репозитории
|
||||||
|
make k8s helmrepo packages kubernetes stable
|
||||||
|
|
||||||
|
# 5. Удаление репозитория
|
||||||
|
make k8s helmrepo delete kubernetes my-custom-repo
|
||||||
|
|
||||||
|
# 6. Установка пакета из добавленного репозитория
|
||||||
|
make k8s helm apply kubernetes my-nginx nginx/nginx-ingress
|
||||||
|
```
|
||||||
|
|
||||||
|
## Полный рабочий пример
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Создание кластера
|
||||||
|
make k8s create kubernetes
|
||||||
|
|
||||||
|
# 2. Добавление Helm репозиториев
|
||||||
|
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
|
||||||
|
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||||
|
|
||||||
|
# 3. Обновление репозиториев
|
||||||
|
make k8s helmrepo update kubernetes
|
||||||
|
|
||||||
|
# 4. Просмотр доступных пакетов
|
||||||
|
make k8s helmrepo packages kubernetes nginx
|
||||||
|
|
||||||
|
# 5. Установка NGINX Ingress Controller
|
||||||
|
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress
|
||||||
|
|
||||||
|
# 6. Проверка статуса
|
||||||
|
make k8s helm status kubernetes nginx-ingress
|
||||||
|
|
||||||
|
# 7. Просмотр списка релизов
|
||||||
|
make k8s helm list kubernetes
|
||||||
|
|
||||||
|
# 8. Применение манифеста
|
||||||
|
make k8s manifest apply kubernetes https://example.com/deploy.yaml
|
||||||
|
|
||||||
|
# 9. Откат релиза (если нужно)
|
||||||
|
make k8s helm rollback kubernetes nginx-ingress
|
||||||
|
|
||||||
|
# 10. Удаление релиза
|
||||||
|
make k8s helm delete kubernetes nginx-ingress
|
||||||
|
|
||||||
|
# 11. Удаление репозитория
|
||||||
|
make k8s helmrepo delete kubernetes nginx
|
||||||
|
|
||||||
|
# 12. Удаление кластера
|
||||||
|
make k8s destroy kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
## Обработка ошибок
|
||||||
|
|
||||||
|
### Ошибка: Контейнер не запущен
|
||||||
|
|
||||||
|
```
|
||||||
|
❌ Контейнер k8s-kubernetes не запущен
|
||||||
|
💡 Запустите: make k8s create kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
**Решение:** Запустите кластер перед выполнением команд.
|
||||||
|
|
||||||
|
### Ошибка: Неизвестная команда
|
||||||
|
|
||||||
|
```
|
||||||
|
❌ Неизвестная команда: unknown
|
||||||
|
💡 Доступные команды: apply, delete, update
|
||||||
|
```
|
||||||
|
|
||||||
|
**Решение:** Используйте правильную команду из списка доступных.
|
||||||
|
|
||||||
|
### Ошибка: Не указаны параметры
|
||||||
|
|
||||||
|
```
|
||||||
|
❌ Ошибка: Укажите имя релиза и чарт
|
||||||
|
💡 Пример: make k8s helm apply kubernetes my-release stable/nginx-ingress
|
||||||
|
```
|
||||||
|
|
||||||
|
**Решение:** Укажите все необходимые параметры команды.
|
||||||
|
|
||||||
|
## Дополнительная информация
|
||||||
|
|
||||||
|
- Все команды kubectl и helm выполняются внутри контейнера `k8s-[пресет]`
|
||||||
|
- Вам не нужно устанавливать kubectl или helm локально
|
||||||
|
- Подключение к кластеру происходит через имя узла control-plane
|
||||||
|
- Используется флаг `--insecure-skip-tls-verify` для обхода проблем с сертификатами
|
||||||
|
|
||||||
|
## Автор
|
||||||
|
|
||||||
|
Сергей Антропов
|
||||||
|
Сайт: https://devops.org.ru
|
||||||
906
docs/kubernetes-full-guide.md
Normal file
906
docs/kubernetes-full-guide.md
Normal file
@@ -0,0 +1,906 @@
|
|||||||
|
# Полное руководство по работе с Kubernetes кластерами
|
||||||
|
|
||||||
|
Автор: Сергей Антропов
|
||||||
|
Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
## Содержание
|
||||||
|
|
||||||
|
- [Введение](#введение)
|
||||||
|
- [Создание кластера](#создание-кластера)
|
||||||
|
- [Управление кластером](#управление-кластером)
|
||||||
|
- [Работа с манифестами](#работа-с-манифестами)
|
||||||
|
- [Работа с Helm](#работа-с-helm)
|
||||||
|
- [Настройка Ingress](#настройка-ingress)
|
||||||
|
- [Мониторинг и аддоны](#мониторинг-и-аддоны)
|
||||||
|
- [Service Mesh с Istio](#service-mesh-с-istio)
|
||||||
|
- [Примеры полных развертываний](#примеры-полных-развертываний)
|
||||||
|
|
||||||
|
## Введение
|
||||||
|
|
||||||
|
DevOpsLab предоставляет полную поддержку создания и управления локальными Kubernetes кластерами на основе Kind (Kubernetes in Docker). Kind позволяет запускать Kubernetes кластеры внутри Docker контейнеров, что идеально подходит для разработки, тестирования и обучения.
|
||||||
|
|
||||||
|
### Основные возможности
|
||||||
|
|
||||||
|
- Создание многоузловых Kubernetes кластеров
|
||||||
|
- Установка и управление Helm чартами
|
||||||
|
- Работа с манифестами YAML
|
||||||
|
- Настройка Ingress контроллеров
|
||||||
|
- Установка систем мониторинга (Prometheus, Grafana)
|
||||||
|
- Развертывание Service Mesh (Istio, Kiali)
|
||||||
|
- Изоляция сети и безопасность
|
||||||
|
|
||||||
|
### Преимущества
|
||||||
|
|
||||||
|
- Не требует установки локального Kubernetes
|
||||||
|
- Быстрое создание и удаление кластеров
|
||||||
|
- Поддержка многоузловых конфигураций
|
||||||
|
- Полная совместимость с production окружениями
|
||||||
|
- Контейнеризация всех инструментов
|
||||||
|
|
||||||
|
## Создание кластера
|
||||||
|
|
||||||
|
### Базовое создание
|
||||||
|
|
||||||
|
Простое создание минимального кластера без дополнительных компонентов:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s create
|
||||||
|
```
|
||||||
|
|
||||||
|
Создаст кластер с пресетом `k8s-minimal` - один control-plane узел без дополнительных компонентов.
|
||||||
|
|
||||||
|
### Создание полнофункционального кластера
|
||||||
|
|
||||||
|
Создание кластера с предустановленными компонентами:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s create kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
Этот пресет создает кластер со следующими компонентами:
|
||||||
|
- 1 control-plane узел
|
||||||
|
- 2 worker узла
|
||||||
|
- Ingress NGINX Controller
|
||||||
|
- Metrics Server
|
||||||
|
- Istio Service Mesh
|
||||||
|
- Kiali для визуализации Istio
|
||||||
|
- Prometheus Stack (Prometheus + Grafana)
|
||||||
|
|
||||||
|
### Конфигурация пресета
|
||||||
|
|
||||||
|
Пресеты находятся в `molecule/presets/k8s/`. Пример конфигурации:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
kind_clusters:
|
||||||
|
- name: lab
|
||||||
|
workers: 2
|
||||||
|
api_port: 6443
|
||||||
|
addons:
|
||||||
|
ingress_nginx: true
|
||||||
|
metrics_server: true
|
||||||
|
istio: true
|
||||||
|
kiali: true
|
||||||
|
prometheus_stack: true
|
||||||
|
ingress_host_http_port: 8081
|
||||||
|
ingress_host_https_port: 8443
|
||||||
|
addon_ports:
|
||||||
|
prometheus: 9090
|
||||||
|
grafana: 3000
|
||||||
|
kiali: 20001
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка статуса кластера
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Показать узлы кластера
|
||||||
|
make k8s nodes kubernetes
|
||||||
|
|
||||||
|
# Вывод:
|
||||||
|
# NAME STATUS ROLES AGE VERSION
|
||||||
|
# lab-control-plane Ready control-plane 5m v1.34.0
|
||||||
|
# lab-worker Ready <none> 4m v1.34.0
|
||||||
|
# lab-worker2 Ready <none> 4m v1.34.0
|
||||||
|
|
||||||
|
# Показать подробный статус
|
||||||
|
make k8s status kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
### Подключение к кластеру
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Получить kubeconfig
|
||||||
|
make k8s config kubernetes
|
||||||
|
|
||||||
|
# Использовать kubeconfig
|
||||||
|
export KUBECONFIG=$(pwd)/kubeconfig
|
||||||
|
kubectl get nodes
|
||||||
|
```
|
||||||
|
|
||||||
|
## Управление кластером
|
||||||
|
|
||||||
|
### Остановка и запуск
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Остановить кластер (без удаления)
|
||||||
|
make k8s stop kubernetes
|
||||||
|
|
||||||
|
# Запустить остановленный кластер
|
||||||
|
make k8s start kubernetes
|
||||||
|
|
||||||
|
# Перезапустить кластер
|
||||||
|
make k8s stop kubernetes && make k8s start kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
### Удаление кластера
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Полное удаление кластера и контейнера
|
||||||
|
make k8s destroy kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
### Получение shell в контейнере
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Открыть интерактивный shell
|
||||||
|
make k8s shell kubernetes
|
||||||
|
|
||||||
|
# Теперь доступны все команды kubectl, helm, kind внутри контейнера
|
||||||
|
kubectl get nodes
|
||||||
|
helm list
|
||||||
|
kind get clusters
|
||||||
|
```
|
||||||
|
|
||||||
|
## Работа с манифестами
|
||||||
|
|
||||||
|
### Применение манифеста
|
||||||
|
|
||||||
|
Применение манифеста из URL:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s manifest apply kubernetes https://example.com/deploy.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
Применение локального манифеста:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создайте файл example-deployment.yaml
|
||||||
|
cat > example-deployment.yaml <<EOF
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: nginx-deployment
|
||||||
|
spec:
|
||||||
|
replicas: 3
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: nginx
|
||||||
|
image: nginx:1.21
|
||||||
|
ports:
|
||||||
|
- containerPort: 80
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: nginx-service
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: nginx
|
||||||
|
ports:
|
||||||
|
- protocol: TCP
|
||||||
|
port: 80
|
||||||
|
targetPort: 80
|
||||||
|
type: NodePort
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Применить манифест
|
||||||
|
make k8s manifest apply kubernetes ./example-deployment.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Удаление ресурсов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s manifest delete kubernetes https://example.com/deploy.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Обновление ресурсов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s manifest update kubernetes https://example.com/deploy.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
## Работа с Helm
|
||||||
|
|
||||||
|
### Добавление Helm репозиториев
|
||||||
|
|
||||||
|
Список популярных репозиториев:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Официальный Helm репозиторий
|
||||||
|
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
|
||||||
|
|
||||||
|
# Bitnami (большая коллекция чартов)
|
||||||
|
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||||
|
|
||||||
|
# NGINX Inc
|
||||||
|
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
|
||||||
|
|
||||||
|
# Prometheus Community
|
||||||
|
make k8s helmrepo add kubernetes prometheus-community https://prometheus-community.github.io/helm-charts
|
||||||
|
|
||||||
|
# Istio
|
||||||
|
make k8s helmrepo add kubernetes istio https://istio-release.storage.googleapis.com/charts
|
||||||
|
|
||||||
|
# Информация о репозиториях
|
||||||
|
make k8s helmrepo list kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
### Обновление репозиториев
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s helmrepo update kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
### Поиск чартов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Просмотр всех чартов в репозитории
|
||||||
|
make k8s helmrepo packages kubernetes bitnami
|
||||||
|
|
||||||
|
# Поиск конкретного чарта
|
||||||
|
make k8s helmrepo packages kubernetes bitnami | grep nginx
|
||||||
|
|
||||||
|
# Поиск в нескольких репозиториях
|
||||||
|
make k8s helmrepo packages kubernetes bitnami | grep redis
|
||||||
|
make k8s helmrepo packages kubernetes stable | grep postgresql
|
||||||
|
```
|
||||||
|
|
||||||
|
### Установка Helm чартов
|
||||||
|
|
||||||
|
#### Пример 1: Установка Redis
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Добавить репозиторий
|
||||||
|
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||||
|
|
||||||
|
# Обновить индекс
|
||||||
|
make k8s helmrepo update kubernetes
|
||||||
|
|
||||||
|
# Установить Redis
|
||||||
|
make k8s helm apply kubernetes redis bitnami/redis
|
||||||
|
|
||||||
|
# Проверить статус
|
||||||
|
make k8s helm status kubernetes redis
|
||||||
|
|
||||||
|
# Посмотреть список релизов
|
||||||
|
make k8s helm list kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Пример 2: Установка PostgreSQL
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s helm apply kubernetes postgres bitnami/postgresql
|
||||||
|
make k8s helm status kubernetes postgres
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Пример 3: Установка Nginx Ingress через Helm
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Добавить репозиторий (если еще не добавлен)
|
||||||
|
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
|
||||||
|
|
||||||
|
# Обновить индекс
|
||||||
|
make k8s helmrepo update kubernetes
|
||||||
|
|
||||||
|
# Установить NGINX Ingress
|
||||||
|
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress-controller
|
||||||
|
|
||||||
|
# Проверить
|
||||||
|
make k8s helm status kubernetes nginx-ingress
|
||||||
|
```
|
||||||
|
|
||||||
|
### Обновление Helm релизов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Обновить релиз до последней версии
|
||||||
|
make k8s helm update kubernetes redis bitnami/redis
|
||||||
|
|
||||||
|
# Проверить после обновления
|
||||||
|
make k8s helm status kubernetes redis
|
||||||
|
```
|
||||||
|
|
||||||
|
### Откат Helm релизов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Откатить к предыдущей версии
|
||||||
|
make k8s helm rollback kubernetes redis
|
||||||
|
|
||||||
|
# Проверить статус после отката
|
||||||
|
make k8s helm status kubernetes redis
|
||||||
|
```
|
||||||
|
|
||||||
|
### Удаление Helm релизов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Удалить релиз
|
||||||
|
make k8s helm delete kubernetes redis
|
||||||
|
make k8s helm delete kubernetes postgres
|
||||||
|
```
|
||||||
|
|
||||||
|
## Настройка Ingress
|
||||||
|
|
||||||
|
### Установка NGINX Ingress Controller
|
||||||
|
|
||||||
|
Ingress контроллер обычно устанавливается при создании кластера с пресетом `kubernetes`. Если нужна переустановка:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Через манифест
|
||||||
|
make k8s manifest apply kubernetes \
|
||||||
|
https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml
|
||||||
|
|
||||||
|
# Или через Helm
|
||||||
|
make k8s helmrepo add kubernetes nginx https://helm.nginx.com/stable
|
||||||
|
make k8s helm apply kubernetes nginx-ingress nginx/nginx-ingress-controller
|
||||||
|
```
|
||||||
|
|
||||||
|
### Создание Ingress ресурса
|
||||||
|
|
||||||
|
Создайте файл `example-ingress.yaml`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: hello-service
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: hello
|
||||||
|
ports:
|
||||||
|
- port: 80
|
||||||
|
targetPort: 8080
|
||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: hello-deployment
|
||||||
|
spec:
|
||||||
|
replicas: 2
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: hello
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: hello
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: hello
|
||||||
|
image: hashicorp/http-echo:latest
|
||||||
|
args:
|
||||||
|
- "-text=Hello from Kubernetes!"
|
||||||
|
ports:
|
||||||
|
- containerPort: 8080
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: hello-ingress
|
||||||
|
annotations:
|
||||||
|
nginx.ingress.kubernetes.io/rewrite-target: /
|
||||||
|
spec:
|
||||||
|
rules:
|
||||||
|
- host: hello.local
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: hello-service
|
||||||
|
port:
|
||||||
|
number: 80
|
||||||
|
```
|
||||||
|
|
||||||
|
Примените манифест:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s manifest apply kubernetes ./example-ingress.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
Проверьте доступность:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Добавьте запись в /etc/hosts
|
||||||
|
echo "127.0.0.1 hello.local" | sudo tee -a /etc/hosts
|
||||||
|
|
||||||
|
# Откройте в браузере или проверьте через curl
|
||||||
|
curl http://hello.local:8081
|
||||||
|
```
|
||||||
|
|
||||||
|
### TLS Ingress
|
||||||
|
|
||||||
|
Создайте TLS сертификат и добавьте в Ingress:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: hello-tls-ingress
|
||||||
|
annotations:
|
||||||
|
nginx.ingress.kubernetes.io/rewrite-target: /
|
||||||
|
spec:
|
||||||
|
tls:
|
||||||
|
- hosts:
|
||||||
|
- hello.local
|
||||||
|
secretName: tls-secret
|
||||||
|
rules:
|
||||||
|
- host: hello.local
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: hello-service
|
||||||
|
port:
|
||||||
|
number: 80
|
||||||
|
```
|
||||||
|
|
||||||
|
## Мониторинг и аддоны
|
||||||
|
|
||||||
|
### Prometheus Stack
|
||||||
|
|
||||||
|
Prometheus Stack устанавливается автоматически при создании кластера с пресетом `kubernetes`.
|
||||||
|
|
||||||
|
#### Доступ к Grafana
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Получите пароль администратора
|
||||||
|
kubectl --kubeconfig kubeconfig get secret monitoring-grafana \
|
||||||
|
-n monitoring -o jsonpath="{.data.admin-password}" | base64 -d
|
||||||
|
|
||||||
|
# 2. Откройте браузер
|
||||||
|
# URL: http://localhost:3000
|
||||||
|
# Username: admin
|
||||||
|
# Password: [результат из команды выше]
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Доступ к Prometheus
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# URL: http://localhost:9090
|
||||||
|
# Откройте в браузере для просмотра метрик
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Просмотр метрик
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Получить список метрик
|
||||||
|
curl http://localhost:9090/api/v1/label/__name__/values
|
||||||
|
|
||||||
|
# Запрос конкретной метрики
|
||||||
|
curl 'http://localhost:9090/api/v1/query?query=up'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Установка дополнительных инструментов мониторинга
|
||||||
|
|
||||||
|
#### Loki для логов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Добавить репозиторий Grafana
|
||||||
|
make k8s helmrepo add kubernetes grafana https://grafana.github.io/helm-charts
|
||||||
|
|
||||||
|
# Установить Loki
|
||||||
|
make k8s helm apply kubernetes loki grafana/loki-stack
|
||||||
|
|
||||||
|
# Проверить статус
|
||||||
|
make k8s helm status kubernetes loki
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Jaeger для трейсинга
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Добавить репозиторий Jaeger
|
||||||
|
make k8s helmrepo add kubernetes jaegertracing https://jaegertracing.github.io/helm-charts
|
||||||
|
|
||||||
|
# Установить Jaeger
|
||||||
|
make k8s helm apply kubernetes jaeger jaegertracing/jaeger
|
||||||
|
|
||||||
|
# Проверить статус
|
||||||
|
make k8s helm status kubernetes jaeger
|
||||||
|
```
|
||||||
|
|
||||||
|
## Service Mesh с Istio
|
||||||
|
|
||||||
|
### Установка Istio
|
||||||
|
|
||||||
|
Istio устанавливается автоматически при создании кластера с пресетом `kubernetes`.
|
||||||
|
|
||||||
|
### Ручная установка Istio
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Добавить репозиторий Istio
|
||||||
|
make k8s helmrepo add kubernetes istio https://istio-release.storage.googleapis.com/charts
|
||||||
|
|
||||||
|
# Установить Istio base
|
||||||
|
make k8s helm apply kubernetes istio-base istio/base
|
||||||
|
|
||||||
|
# Установить Istiod (control plane)
|
||||||
|
make k8s helm apply kubernetes istiod istio/istiod \
|
||||||
|
--set values.global.istiod.enableAnalysis=true
|
||||||
|
|
||||||
|
# Установить Istio Ingress Gateway
|
||||||
|
make k8s helm apply kubernetes istio-ingress istio/gateway
|
||||||
|
```
|
||||||
|
|
||||||
|
### Kiali для визуализации Istio
|
||||||
|
|
||||||
|
Kiali устанавливается автоматически с пресетом `kubernetes`.
|
||||||
|
|
||||||
|
#### Доступ к Kiali
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# URL: http://localhost:20001
|
||||||
|
# Откройте в браузере для визуализации Service Mesh
|
||||||
|
|
||||||
|
# Настройки доступа
|
||||||
|
# Username: admin
|
||||||
|
# Password: admin (если используется анонимный доступ)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Ручная установка Kiali
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Добавить репозиторий Kiali
|
||||||
|
make k8s helmrepo add kubernetes kiali https://kiali.org/helm-charts
|
||||||
|
|
||||||
|
# Установить Kiali
|
||||||
|
make k8s helm apply kubernetes kiali-server kiali/kiali-server \
|
||||||
|
--set auth.strategy=anonymous \
|
||||||
|
--set deployment.ingress.enabled=true \
|
||||||
|
--set server.web_root="/"
|
||||||
|
|
||||||
|
# Проверить статус
|
||||||
|
make k8s helm status kubernetes kiali-server
|
||||||
|
```
|
||||||
|
|
||||||
|
### Пример приложения с Istio
|
||||||
|
|
||||||
|
Создайте файл `istio-app.yaml`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Namespace
|
||||||
|
metadata:
|
||||||
|
name: bookinfo
|
||||||
|
labels:
|
||||||
|
istio-injection: enabled
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: productpage
|
||||||
|
namespace: bookinfo
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- port: 9080
|
||||||
|
name: http
|
||||||
|
targetPort: 9080
|
||||||
|
selector:
|
||||||
|
app: productpage
|
||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: productpage
|
||||||
|
namespace: bookinfo
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: productpage
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: productpage
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: productpage
|
||||||
|
image: istio/examples-bookinfo-productpage-v1:latest
|
||||||
|
ports:
|
||||||
|
- containerPort: 9080
|
||||||
|
```
|
||||||
|
|
||||||
|
Примените:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s manifest apply kubernetes ./istio-app.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
## Примеры полных развертываний
|
||||||
|
|
||||||
|
### Пример 1: WordPress с MySQL
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Установить MySQL через Helm
|
||||||
|
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||||
|
make k8s helm apply kubernetes mysql bitnami/mysql \
|
||||||
|
--set auth.rootPassword=secretpassword
|
||||||
|
|
||||||
|
# 2. Создать манифест для WordPress
|
||||||
|
cat > wordpress.yaml <<EOF
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: wordpress
|
||||||
|
spec:
|
||||||
|
replicas: 2
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: wordpress
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: wordpress
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: wordpress
|
||||||
|
image: wordpress:latest
|
||||||
|
env:
|
||||||
|
- name: WORDPRESS_DB_HOST
|
||||||
|
value: mysql.default.svc.cluster.local
|
||||||
|
- name: WORDPRESS_DB_USER
|
||||||
|
value: root
|
||||||
|
- name: WORDPRESS_DB_PASSWORD
|
||||||
|
value: secretpassword
|
||||||
|
ports:
|
||||||
|
- containerPort: 80
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: wordpress
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: wordpress
|
||||||
|
ports:
|
||||||
|
- port: 80
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: wordpress-ingress
|
||||||
|
spec:
|
||||||
|
rules:
|
||||||
|
- host: wordpress.local
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: wordpress
|
||||||
|
port:
|
||||||
|
number: 80
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# 3. Применить манифест
|
||||||
|
make k8s manifest apply kubernetes ./wordpress.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Пример 2: Многоуровневое приложение с мониторингом
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Установить Redis
|
||||||
|
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||||
|
make k8s helm apply kubernetes redis bitnami/redis
|
||||||
|
|
||||||
|
# 2. Установить PostgreSQL
|
||||||
|
make k8s helm apply kubernetes postgres bitnami/postgresql
|
||||||
|
|
||||||
|
# 3. Создать приложение
|
||||||
|
cat > app.yaml <<EOF
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: api-server
|
||||||
|
spec:
|
||||||
|
replicas: 3
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: api
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: api
|
||||||
|
version: v1
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: api
|
||||||
|
image: nginx:alpine
|
||||||
|
ports:
|
||||||
|
- containerPort: 80
|
||||||
|
env:
|
||||||
|
- name: REDIS_HOST
|
||||||
|
value: redis-master.default.svc.cluster.local
|
||||||
|
- name: POSTGRES_HOST
|
||||||
|
value: postgresql-postgresql.default.svc.cluster.local
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: api-service
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: api
|
||||||
|
ports:
|
||||||
|
- port: 80
|
||||||
|
---
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: api-ingress
|
||||||
|
spec:
|
||||||
|
rules:
|
||||||
|
- host: api.local
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: api-service
|
||||||
|
port:
|
||||||
|
number: 80
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# 4. Применить
|
||||||
|
make k8s manifest apply kubernetes ./app.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Пример 3: CI/CD с Jenkins в Kubernetes
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Установить Jenkins
|
||||||
|
make k8s helmrepo add kubernetes jenkins https://charts.jenkins.io
|
||||||
|
make k8s helm apply kubernetes jenkins jenkins/jenkins \
|
||||||
|
--set persistence.enabled=true \
|
||||||
|
--set controller.installPlugins.enabled=true
|
||||||
|
|
||||||
|
# 2. Получить пароль администратора
|
||||||
|
kubectl --kubeconfig kubeconfig exec \
|
||||||
|
-n default svc/jenkins -c jenkins -- \
|
||||||
|
cat /run/secrets/additional/chart-admin-password
|
||||||
|
```
|
||||||
|
|
||||||
|
## Полезные команды и советы
|
||||||
|
|
||||||
|
### Мониторинг ресурсов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Просмотр использования ресурсов узлами
|
||||||
|
kubectl --kubeconfig kubeconfig top nodes
|
||||||
|
|
||||||
|
# Просмотр использования ресурсов подами
|
||||||
|
kubectl --kubeconfig kubeconfig top pods
|
||||||
|
|
||||||
|
# Детальная информация о узле
|
||||||
|
kubectl --kubeconfig kubeconfig describe node lab-control-plane
|
||||||
|
```
|
||||||
|
|
||||||
|
### Отладка
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Просмотр логов пода
|
||||||
|
kubectl --kubeconfig kubeconfig logs <pod-name>
|
||||||
|
|
||||||
|
# Просмотр логов с follow
|
||||||
|
kubectl --kubeconfig kubeconfig logs -f <pod-name>
|
||||||
|
|
||||||
|
# Выполнить команду в поде
|
||||||
|
kubectl --kubeconfig kubeconfig exec -it <pod-name> -- /bin/sh
|
||||||
|
|
||||||
|
# Описание ресурса
|
||||||
|
kubectl --kubeconfig kubeconfig describe pod <pod-name>
|
||||||
|
kubectl --kubeconfig kubeconfig describe service <service-name>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Масштабирование
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Масштабировать Deployment
|
||||||
|
kubectl --kubeconfig kubeconfig scale deployment <deployment-name> --replicas=5
|
||||||
|
|
||||||
|
# Автомасштабирование (требует metrics-server)
|
||||||
|
kubectl --kubeconfig kubeconfig autoscale deployment <deployment-name> \
|
||||||
|
--cpu-percent=70 --min=2 --max=10
|
||||||
|
```
|
||||||
|
|
||||||
|
### Экспорт конфигурации
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Экспортировать ресурс в YAML
|
||||||
|
kubectl --kubeconfig kubeconfig get deployment <name> -o yaml > exported.yaml
|
||||||
|
|
||||||
|
# Экспортировать все ресурсы namespace
|
||||||
|
kubectl --kubeconfig kubeconfig get all -n <namespace> -o yaml > all-resources.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
## Безопасность
|
||||||
|
|
||||||
|
### Использование Secrets
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создать Secret из файла
|
||||||
|
kubectl --kubeconfig kubeconfig create secret generic my-secret \
|
||||||
|
--from-file=username=./username.txt \
|
||||||
|
--from-file=password=./password.txt
|
||||||
|
|
||||||
|
# Создать Secret из литерала
|
||||||
|
kubectl --kubeconfig kubeconfig create secret generic my-secret \
|
||||||
|
--from-literal=username=admin \
|
||||||
|
--from-literal=password=secret123
|
||||||
|
```
|
||||||
|
|
||||||
|
### Network Policies
|
||||||
|
|
||||||
|
Создайте файл `network-policy.yaml`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: NetworkPolicy
|
||||||
|
metadata:
|
||||||
|
name: test-network-policy
|
||||||
|
namespace: default
|
||||||
|
spec:
|
||||||
|
podSelector:
|
||||||
|
matchLabels:
|
||||||
|
role: db
|
||||||
|
policyTypes:
|
||||||
|
- Ingress
|
||||||
|
- Egress
|
||||||
|
ingress:
|
||||||
|
- from:
|
||||||
|
- podSelector:
|
||||||
|
matchLabels:
|
||||||
|
role: api
|
||||||
|
ports:
|
||||||
|
- protocol: TCP
|
||||||
|
port: 5432
|
||||||
|
egress:
|
||||||
|
- to:
|
||||||
|
- podSelector:
|
||||||
|
matchLabels:
|
||||||
|
role: api
|
||||||
|
ports:
|
||||||
|
- protocol: TCP
|
||||||
|
port: 5432
|
||||||
|
```
|
||||||
|
|
||||||
|
Примените:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s manifest apply kubernetes ./network-policy.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
## Заключение
|
||||||
|
|
||||||
|
DevOpsLab предоставляет полный набор инструментов для работы с Kubernetes кластерами локально. Вы можете:
|
||||||
|
|
||||||
|
- Создавать и управлять кластерами
|
||||||
|
- Устанавливать и настраивать приложения
|
||||||
|
- Работать с мониторингом и Service Mesh
|
||||||
|
- Тестировать перед развертыванием в production
|
||||||
|
|
||||||
|
Все инструменты работают внутри Docker контейнеров, что обеспечивает изоляцию и переносимость.
|
||||||
|
|
||||||
|
## Автор
|
||||||
|
|
||||||
|
Сергей Антропов
|
||||||
|
Сайт: https://devops.org.ru
|
||||||
794
docs/kubernetes-kind.md
Normal file
794
docs/kubernetes-kind.md
Normal file
@@ -0,0 +1,794 @@
|
|||||||
|
# Kubernetes Kind Кластеры
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
|
|
||||||
|
## Содержание
|
||||||
|
|
||||||
|
- [Описание](#описание)
|
||||||
|
- [Требования к системе](#требования-к-системе)
|
||||||
|
- [Возможности](#возможности)
|
||||||
|
- [Быстрый старт](#быстрый-старт)
|
||||||
|
- [Команды управления](#команды-управления)
|
||||||
|
- [Работа с Helm](#работа-с-helm)
|
||||||
|
- [Работа с манифестами](#работа-с-манифестами)
|
||||||
|
- [Управление Ingress](#управление-ingress)
|
||||||
|
- [Проброс портов (Port-forward)](#проброс-портов-port-forward)
|
||||||
|
- [Мониторинг и логи](#мониторинг-и-логи)
|
||||||
|
- [Конфигурация](#конфигурация)
|
||||||
|
- [Архитектура](#архитектура)
|
||||||
|
- [Доступ к приложениям](#доступ-к-приложениям)
|
||||||
|
- [Кроссплатформенность](#кроссплатформенность)
|
||||||
|
- [Подробная документация по скриптам](#подробная-документация-по-скриптам)
|
||||||
|
- [Best Practices](#best-practices)
|
||||||
|
- [Troubleshooting](#troubleshooting)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Описание
|
||||||
|
|
||||||
|
Проект поддерживает автоматическое создание и управление Kubernetes кластерами на базе [Kind](https://kind.sigs.k8s.io/) для тестирования в изолированной лабораторной среде.
|
||||||
|
|
||||||
|
Kind позволяет создавать локальные Kubernetes кластеры внутри Docker контейнеров, что идеально подходит для разработки и тестирования без необходимости устанавливать полный Kubernetes.
|
||||||
|
|
||||||
|
## Требования к системе
|
||||||
|
|
||||||
|
### Обязательные требования
|
||||||
|
|
||||||
|
1. **Docker** - для запуска Kind кластеров
|
||||||
|
2. **Python 3** - для управления port-forward
|
||||||
|
3. **kubectl** - для работы с кластером
|
||||||
|
|
||||||
|
**Установка на macOS:**
|
||||||
|
```bash
|
||||||
|
brew install docker python3 kubectl
|
||||||
|
```
|
||||||
|
|
||||||
|
**Установка на Ubuntu/Debian:**
|
||||||
|
```bash
|
||||||
|
sudo apt update && sudo apt install -y docker.io python3 python3-pip kubectl
|
||||||
|
```
|
||||||
|
|
||||||
|
**Установка на CentOS/RHEL:**
|
||||||
|
```bash
|
||||||
|
sudo yum install -y docker python3 python3-pip kubectl
|
||||||
|
sudo systemctl start docker
|
||||||
|
sudo systemctl enable docker
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка установки
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker --version
|
||||||
|
python3 --version
|
||||||
|
kubectl version --client
|
||||||
|
```
|
||||||
|
|
||||||
|
### Docker группы
|
||||||
|
|
||||||
|
На Linux добавьте пользователя в группу docker:
|
||||||
|
```bash
|
||||||
|
sudo usermod -aG docker $USER
|
||||||
|
# Выйдите и войдите заново
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Возможности
|
||||||
|
|
||||||
|
- ✅ Создание Kind кластеров с настраиваемым количеством worker-узлов
|
||||||
|
- ✅ Автоматическая установка аддонов (Ingress NGINX, Metrics Server, Istio, Kiali, Prometheus Stack)
|
||||||
|
- ✅ **Автоматический port-forward** для доступа к сервисам
|
||||||
|
- ✅ Работа с Helm (установка, удаление, обновление, rollback)
|
||||||
|
- ✅ Работа с Kubernetes манифестами
|
||||||
|
- ✅ Управление Helm репозиториями
|
||||||
|
- ✅ Автоматическое управление `/etc/hosts` для Ingress
|
||||||
|
- ✅ Управление Docker контейнерами в лабораторной сети
|
||||||
|
- ✅ Интеграция с Istio Service Mesh
|
||||||
|
- ✅ Детальный отчет о состоянии кластера
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Быстрый старт
|
||||||
|
|
||||||
|
### 1. Создание кластера
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создание кластера с полным набором аддонов
|
||||||
|
make k8s create kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Проверка статуса
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Детальный отчет о кластере
|
||||||
|
make k8s status kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Доступ к аддонам
|
||||||
|
|
||||||
|
После создания кластера автоматически создаются port-forward:
|
||||||
|
- Grafana: http://localhost:3000
|
||||||
|
- Prometheus: http://localhost:9090
|
||||||
|
- Kiali: http://localhost:20001
|
||||||
|
|
||||||
|
### 4. Удаление кластера
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s destroy kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Команды управления
|
||||||
|
|
||||||
|
### Создание кластера
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Минимальный кластер (без аддонов)
|
||||||
|
make k8s create
|
||||||
|
|
||||||
|
# Полный кластер с аддонами
|
||||||
|
make k8s create kubernetes
|
||||||
|
|
||||||
|
# Пользовательский пресет
|
||||||
|
make k8s create my-custom-preset
|
||||||
|
```
|
||||||
|
|
||||||
|
**Что происходит:**
|
||||||
|
1. Создается контейнер `k8s-controller` с инструментами (Kind, kubectl, Helm, Istio CLI)
|
||||||
|
2. Создаются Docker контейнеры из раздела `hosts` (если есть)
|
||||||
|
3. Создается Kind кластер
|
||||||
|
4. Устанавливаются аддоны
|
||||||
|
5. Создается автоматический port-forward
|
||||||
|
6. Добавляются записи в `/etc/hosts` для Ingress
|
||||||
|
|
||||||
|
### Управление жизненным циклом
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Удаление кластера (с очисткой port-forward и /etc/hosts)
|
||||||
|
make k8s destroy [preset]
|
||||||
|
|
||||||
|
# Остановка кластера (без удаления)
|
||||||
|
make k8s stop [preset]
|
||||||
|
|
||||||
|
# Запуск остановленного кластера
|
||||||
|
make k8s start [preset]
|
||||||
|
|
||||||
|
# Детальный отчет о состоянии
|
||||||
|
make k8s status [preset]
|
||||||
|
|
||||||
|
# Показать узлы кластера
|
||||||
|
make k8s nodes [preset]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Получение kubeconfig
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Сохранить kubeconfig для подключения
|
||||||
|
make k8s config [preset]
|
||||||
|
|
||||||
|
# Использовать конфиг
|
||||||
|
export KUBECONFIG=kubeconfig
|
||||||
|
kubectl get nodes
|
||||||
|
```
|
||||||
|
|
||||||
|
### Shell доступ
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Открыть shell в контейнере k8s-controller
|
||||||
|
make k8s shell [preset]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Работа с Helm
|
||||||
|
|
||||||
|
Helm - это менеджер пакетов для Kubernetes.
|
||||||
|
|
||||||
|
### Управление релизами
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Установить чарт
|
||||||
|
make k8s helm apply kubernetes nginx stable/nginx-ingress
|
||||||
|
|
||||||
|
# Обновить релиз
|
||||||
|
make k8s helm update kubernetes nginx stable/nginx-ingress
|
||||||
|
|
||||||
|
# Откатить релиз
|
||||||
|
make k8s helm rollback kubernetes nginx
|
||||||
|
|
||||||
|
# Посмотреть статус релиза
|
||||||
|
make k8s helm status kubernetes nginx
|
||||||
|
|
||||||
|
# Удалить релиз
|
||||||
|
make k8s helm delete kubernetes nginx
|
||||||
|
|
||||||
|
# Список всех релизов
|
||||||
|
make k8s helm list kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
### Управление репозиториями
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Добавить репозиторий
|
||||||
|
make k8s helmrepo add kubernetes stable https://charts.helm.sh/stable
|
||||||
|
|
||||||
|
# Обновить репозиторий
|
||||||
|
make k8s helmrepo update kubernetes stable
|
||||||
|
|
||||||
|
# Список репозиториев
|
||||||
|
make k8s helmrepo list kubernetes
|
||||||
|
|
||||||
|
# Показать доступные чарты
|
||||||
|
make k8s helmrepo packages kubernetes stable
|
||||||
|
|
||||||
|
# Удалить репозиторий
|
||||||
|
make k8s helmrepo delete kubernetes stable
|
||||||
|
```
|
||||||
|
|
||||||
|
### Пример: установка MySQL
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Добавить репозиторий Bitnami
|
||||||
|
make k8s helmrepo add kubernetes bitnami https://charts.bitnami.com/bitnami
|
||||||
|
|
||||||
|
# Установить MySQL
|
||||||
|
make k8s helm apply kubernetes mysql bitnami/mysql
|
||||||
|
|
||||||
|
# Проверить статус
|
||||||
|
make k8s helm status kubernetes mysql
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Работа с манифестами
|
||||||
|
|
||||||
|
Применение обычных Kubernetes манифестов (без Helm).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Применить манифест из URL
|
||||||
|
make k8s manifest apply kubernetes https://example.com/deploy.yaml
|
||||||
|
|
||||||
|
# Применить манифест из файла
|
||||||
|
make k8s manifest apply kubernetes /path/to/manifest.yaml
|
||||||
|
|
||||||
|
# Удалить манифест
|
||||||
|
make k8s manifest delete kubernetes https://example.com/deploy.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Пример: создание Deployment
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# nginx-deployment.yaml
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: nginx
|
||||||
|
spec:
|
||||||
|
replicas: 3
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: nginx
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: nginx
|
||||||
|
image: nginx:latest
|
||||||
|
ports:
|
||||||
|
- containerPort: 80
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Применить
|
||||||
|
make k8s manifest apply kubernetes ./nginx-deployment.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Управление Ingress
|
||||||
|
|
||||||
|
### Доступ к приложениям через Ingress
|
||||||
|
|
||||||
|
Для доступа к приложениям по доменным именам нужно вручную добавить записи в `/etc/hosts`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Добавить запись в /etc/hosts
|
||||||
|
echo "127.0.0.1 grafana.local #k8s" | sudo tee -a /etc/hosts
|
||||||
|
|
||||||
|
# Очистить DNS кеш macOS
|
||||||
|
sudo killall -HUP mDNSResponder
|
||||||
|
```
|
||||||
|
|
||||||
|
После этого приложение будет доступно по адресу:
|
||||||
|
```
|
||||||
|
http://grafana.local:8081
|
||||||
|
```
|
||||||
|
|
||||||
|
**Пример манифеста Ingress:**
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: grafana-ingress
|
||||||
|
namespace: monitoring
|
||||||
|
spec:
|
||||||
|
rules:
|
||||||
|
- host: grafana.local
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: monitoring-grafana
|
||||||
|
port:
|
||||||
|
number: 80
|
||||||
|
```
|
||||||
|
|
||||||
|
**Важно:**
|
||||||
|
- Записи в `/etc/hosts` нужно добавлять вручную
|
||||||
|
- Используйте порт 8081 для HTTP и 8443 для HTTPS
|
||||||
|
- Для удаления записей используйте sudo
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Проброс портов (Port-forward)
|
||||||
|
|
||||||
|
Port-forward позволяет получить доступ к ClusterIP сервисам извне кластера.
|
||||||
|
|
||||||
|
### Автоматический port-forward
|
||||||
|
|
||||||
|
После создания кластера автоматически создаются порты:
|
||||||
|
- Ingress HTTP: `8081:80`
|
||||||
|
- Ingress HTTPS: `8443:443`
|
||||||
|
- Grafana: `3000:80`
|
||||||
|
- Prometheus: `9090:9090`
|
||||||
|
- Kiali: `20001:20001`
|
||||||
|
|
||||||
|
### Управление вручную
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Создать port-forward
|
||||||
|
make k8s portforward create
|
||||||
|
|
||||||
|
# Список активных портов
|
||||||
|
make k8s portforward list
|
||||||
|
|
||||||
|
# Удалить конкретный порт
|
||||||
|
make k8s portforward delete 3000
|
||||||
|
|
||||||
|
# Очистить все порты
|
||||||
|
make k8s portforward clear
|
||||||
|
|
||||||
|
# Пересоздать порты
|
||||||
|
make k8s portforward recreate
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ручной port-forward для своих сервисов
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Подключиться к кластеру
|
||||||
|
export KUBECONFIG=$(docker exec k8s-controller cat /root/.kube/config)
|
||||||
|
|
||||||
|
# Создать port-forward
|
||||||
|
kubectl port-forward -n default svc/my-service 8080:80
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Мониторинг и логи
|
||||||
|
|
||||||
|
### Детальный статус кластера
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make k8s status kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
Показывает:
|
||||||
|
- Узлы кластера
|
||||||
|
- Namespaces
|
||||||
|
- Pods
|
||||||
|
- Services
|
||||||
|
- Ingress
|
||||||
|
- Deployments
|
||||||
|
- DaemonSets
|
||||||
|
- StatefulSets
|
||||||
|
- PVC
|
||||||
|
- События
|
||||||
|
- Helm релизы
|
||||||
|
- Использование ресурсов
|
||||||
|
|
||||||
|
### Доступ к аддонам
|
||||||
|
|
||||||
|
**Grafana:**
|
||||||
|
```
|
||||||
|
URL: http://localhost:3000
|
||||||
|
Login: admin
|
||||||
|
Password: admin
|
||||||
|
```
|
||||||
|
|
||||||
|
**Prometheus:**
|
||||||
|
```
|
||||||
|
URL: http://localhost:9090
|
||||||
|
```
|
||||||
|
|
||||||
|
**Kiali:**
|
||||||
|
```
|
||||||
|
URL: http://localhost:20001
|
||||||
|
Login: admin
|
||||||
|
Password: admin
|
||||||
|
```
|
||||||
|
|
||||||
|
### Логи контейнера
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Логи k8s-controller
|
||||||
|
docker logs k8s-controller
|
||||||
|
|
||||||
|
# Логи в реальном времени
|
||||||
|
docker logs -f k8s-controller
|
||||||
|
```
|
||||||
|
|
||||||
|
### Логи кластера
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Логи конкретного pod
|
||||||
|
make k8s shell kubernetes
|
||||||
|
kubectl logs -n monitoring <pod-name>
|
||||||
|
|
||||||
|
# Все логи в namespace
|
||||||
|
kubectl logs -n monitoring --all-containers=true --tail=100
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Конфигурация
|
||||||
|
|
||||||
|
### Пресеты
|
||||||
|
|
||||||
|
Пресеты находятся в `molecule/presets/k8s/`:
|
||||||
|
|
||||||
|
**kubernetes.yml** - полный набор аддонов:
|
||||||
|
- Ingress NGINX
|
||||||
|
- Metrics Server
|
||||||
|
- Istio
|
||||||
|
- Kiali
|
||||||
|
- Prometheus + Grafana
|
||||||
|
|
||||||
|
### Структура пресета
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
k8s_cluster:
|
||||||
|
name: lab
|
||||||
|
nodes: 1
|
||||||
|
|
||||||
|
addons:
|
||||||
|
ingress: true
|
||||||
|
metrics_server: true
|
||||||
|
istio: true
|
||||||
|
kiali: true
|
||||||
|
prometheus_stack: true
|
||||||
|
|
||||||
|
addon_ports:
|
||||||
|
ingress_http: 8081
|
||||||
|
ingress_https: 8443
|
||||||
|
prometheus: 9090
|
||||||
|
grafana: 3000
|
||||||
|
kiali: 20001
|
||||||
|
metrics_server: 4443
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
- name: test1
|
||||||
|
image: centos8
|
||||||
|
systemd_defaults:
|
||||||
|
container: true
|
||||||
|
|
||||||
|
images:
|
||||||
|
centos8:
|
||||||
|
name: inecs/ansible-lab:centos8-latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### Пользовательский пресет
|
||||||
|
|
||||||
|
Создайте файл `molecule/presets/k8s/my-preset.yml`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
k8s_cluster:
|
||||||
|
name: my-cluster
|
||||||
|
nodes: 2
|
||||||
|
|
||||||
|
addons:
|
||||||
|
ingress: true
|
||||||
|
metrics_server: false
|
||||||
|
istio: false
|
||||||
|
kiali: false
|
||||||
|
prometheus_stack: false
|
||||||
|
```
|
||||||
|
|
||||||
|
Использование:
|
||||||
|
```bash
|
||||||
|
make k8s create my-preset
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Архитектура
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────────────┐
|
||||||
|
│ Локальная машина │
|
||||||
|
│ │
|
||||||
|
│ ┌──────────────────────────────────────────────┐ │
|
||||||
|
│ │ Makefile → Python скрипты → Docker API │ │
|
||||||
|
│ │ kubectl (port-forward) │ │
|
||||||
|
│ └──────────────────────────────────────────────┘ │
|
||||||
|
└─────────────────────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
↓
|
||||||
|
┌─────────────────────────────────────────────────────┐
|
||||||
|
│ Docker: k8s-controller │
|
||||||
|
│ ┌──────────────────────────────────────────────┐ │
|
||||||
|
│ │ kind, kubectl, helm, istioctl │ │
|
||||||
|
│ └──────────────────────────────────────────────┘ │
|
||||||
|
└─────────────────────────────────────────────────────┘
|
||||||
|
│
|
||||||
|
↓
|
||||||
|
┌─────────────────────────────────────────────────────┐
|
||||||
|
│ Docker сеть: kind │
|
||||||
|
│ ┌──────────────────────────────────────────────┐ │
|
||||||
|
│ │ Kind Kubernetes Cluster │ │
|
||||||
|
│ │ • Control Plane (6443) │ │
|
||||||
|
│ │ • Worker Nodes │ │
|
||||||
|
│ │ • Services (ClusterIP) │ │
|
||||||
|
│ │ • Ingress Controller │ │
|
||||||
|
│ │ • Istio Service Mesh │ │
|
||||||
|
│ └──────────────────────────────────────────────┘ │
|
||||||
|
└─────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
### Компоненты
|
||||||
|
|
||||||
|
1. **k8s-controller** - контейнер с инструментами управления
|
||||||
|
2. **Kind кластер** - Kubernetes кластер в Docker контейнерах
|
||||||
|
3. **Port-forward** - локальные процессы на хосте
|
||||||
|
4. **Ingress** - маршрутизация трафика внутрь кластера
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Доступ к приложениям
|
||||||
|
|
||||||
|
### Доступ через Ingress
|
||||||
|
|
||||||
|
1. Создайте Ingress манифест
|
||||||
|
2. Примените через `make k8s manifest apply`
|
||||||
|
3. Запись автоматически добавится в `/etc/hosts`
|
||||||
|
4. Приложение доступно по доменному имени
|
||||||
|
|
||||||
|
### Доступ через port-forward
|
||||||
|
|
||||||
|
Для ClusterIP сервисов:
|
||||||
|
```bash
|
||||||
|
kubectl port-forward -n namespace svc/service-name 8080:80
|
||||||
|
```
|
||||||
|
|
||||||
|
Доступ: http://localhost:8080
|
||||||
|
|
||||||
|
### Доступ внутри кластера
|
||||||
|
|
||||||
|
Из другого pod:
|
||||||
|
```bash
|
||||||
|
kubectl exec -it pod-name -- curl http://service-name.namespace:80
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Кроссплатформенность
|
||||||
|
|
||||||
|
### Поддерживаемые платформы
|
||||||
|
|
||||||
|
- **macOS (Intel & Apple Silicon)** - полная поддержка
|
||||||
|
- **Linux (amd64 & arm64)** - полная поддержка
|
||||||
|
- **Windows** - через WSL2
|
||||||
|
|
||||||
|
### Проблемы на разных платформах
|
||||||
|
|
||||||
|
**Apple Silicon (M1/M2):**
|
||||||
|
- Используется ARM64 образы
|
||||||
|
- Автоматическое определение архитектуры
|
||||||
|
|
||||||
|
**Linux:**
|
||||||
|
- Требуются права на Docker socket
|
||||||
|
- Возможны проблемы с selinux
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Подробная документация по скриптам
|
||||||
|
|
||||||
|
Для подробного описания работы всех скриптов управления Kubernetes смотрите:
|
||||||
|
|
||||||
|
📖 [Документация по скриптам Kubernetes](k8s-scripts.md)
|
||||||
|
|
||||||
|
Включает:
|
||||||
|
- Описание каждого скрипта
|
||||||
|
- Принцип работы
|
||||||
|
- Примеры использования
|
||||||
|
- Архитектура взаимодействия
|
||||||
|
- Отладка
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Best Practices
|
||||||
|
|
||||||
|
### 1. Используйте пресеты
|
||||||
|
|
||||||
|
Не создавайте кластеры вручную, используйте пресеты для консистентности.
|
||||||
|
|
||||||
|
### 2. Очищайте после работы
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# После тестирования
|
||||||
|
make k8s destroy kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Проверяйте статус
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Регулярно проверяйте статус
|
||||||
|
make k8s status kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Используйте Helm для сложных приложений
|
||||||
|
|
||||||
|
Для многослойных приложений лучше использовать Helm вместо сырых манифестов.
|
||||||
|
|
||||||
|
### 5. Логируйте изменения
|
||||||
|
|
||||||
|
Все изменения в кластере через `make k8s` автоматически логируются.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Кластер не создается
|
||||||
|
|
||||||
|
**Проблема:** `kind create cluster` завершается с ошибкой
|
||||||
|
|
||||||
|
**Решение:**
|
||||||
|
```bash
|
||||||
|
# Проверьте Docker
|
||||||
|
docker ps
|
||||||
|
|
||||||
|
# Перезапустите Docker
|
||||||
|
sudo systemctl restart docker
|
||||||
|
|
||||||
|
# Очистите старые кластеры
|
||||||
|
kind delete cluster --all
|
||||||
|
```
|
||||||
|
|
||||||
|
### Port-forward не работает
|
||||||
|
|
||||||
|
**Проблема:** Невозможно подключиться к порту
|
||||||
|
|
||||||
|
**Решение:**
|
||||||
|
```bash
|
||||||
|
# Проверьте процессы
|
||||||
|
make k8s portforward list
|
||||||
|
|
||||||
|
# Пересоздайте порты
|
||||||
|
make k8s portforward recreate
|
||||||
|
|
||||||
|
# Проверьте, что порт свободен
|
||||||
|
lsof -i :3000
|
||||||
|
```
|
||||||
|
|
||||||
|
### kubectl не подключается
|
||||||
|
|
||||||
|
**Проблема:** `kubectl get nodes` выдает ошибку
|
||||||
|
|
||||||
|
**Решение:**
|
||||||
|
```bash
|
||||||
|
# Проверьте контейнер
|
||||||
|
docker ps | grep k8s-controller
|
||||||
|
|
||||||
|
# Зайдите в контейнер
|
||||||
|
make k8s shell kubernetes
|
||||||
|
|
||||||
|
# Проверьте кластер
|
||||||
|
kubectl get nodes
|
||||||
|
|
||||||
|
# Если не работает, пересоздайте кластер
|
||||||
|
make k8s destroy kubernetes
|
||||||
|
make k8s create kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
### Аддоны не устанавливаются
|
||||||
|
|
||||||
|
**Проблема:** Grafana/Prometheus/Kiali не доступны
|
||||||
|
|
||||||
|
**Решение:**
|
||||||
|
```bash
|
||||||
|
# Проверьте статус кластера
|
||||||
|
make k8s status kubernetes
|
||||||
|
|
||||||
|
# Проверьте pods
|
||||||
|
make k8s shell kubernetes
|
||||||
|
kubectl get pods -n monitoring
|
||||||
|
kubectl logs -n monitoring <pod-name>
|
||||||
|
|
||||||
|
# Пересоздайте кластер
|
||||||
|
make k8s destroy kubernetes
|
||||||
|
make k8s create kubernetes
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ingress не работает
|
||||||
|
|
||||||
|
**Проблема:** Доменные имена не резолвятся
|
||||||
|
|
||||||
|
**Решение:**
|
||||||
|
```bash
|
||||||
|
# Проверьте Ingress
|
||||||
|
make k8s shell kubernetes
|
||||||
|
kubectl get ingress --all-namespaces
|
||||||
|
|
||||||
|
# Добавьте запись в /etc/hosts вручную
|
||||||
|
echo "127.0.0.1 grafana.local #k8s" | sudo tee -a /etc/hosts
|
||||||
|
|
||||||
|
# Очистите DNS кеш
|
||||||
|
sudo killall -HUP mDNSResponder
|
||||||
|
|
||||||
|
# Проверьте доступность
|
||||||
|
curl http://grafana.local:8081
|
||||||
|
```
|
||||||
|
|
||||||
|
### Helm чарты не устанавливаются
|
||||||
|
|
||||||
|
**Проблема:** `helm install` завершается с ошибкой
|
||||||
|
|
||||||
|
**Решение:**
|
||||||
|
```bash
|
||||||
|
# Проверьте репозитории
|
||||||
|
make k8s helmrepo list kubernetes
|
||||||
|
|
||||||
|
# Обновите репозитории
|
||||||
|
make k8s helmrepo update kubernetes stable
|
||||||
|
|
||||||
|
# Проверьте логи
|
||||||
|
make k8s shell kubernetes
|
||||||
|
kubectl logs -l app=<release-name>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Контейнер k8s-controller не запускается
|
||||||
|
|
||||||
|
**Проблема:** `docker: Error response from daemon: ...`
|
||||||
|
|
||||||
|
**Решение:**
|
||||||
|
```bash
|
||||||
|
# Проверьте образ
|
||||||
|
docker images | grep k8s
|
||||||
|
|
||||||
|
# Пересоберите образ
|
||||||
|
make docker build-image IMAGE=k8s-amd64
|
||||||
|
make docker build-image IMAGE=k8s-arm64
|
||||||
|
|
||||||
|
# Проверьте Docker
|
||||||
|
docker system prune -f
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Контакты
|
||||||
|
|
||||||
|
- **Автор:** Сергей Антропов
|
||||||
|
- **Сайт:** https://devops.org.ru
|
||||||
|
- **GitHub:** https://github.com/your-repo
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Лицензия
|
||||||
|
|
||||||
|
MIT
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
**Автор:** Сергей Антропов
|
**Автор:** Сергей Антропов
|
||||||
**Сайт:** https://devops.org.ru
|
**Сайт:** https://devops.org.ru
|
||||||
**Версия:** 2.0.0
|
**Версия:** 3.0.0
|
||||||
|
|
||||||
## 🔍 Диагностика Docker
|
## 🔍 Диагностика Docker
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
**Автор:** Сергей Антропов
|
**Автор:** Сергей Антропов
|
||||||
**Сайт:** https://devops.org.ru
|
**Сайт:** https://devops.org.ru
|
||||||
**Версия:** 2.0.0
|
**Версия:** 3.0.0
|
||||||
|
|
||||||
## Описание
|
## Описание
|
||||||
|
|
||||||
|
|||||||
19
manifests/test-grafana-ingress.yaml
Normal file
19
manifests/test-grafana-ingress.yaml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
apiVersion: networking.k8s.io/v1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: grafana-ingress
|
||||||
|
namespace: monitoring
|
||||||
|
annotations:
|
||||||
|
nginx.ingress.kubernetes.io/rewrite-target: /
|
||||||
|
spec:
|
||||||
|
rules:
|
||||||
|
- host: grafana.local
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
backend:
|
||||||
|
service:
|
||||||
|
name: monitoring-grafana
|
||||||
|
port:
|
||||||
|
number: 80
|
||||||
@@ -1,4 +1,7 @@
|
|||||||
---
|
---
|
||||||
|
# =============================================================================
|
||||||
|
# CONVERGE - Сборка и запуск тестовых сценариев
|
||||||
|
# =============================================================================
|
||||||
- hosts: localhost
|
- hosts: localhost
|
||||||
gather_facts: false
|
gather_facts: false
|
||||||
vars:
|
vars:
|
||||||
@@ -9,11 +12,24 @@
|
|||||||
# перечисли файлы/глобы, которые нужно временно расшифровать
|
# перечисли файлы/глобы, которые нужно временно расшифровать
|
||||||
vault_targets:
|
vault_targets:
|
||||||
- /workspace/vault/secrets.yml
|
- /workspace/vault/secrets.yml
|
||||||
|
- /workspace/vault/secret.yml
|
||||||
- /workspace/files/playbooks/group_vars/*/vault.yml
|
- /workspace/files/playbooks/group_vars/*/vault.yml
|
||||||
- /workspace/files/playbooks/host_vars/*/vault.yml
|
- /workspace/files/playbooks/host_vars/*/vault.yml
|
||||||
- /workspace/roles/**/vars/vault.yml
|
- /workspace/roles/**/vars/vault.yml
|
||||||
|
|
||||||
tasks:
|
tasks:
|
||||||
|
# =============================================================================
|
||||||
|
# НАСТРОЙКА - Загрузка конфигурации и подготовка
|
||||||
|
# =============================================================================
|
||||||
|
- name: Configuration setup
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
================================================================================
|
||||||
|
НАСТРОЙКА - Загрузка конфигурации и подготовка
|
||||||
|
================================================================================
|
||||||
|
Preset: {{ preset_name }}
|
||||||
|
================================================================================
|
||||||
|
|
||||||
- name: Load preset configuration
|
- name: Load preset configuration
|
||||||
include_vars: "{{ preset_file }}"
|
include_vars: "{{ preset_file }}"
|
||||||
when: preset_file is file
|
when: preset_file is file
|
||||||
@@ -24,52 +40,111 @@
|
|||||||
# container: ansible-controller
|
# container: ansible-controller
|
||||||
# command: bash -lc "ansible-galaxy collection install -r /workspace/requirements.yml --force --no-deps --upgrade >/dev/null 2>&1 || true"
|
# command: bash -lc "ansible-galaxy collection install -r /workspace/requirements.yml --force --no-deps --upgrade >/dev/null 2>&1 || true"
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# VAULT - Работа с зашифрованными файлами
|
||||||
|
# =============================================================================
|
||||||
|
- name: Vault operations
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
================================================================================
|
||||||
|
VAULT - Работа с зашифрованными файлами
|
||||||
|
================================================================================
|
||||||
|
Files: {{ vault_targets | length }} targets
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
- name: Check if vault file is encrypted
|
||||||
|
community.docker.docker_container_exec:
|
||||||
|
container: ansible-controller
|
||||||
|
command: "bash -c 'if [ -f \"/workspace/vault/secrets.yml\" ]; then grep -q \"ANSIBLE_VAULT\" /workspace/vault/secrets.yml && echo \"ENCRYPTED\" || echo \"PLAINTEXT\"; else echo \"NOT_FOUND\"; fi'"
|
||||||
|
register: vault_status
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: Encrypt vault file if plaintext
|
||||||
|
community.docker.docker_container_exec:
|
||||||
|
container: ansible-controller
|
||||||
|
command: "bash -c 'VAULT_PASSWORD_FILE=\"/workspace/vault/.vault\"; if [ -f \"$VAULT_PASSWORD_FILE\" ] && [ -f \"/workspace/vault/secrets.yml\" ] && [ \"{{ vault_status.stdout }}\" = \"PLAINTEXT\" ]; then ansible-vault encrypt --encrypt-vault-id default --vault-password-file \"$VAULT_PASSWORD_FILE\" /workspace/vault/secrets.yml; fi'"
|
||||||
|
when: vault_status.stdout == "PLAINTEXT"
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
- name: Preflight vault — normalize state (encrypt if plaintext, then decrypt)
|
- name: Preflight vault — normalize state (encrypt if plaintext, then decrypt)
|
||||||
community.docker.docker_container_exec:
|
community.docker.docker_container_exec:
|
||||||
container: ansible-controller
|
container: ansible-controller
|
||||||
command: >
|
command: "bash -c 'VAULT_PASSWORD_FILE=\"/workspace/vault/.vault\"; if [ -f \"$VAULT_PASSWORD_FILE\" ] && [ -f \"/workspace/vault/secrets.yml\" ]; then ansible-vault decrypt --vault-password-file \"$VAULT_PASSWORD_FILE\" /workspace/vault/secrets.yml; fi'"
|
||||||
bash -lc '
|
ignore_errors: true
|
||||||
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
|
# =============================================================================
|
||||||
|
# PLAYBOOK - Запуск основного playbook
|
||||||
|
# =============================================================================
|
||||||
|
- name: Playbook execution
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
================================================================================
|
||||||
|
PLAYBOOK - Запуск основного playbook
|
||||||
|
================================================================================
|
||||||
|
File: /workspace/molecule/default/site.yml
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
- name: Debug - Check files in container
|
||||||
community.docker.docker_container_exec:
|
community.docker.docker_container_exec:
|
||||||
container: ansible-controller
|
container: ansible-controller
|
||||||
command: >
|
command: |
|
||||||
bash -lc "
|
bash -c '
|
||||||
ANSIBLE_ROLES_PATH=/workspace/roles
|
echo "=== DEBUG INFO ==="
|
||||||
ansible-playbook -i {{ lookup('env','MOLECULE_EPHEMERAL_DIRECTORY') }}/inventory/hosts.ini /workspace/molecule/default/site.yml
|
echo "Current directory: $(pwd)"
|
||||||
"
|
echo "ANSIBLE_ROLES_PATH: $ANSIBLE_ROLES_PATH"
|
||||||
|
echo "VAULT_PASSWORD_FILE: $VAULT_PASSWORD_FILE"
|
||||||
|
echo "VAULT_SECRETS_FILE: $VAULT_SECRETS_FILE"
|
||||||
|
echo "INVENTORY_FILE: $INVENTORY_FILE"
|
||||||
|
echo ""
|
||||||
|
echo "=== FILE CHECKS ==="
|
||||||
|
echo "Inventory exists: $([ -f "/tmp/molecule_workspace/inventory/hosts.ini" ] && echo "YES" || echo "NO")"
|
||||||
|
echo "Vault password exists: $([ -f "/workspace/vault/.vault" ] && echo "YES" || echo "NO")"
|
||||||
|
echo "Vault secrets exists: $([ -f "/workspace/vault/secrets.yml" ] && echo "YES" || echo "NO")"
|
||||||
|
echo "Site.yml exists: $([ -f "/workspace/molecule/default/site.yml" ] && echo "YES" || echo "NO")"
|
||||||
|
echo ""
|
||||||
|
echo "=== DIRECTORY LISTING ==="
|
||||||
|
ls -la /tmp/molecule_workspace/ || echo "No molecule_workspace dir"
|
||||||
|
ls -la /workspace/vault/ || echo "No vault dir"
|
||||||
|
echo ""
|
||||||
|
echo "=== INVENTORY CONTENT ==="
|
||||||
|
cat /tmp/molecule_workspace/inventory/hosts.ini || echo "Cannot read inventory"
|
||||||
|
'
|
||||||
|
|
||||||
|
# - name: Run lab playbook
|
||||||
|
# community.docker.docker_container_exec:
|
||||||
|
# container: ansible-controller
|
||||||
|
# command: |
|
||||||
|
# bash -c '
|
||||||
|
# set -e
|
||||||
|
# export ANSIBLE_ROLES_PATH=/workspace/roles
|
||||||
|
# export VAULT_PASSWORD_FILE="/workspace/vault/.vault"
|
||||||
|
# export VAULT_SECRETS_FILE="/workspace/vault/secrets.yml"
|
||||||
|
# export INVENTORY_FILE="/tmp/molecule_workspace/inventory/hosts.ini"
|
||||||
|
# echo "Starting playbook execution..."
|
||||||
|
# if [ -f "$VAULT_PASSWORD_FILE" ] && [ -f "$VAULT_SECRETS_FILE" ]; then
|
||||||
|
# echo "Running with vault..."
|
||||||
|
# ansible-playbook -i "$INVENTORY_FILE" /workspace/molecule/default/site.yml --vault-password-file "$VAULT_PASSWORD_FILE" -e "vault_file_path=$VAULT_SECRETS_FILE" -v
|
||||||
|
# else
|
||||||
|
# echo "Running without vault..."
|
||||||
|
# ansible-playbook -i "$INVENTORY_FILE" /workspace/molecule/default/site.yml -v
|
||||||
|
# fi
|
||||||
|
# echo "Playbook completed successfully"
|
||||||
|
# '
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# CLEANUP - Перешифровка файлов после выполнения
|
||||||
|
# =============================================================================
|
||||||
|
- name: Cleanup operations
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
================================================================================
|
||||||
|
CLEANUP - Перешифровка файлов после выполнения
|
||||||
|
================================================================================
|
||||||
|
Re-encrypting vault files
|
||||||
|
================================================================================
|
||||||
|
|
||||||
- name: Post-run — re-encrypt secrets
|
- name: Post-run — re-encrypt secrets
|
||||||
community.docker.docker_container_exec:
|
community.docker.docker_container_exec:
|
||||||
container: ansible-controller
|
container: ansible-controller
|
||||||
command: >
|
command: "bash -c 'VAULT_PASSWORD_FILE=\"/workspace/vault/.vault\"; if [ -f \"$VAULT_PASSWORD_FILE\" ] && [ -f \"/workspace/vault/secrets.yml\" ]; then ansible-vault encrypt --encrypt-vault-id default --vault-password-file \"$VAULT_PASSWORD_FILE\" /workspace/vault/secrets.yml; fi'"
|
||||||
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
|
ignore_errors: true
|
||||||
@@ -1,10 +1,14 @@
|
|||||||
---
|
---
|
||||||
|
# =============================================================================
|
||||||
|
# CREATE - Создание тестовых инстансов
|
||||||
|
# =============================================================================
|
||||||
- hosts: localhost
|
- hosts: localhost
|
||||||
gather_facts: false
|
gather_facts: false
|
||||||
vars:
|
vars:
|
||||||
# Получаем preset из переменной окружения или используем default
|
# Получаем preset из переменной окружения или используем default
|
||||||
preset_name: "{{ lookup('env', 'MOLECULE_PRESET') | default('default') }}"
|
preset_name: "{{ lookup('env', 'MOLECULE_PRESET') | default('default') }}"
|
||||||
preset_file: "/workspace/molecule/presets/{{ preset_name }}.yml"
|
# Проверяем сначала в папке k8s, затем в основной папке presets
|
||||||
|
preset_file: "{{ '/workspace/molecule/presets/k8s/' + preset_name + '.yml' if (preset_name in ['k8s-minimal', 'kubernetes', 'k8s-full'] or preset_name.startswith('k8s-')) else '/workspace/molecule/presets/' + preset_name + '.yml' }}"
|
||||||
|
|
||||||
# Fallback значения если preset файл не найден
|
# Fallback значения если preset файл не найден
|
||||||
docker_network: labnet
|
docker_network: labnet
|
||||||
@@ -13,13 +17,21 @@
|
|||||||
alt9: "inecs/ansible-lab:alt9-latest"
|
alt9: "inecs/ansible-lab:alt9-latest"
|
||||||
alt10: "inecs/ansible-lab:alt10-latest"
|
alt10: "inecs/ansible-lab:alt10-latest"
|
||||||
astra: "inecs/ansible-lab:astra-linux-latest"
|
astra: "inecs/ansible-lab:astra-linux-latest"
|
||||||
|
astra-arm64: "inecs/ansible-lab:astra-linux-arm64-latest"
|
||||||
rhel: "inecs/ansible-lab:rhel-latest"
|
rhel: "inecs/ansible-lab:rhel-latest"
|
||||||
centos: "inecs/ansible-lab:centos-latest"
|
centos7: "inecs/ansible-lab:centos7-latest"
|
||||||
|
centos8: "inecs/ansible-lab:centos8-latest"
|
||||||
|
centos9: "inecs/ansible-lab:centos9-latest"
|
||||||
alma: "inecs/ansible-lab:alma-latest"
|
alma: "inecs/ansible-lab:alma-latest"
|
||||||
rocky: "inecs/ansible-lab:rocky-latest"
|
rocky: "inecs/ansible-lab:rocky-latest"
|
||||||
redos: "inecs/ansible-lab:redos-latest"
|
redos: "inecs/ansible-lab:redos-latest"
|
||||||
ubuntu: "inecs/ansible-lab:ubuntu-latest"
|
ubuntu20: "inecs/ansible-lab:ubuntu20-latest"
|
||||||
debian: "inecs/ansible-lab:debian-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:
|
systemd_defaults:
|
||||||
privileged: true
|
privileged: true
|
||||||
command: "/sbin/init"
|
command: "/sbin/init"
|
||||||
@@ -31,6 +43,7 @@
|
|||||||
- name: u1
|
- name: u1
|
||||||
family: debian
|
family: debian
|
||||||
groups: [test]
|
groups: [test]
|
||||||
|
kind_clusters: []
|
||||||
|
|
||||||
tasks:
|
tasks:
|
||||||
# - name: Install required collections
|
# - name: Install required collections
|
||||||
@@ -83,14 +96,43 @@
|
|||||||
|
|
||||||
- name: Display filtered hosts
|
- name: Display filtered hosts
|
||||||
debug:
|
debug:
|
||||||
msg: "Platform {{ ansible_architecture }}: {{ hosts | length }} hosts will be deployed"
|
msg: |
|
||||||
|
================================================================================
|
||||||
|
СОЗДАНИЕ ТЕСТОВЫХ ИНСТАНСОВ
|
||||||
|
================================================================================
|
||||||
|
Platform: {{ ansible_architecture }}
|
||||||
|
Hosts: {{ hosts | length }}
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# СЕТЕВОЕ ПОДКЛЮЧЕНИЕ
|
||||||
|
# =============================================================================
|
||||||
|
- name: Network setup
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
================================================================================
|
||||||
|
НАСТРОЙКА СЕТИ
|
||||||
|
================================================================================
|
||||||
|
Network: {{ docker_network }}
|
||||||
|
================================================================================
|
||||||
|
|
||||||
- name: Ensure network exists
|
- name: Ensure network exists
|
||||||
community.docker.docker_network:
|
community.docker.docker_network:
|
||||||
name: "{{ docker_network }}"
|
name: "{{ docker_network }}"
|
||||||
state: present
|
state: present
|
||||||
|
|
||||||
# SYSTEMD nodes
|
# =============================================================================
|
||||||
|
# SYSTEMD NODES - Создание контейнеров с systemd
|
||||||
|
# =============================================================================
|
||||||
|
- name: Systemd nodes setup
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
================================================================================
|
||||||
|
SYSTEMD NODES - Создание контейнеров с systemd
|
||||||
|
================================================================================
|
||||||
|
Count: {{ hosts | selectattr('type','undefined') | list | length }}
|
||||||
|
================================================================================
|
||||||
|
|
||||||
- name: Pull systemd images with correct platform
|
- name: Pull systemd images with correct platform
|
||||||
command: "docker pull --platform {{ ansible_architecture }} {{ images[item.family] }}"
|
command: "docker pull --platform {{ ansible_architecture }} {{ images[item.family] }}"
|
||||||
loop: "{{ hosts | selectattr('type','undefined') | list }}"
|
loop: "{{ hosts | selectattr('type','undefined') | list }}"
|
||||||
@@ -113,15 +155,15 @@
|
|||||||
networks:
|
networks:
|
||||||
- name: "{{ docker_network }}"
|
- name: "{{ docker_network }}"
|
||||||
privileged: "{{ systemd_defaults.privileged }}"
|
privileged: "{{ systemd_defaults.privileged }}"
|
||||||
command: "{{ systemd_defaults.command }}"
|
command: "{{ '/bin/bash -c \"while true; do sleep 30; done\"' if item.family in ['alt10', 'alt9'] else systemd_defaults.command }}"
|
||||||
volumes: "{{ systemd_defaults.volumes | default([]) + (item.volumes | default([])) }}"
|
volumes: "{{ systemd_defaults.volumes | default([]) + (item.volumes | default([])) }}"
|
||||||
tmpfs: "{{ systemd_defaults.tmpfs | default([]) }}"
|
tmpfs: "{{ systemd_defaults.tmpfs | default([]) }}"
|
||||||
capabilities: "{{ systemd_defaults.capabilities | default([]) }}"
|
capabilities: "{{ systemd_defaults.capabilities | default([]) }}"
|
||||||
published_ports: "{{ item.publish | default([]) }}"
|
published_ports: "{{ item.publish | default([]) }}"
|
||||||
env: "{{ item.env | default({}) }}"
|
env: "{{ item.env | default({}) }}"
|
||||||
# Специальные настройки для Astra Linux и RedOS (для совместимости с amd64 базовыми образами)
|
# Специальные настройки для Astra Linux и RedOS
|
||||||
security_opts: "{{ ['seccomp=unconfined', 'apparmor=unconfined'] if item.family in ['astra', 'redos'] else [] }}"
|
security_opts: "{{ ['seccomp=unconfined', 'apparmor=unconfined'] if item.family in ['astra', 'redos'] else [] }}"
|
||||||
platform: "{{ 'linux/amd64' if item.family in ['astra', 'redos'] else omit }}"
|
platform: "{{ item.docker_platform | default(item.platform) | default(omit) }}"
|
||||||
state: started
|
state: started
|
||||||
restart_policy: unless-stopped
|
restart_policy: unless-stopped
|
||||||
loop: "{{ hosts | selectattr('type','undefined') | list }}"
|
loop: "{{ hosts | selectattr('type','undefined') | list }}"
|
||||||
@@ -131,9 +173,69 @@
|
|||||||
# Ожидание стабилизации контейнеров
|
# Ожидание стабилизации контейнеров
|
||||||
- name: Wait for containers to be ready
|
- name: Wait for containers to be ready
|
||||||
pause:
|
pause:
|
||||||
seconds: 5
|
seconds: 10
|
||||||
when: hosts | length > 0
|
when: hosts | length > 0
|
||||||
|
|
||||||
|
# Проверка готовности контейнеров
|
||||||
|
- name: Wait for containers to be running
|
||||||
|
community.docker.docker_container_info:
|
||||||
|
name: "{{ item.name }}"
|
||||||
|
register: container_info
|
||||||
|
loop: "{{ hosts | selectattr('type','undefined') | list }}"
|
||||||
|
loop_control: { label: "{{ item.name }}" }
|
||||||
|
when: item.family is defined and images[item.family] is defined
|
||||||
|
retries: 10
|
||||||
|
delay: 5
|
||||||
|
until: container_info.container.State.Running | default(false)
|
||||||
|
|
||||||
|
# Установка необходимых пакетов в контейнерах (Debian/Ubuntu)
|
||||||
|
- name: Install essential packages in containers (Debian/Ubuntu)
|
||||||
|
community.docker.docker_container_exec:
|
||||||
|
container: "{{ item.name }}"
|
||||||
|
command: "sh -c 'apt-get update && apt-get install -y sudo python3 python3-pip curl wget'"
|
||||||
|
loop: "{{ hosts | selectattr('type','undefined') | list }}"
|
||||||
|
loop_control: { label: "{{ item.name }}" }
|
||||||
|
when: item.family is defined and images[item.family] is defined and item.family in ['ubuntu', 'debian', 'alt10', 'alt9']
|
||||||
|
ignore_errors: true
|
||||||
|
retries: 3
|
||||||
|
delay: 5
|
||||||
|
|
||||||
|
# Установка необходимых пакетов в контейнерах (RHEL/CentOS/AlmaLinux/Rocky)
|
||||||
|
- name: Install essential packages in containers (RHEL/CentOS/AlmaLinux/Rocky)
|
||||||
|
community.docker.docker_container_exec:
|
||||||
|
container: "{{ item.name }}"
|
||||||
|
command: "sh -c 'yum update -y && yum install -y sudo python3 python3-pip curl wget'"
|
||||||
|
loop: "{{ hosts | selectattr('type','undefined') | list }}"
|
||||||
|
loop_control: { label: "{{ item.name }}" }
|
||||||
|
when: item.family is defined and images[item.family] is defined and item.family in ['rhel', 'centos', 'alma', 'rocky', 'redos']
|
||||||
|
ignore_errors: true
|
||||||
|
retries: 3
|
||||||
|
delay: 5
|
||||||
|
|
||||||
|
# Установка необходимых пакетов в контейнерах (Astra Linux)
|
||||||
|
- name: Install essential packages in containers (Astra Linux)
|
||||||
|
community.docker.docker_container_exec:
|
||||||
|
container: "{{ item.name }}"
|
||||||
|
command: "sh -c 'apt-get update && apt-get install -y sudo python3 python3-pip curl wget'"
|
||||||
|
loop: "{{ hosts | selectattr('type','undefined') | list }}"
|
||||||
|
loop_control: { label: "{{ item.name }}" }
|
||||||
|
when: item.family is defined and images[item.family] is defined and item.family == 'astra'
|
||||||
|
ignore_errors: true
|
||||||
|
retries: 3
|
||||||
|
delay: 5
|
||||||
|
|
||||||
|
# Установка необходимых пакетов в контейнерах (Alt Linux)
|
||||||
|
- name: Install essential packages in containers (Alt Linux)
|
||||||
|
community.docker.docker_container_exec:
|
||||||
|
container: "{{ item.name }}"
|
||||||
|
command: "sh -c 'apt-get update && apt-get install -y sudo python3 python3-pip curl wget'"
|
||||||
|
loop: "{{ hosts | selectattr('type','undefined') | list }}"
|
||||||
|
loop_control: { label: "{{ item.name }}" }
|
||||||
|
when: item.family is defined and images[item.family] is defined and item.family in ['alt10', 'alt9']
|
||||||
|
ignore_errors: true
|
||||||
|
retries: 3
|
||||||
|
delay: 5
|
||||||
|
|
||||||
# Создание tmp директории в контейнерах
|
# Создание tmp директории в контейнерах
|
||||||
- name: Create Ansible tmp directory in containers
|
- name: Create Ansible tmp directory in containers
|
||||||
community.docker.docker_container_exec:
|
community.docker.docker_container_exec:
|
||||||
@@ -143,10 +245,33 @@
|
|||||||
loop_control: { label: "{{ item.name }}" }
|
loop_control: { label: "{{ item.name }}" }
|
||||||
when: item.family is defined and images[item.family] is defined
|
when: item.family is defined and images[item.family] is defined
|
||||||
ignore_errors: true
|
ignore_errors: true
|
||||||
retries: 3
|
retries: 5
|
||||||
delay: 2
|
delay: 3
|
||||||
|
|
||||||
|
# Создание vault директории в контейнерах
|
||||||
|
- name: Create vault directory in containers
|
||||||
|
community.docker.docker_container_exec:
|
||||||
|
container: "{{ item.name }}"
|
||||||
|
command: "mkdir -p /workspace/vault && chmod 755 /workspace/vault"
|
||||||
|
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: 5
|
||||||
|
delay: 3
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# DIND NODES - Создание контейнеров Docker-in-Docker
|
||||||
|
# =============================================================================
|
||||||
|
- name: DinD nodes setup
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
================================================================================
|
||||||
|
DIND NODES - Создание контейнеров Docker-in-Docker
|
||||||
|
================================================================================
|
||||||
|
Count: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list | length }}
|
||||||
|
================================================================================
|
||||||
|
|
||||||
# DinD nodes
|
|
||||||
- name: Start DinD nodes (docker:27-dind)
|
- name: Start DinD nodes (docker:27-dind)
|
||||||
community.docker.docker_container:
|
community.docker.docker_container:
|
||||||
name: "{{ item.name }}"
|
name: "{{ item.name }}"
|
||||||
@@ -163,7 +288,18 @@
|
|||||||
loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list }}"
|
loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list }}"
|
||||||
loop_control: { label: "{{ item.name }}" }
|
loop_control: { label: "{{ item.name }}" }
|
||||||
|
|
||||||
# DOoD nodes (mount docker.sock)
|
# =============================================================================
|
||||||
|
# DOOD NODES - Создание контейнеров Docker-out-of-Docker
|
||||||
|
# =============================================================================
|
||||||
|
- name: DOoD nodes setup
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
================================================================================
|
||||||
|
DOOD NODES - Создание контейнеров Docker-out-of-Docker
|
||||||
|
================================================================================
|
||||||
|
Count: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dood') | list | length }}
|
||||||
|
================================================================================
|
||||||
|
|
||||||
- name: Start DOoD nodes (systemd + docker.sock mount)
|
- name: Start DOoD nodes (systemd + docker.sock mount)
|
||||||
community.docker.docker_container:
|
community.docker.docker_container:
|
||||||
name: "{{ item.name }}"
|
name: "{{ item.name }}"
|
||||||
@@ -177,6 +313,7 @@
|
|||||||
capabilities: "{{ systemd_defaults.capabilities | default([]) }}"
|
capabilities: "{{ systemd_defaults.capabilities | default([]) }}"
|
||||||
published_ports: "{{ item.publish | default([]) }}"
|
published_ports: "{{ item.publish | default([]) }}"
|
||||||
env: "{{ item.env | default({}) }}"
|
env: "{{ item.env | default({}) }}"
|
||||||
|
platform: "{{ item.docker_platform | default(item.platform) | default(omit) }}"
|
||||||
state: started
|
state: started
|
||||||
restart_policy: unless-stopped
|
restart_policy: unless-stopped
|
||||||
loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dood') | list }}"
|
loop: "{{ hosts | selectattr('type','defined') | selectattr('type','equalto','dood') | list }}"
|
||||||
@@ -198,7 +335,18 @@
|
|||||||
item_name: "{{ item.0.name }}"
|
item_name: "{{ item.0.name }}"
|
||||||
item_group: "{{ item.1 }}"
|
item_group: "{{ item.1 }}"
|
||||||
|
|
||||||
# Render inventory
|
# =============================================================================
|
||||||
|
# ИНВЕНТАРЬ - Генерация inventory файла
|
||||||
|
# =============================================================================
|
||||||
|
- name: Inventory generation
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
================================================================================
|
||||||
|
ИНВЕНТАРЬ - Генерация inventory файла
|
||||||
|
================================================================================
|
||||||
|
File: {{ generated_inventory }}
|
||||||
|
================================================================================
|
||||||
|
|
||||||
- name: Render inventory ini
|
- name: Render inventory ini
|
||||||
set_fact:
|
set_fact:
|
||||||
inv_content: |
|
inv_content: |
|
||||||
@@ -265,7 +413,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{# Глобальный fallback для остальных хостов #}
|
{# Глобальный fallback для остальных хостов #}
|
||||||
[unmatched_hosts:vars]
|
[all:vars]
|
||||||
ansible_python_interpreter=auto_silent
|
ansible_python_interpreter=auto_silent
|
||||||
|
|
||||||
- name: Write inventory file
|
- name: Write inventory file
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
---
|
---
|
||||||
|
# =============================================================================
|
||||||
|
# DESTROY - Удаление тестовых инстансов
|
||||||
|
# =============================================================================
|
||||||
- hosts: localhost
|
- hosts: localhost
|
||||||
gather_facts: false
|
gather_facts: false
|
||||||
vars:
|
vars:
|
||||||
# Получаем preset из переменной окружения или используем default
|
# Получаем preset из переменной окружения или используем default
|
||||||
preset_name: "{{ lookup('env', 'MOLECULE_PRESET') | default('default') }}"
|
preset_name: "{{ lookup('env', 'MOLECULE_PRESET') | default('default') }}"
|
||||||
preset_file: "/workspace/molecule/presets/{{ preset_name }}.yml"
|
# Проверяем сначала в папке k8s, затем в основной папке presets
|
||||||
|
preset_file: "{{ '/workspace/molecule/presets/k8s/' + preset_name + '.yml' if (preset_name in ['k8s-minimal', 'kubernetes', 'k8s-full'] or preset_name.startswith('k8s-')) else '/workspace/molecule/presets/' + preset_name + '.yml' }}"
|
||||||
|
|
||||||
# Fallback значения если preset файл не найден
|
# Fallback значения если preset файл не найден
|
||||||
docker_network: labnet
|
docker_network: labnet
|
||||||
@@ -12,13 +16,38 @@
|
|||||||
- name: u1
|
- name: u1
|
||||||
family: debian
|
family: debian
|
||||||
groups: [test]
|
groups: [test]
|
||||||
|
kind_clusters: []
|
||||||
|
|
||||||
tasks:
|
tasks:
|
||||||
|
# =============================================================================
|
||||||
|
# НАСТРОЙКА - Загрузка конфигурации
|
||||||
|
# =============================================================================
|
||||||
|
- name: Configuration setup
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
================================================================================
|
||||||
|
НАСТРОЙКА - Загрузка конфигурации
|
||||||
|
================================================================================
|
||||||
|
Preset: {{ preset_name }}
|
||||||
|
================================================================================
|
||||||
|
|
||||||
- name: Load preset configuration
|
- name: Load preset configuration
|
||||||
include_vars: "{{ preset_file }}"
|
include_vars: "{{ preset_file }}"
|
||||||
when: preset_file is file
|
when: preset_file is file
|
||||||
ignore_errors: true
|
ignore_errors: true
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# УДАЛЕНИЕ КОНТЕЙНЕРОВ - Остановка и удаление контейнеров
|
||||||
|
# =============================================================================
|
||||||
|
- name: Container removal
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
================================================================================
|
||||||
|
УДАЛЕНИЕ КОНТЕЙНЕРОВ - Остановка и удаление контейнеров
|
||||||
|
================================================================================
|
||||||
|
Count: {{ hosts | length }} containers
|
||||||
|
================================================================================
|
||||||
|
|
||||||
- name: Stop and remove containers
|
- name: Stop and remove containers
|
||||||
community.docker.docker_container:
|
community.docker.docker_container:
|
||||||
name: "{{ item.name }}"
|
name: "{{ item.name }}"
|
||||||
@@ -53,6 +82,18 @@
|
|||||||
ignore_errors: true
|
ignore_errors: true
|
||||||
when: item.volumes is defined
|
when: item.volumes is defined
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# ОЧИСТКА СЕТИ - Удаление Docker сети
|
||||||
|
# =============================================================================
|
||||||
|
- name: Network cleanup
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
================================================================================
|
||||||
|
ОЧИСТКА СЕТИ - Удаление Docker сети
|
||||||
|
================================================================================
|
||||||
|
Network: {{ docker_network }}
|
||||||
|
================================================================================
|
||||||
|
|
||||||
- name: Remove network
|
- name: Remove network
|
||||||
community.docker.docker_network:
|
community.docker.docker_network:
|
||||||
name: "{{ docker_network }}"
|
name: "{{ docker_network }}"
|
||||||
@@ -73,11 +114,14 @@
|
|||||||
vars:
|
vars:
|
||||||
# Используем переменную hosts из загруженного пресета
|
# Используем переменную hosts из загруженного пресета
|
||||||
hosts: "{{ hosts }}"
|
hosts: "{{ hosts }}"
|
||||||
|
|
||||||
- name: Display cleanup summary
|
- name: Display cleanup summary
|
||||||
debug:
|
debug:
|
||||||
msg: |
|
msg: |
|
||||||
🧹 Cleanup Summary:
|
================================================================================
|
||||||
- Removed containers: {{ hosts | length }}
|
CLEANUP SUMMARY
|
||||||
- Removed DinD volumes: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list | length }}
|
================================================================================
|
||||||
- Network: {{ docker_network }}
|
Containers: {{ hosts | length }}
|
||||||
|
Volumes: {{ hosts | selectattr('type','defined') | selectattr('type','equalto','dind') | list | length }}
|
||||||
|
Network: {{ docker_network }}
|
||||||
|
Clusters: {{ kind_clusters | default([]) | length }}
|
||||||
|
================================================================================
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ driver:
|
|||||||
|
|
||||||
platforms:
|
platforms:
|
||||||
# Платформы будут созданы динамически через preset файлы
|
# Платформы будут созданы динамически через preset файлы
|
||||||
# Поддержка собственных образов DevOpsLab
|
# Поддержка собственных образов DevOpsLab с правильными тегами
|
||||||
- name: placeholder
|
- name: placeholder
|
||||||
image: ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy
|
image: ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy
|
||||||
pre_build_image: true
|
pre_build_image: true
|
||||||
@@ -16,32 +16,71 @@ platforms:
|
|||||||
- name: ansible-controller
|
- name: ansible-controller
|
||||||
image: inecs/ansible-lab:ansible-controller-latest
|
image: inecs/ansible-lab:ansible-controller-latest
|
||||||
pre_build_image: true
|
pre_build_image: true
|
||||||
- name: alt-linux
|
volumes:
|
||||||
|
- "${MOLECULE_EPHEMERAL_DIRECTORY}:/tmp/molecule_workspace:ro"
|
||||||
|
- "../vault:/workspace/vault:ro"
|
||||||
|
# ALT Linux
|
||||||
|
- name: alt9
|
||||||
image: inecs/ansible-lab:alt9-latest
|
image: inecs/ansible-lab:alt9-latest
|
||||||
pre_build_image: true
|
pre_build_image: true
|
||||||
|
- name: alt10
|
||||||
|
image: inecs/ansible-lab:alt10-latest
|
||||||
|
pre_build_image: true
|
||||||
|
# Astra Linux
|
||||||
- name: astra-linux
|
- name: astra-linux
|
||||||
image: inecs/ansible-lab:astra-linux-latest
|
image: inecs/ansible-lab:astra-linux-latest
|
||||||
pre_build_image: true
|
pre_build_image: true
|
||||||
|
- name: astra-linux-arm64
|
||||||
|
image: inecs/ansible-lab:astra-linux-arm64-latest
|
||||||
|
pre_build_image: true
|
||||||
|
# RED OS
|
||||||
- name: redos
|
- name: redos
|
||||||
image: inecs/ansible-lab:redos-latest
|
image: inecs/ansible-lab:redos-latest
|
||||||
pre_build_image: true
|
pre_build_image: true
|
||||||
|
# RHEL
|
||||||
- name: rhel
|
- name: rhel
|
||||||
image: inecs/ansible-lab:rhel-latest
|
image: inecs/ansible-lab:rhel-latest
|
||||||
pre_build_image: true
|
pre_build_image: true
|
||||||
- name: centos
|
# CentOS
|
||||||
image: inecs/ansible-lab:centos-latest
|
- name: centos7
|
||||||
|
image: inecs/ansible-lab:centos7-latest
|
||||||
pre_build_image: true
|
pre_build_image: true
|
||||||
|
- name: centos8
|
||||||
|
image: inecs/ansible-lab:centos8-latest
|
||||||
|
pre_build_image: true
|
||||||
|
- name: centos9
|
||||||
|
image: inecs/ansible-lab:centos9-latest
|
||||||
|
pre_build_image: true
|
||||||
|
# AlmaLinux
|
||||||
- name: alma
|
- name: alma
|
||||||
image: inecs/ansible-lab:alma-latest
|
image: inecs/ansible-lab:alma-latest
|
||||||
pre_build_image: true
|
pre_build_image: true
|
||||||
|
# Rocky Linux
|
||||||
- name: rocky
|
- name: rocky
|
||||||
image: inecs/ansible-lab:rocky-latest
|
image: inecs/ansible-lab:rocky-latest
|
||||||
pre_build_image: true
|
pre_build_image: true
|
||||||
- name: ubuntu
|
# Ubuntu
|
||||||
image: inecs/ansible-lab:ubuntu-latest
|
- name: ubuntu20
|
||||||
|
image: inecs/ansible-lab:ubuntu20-latest
|
||||||
pre_build_image: true
|
pre_build_image: true
|
||||||
- name: debian
|
- name: ubuntu22
|
||||||
image: inecs/ansible-lab:debian-latest
|
image: inecs/ansible-lab:ubuntu22-latest
|
||||||
|
pre_build_image: true
|
||||||
|
- name: ubuntu24
|
||||||
|
image: inecs/ansible-lab:ubuntu24-latest
|
||||||
|
pre_build_image: true
|
||||||
|
# Debian
|
||||||
|
- name: debian9
|
||||||
|
image: inecs/ansible-lab:debian9-latest
|
||||||
|
pre_build_image: true
|
||||||
|
- name: debian10
|
||||||
|
image: inecs/ansible-lab:debian10-latest
|
||||||
|
pre_build_image: true
|
||||||
|
- name: debian11
|
||||||
|
image: inecs/ansible-lab:debian11-latest
|
||||||
|
pre_build_image: true
|
||||||
|
- name: debian12
|
||||||
|
image: inecs/ansible-lab:debian12-latest
|
||||||
pre_build_image: true
|
pre_build_image: true
|
||||||
|
|
||||||
provisioner:
|
provisioner:
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
---
|
---
|
||||||
|
# =============================================================================
|
||||||
|
# SITE - Основной playbook для тестирования Ansible ролей
|
||||||
|
# =============================================================================
|
||||||
# Универсальный playbook для тестирования Ansible ролей
|
# Универсальный playbook для тестирования Ansible ролей
|
||||||
# Автор: Сергей Антропов
|
# Автор: Сергей Антропов
|
||||||
# Сайт: https://devops.org.ru
|
# Сайт: https://devops.org.ru
|
||||||
@@ -13,6 +16,14 @@
|
|||||||
hosts: all
|
hosts: all
|
||||||
become: true
|
become: true
|
||||||
tasks:
|
tasks:
|
||||||
|
# Сброс цветовых кодов ANSI для корректного отображения
|
||||||
|
- name: Reset ANSI color codes
|
||||||
|
debug:
|
||||||
|
msg: "\033[0m"
|
||||||
|
changed_when: false
|
||||||
|
tags:
|
||||||
|
- setup
|
||||||
|
- color-reset
|
||||||
# Создание tmp директории для Ansible
|
# Создание tmp директории для Ansible
|
||||||
- name: Create Ansible tmp directory
|
- name: Create Ansible tmp directory
|
||||||
file:
|
file:
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
---
|
---
|
||||||
|
# =============================================================================
|
||||||
|
# VERIFY - Проверка тестовых инстансов
|
||||||
|
# =============================================================================
|
||||||
- hosts: localhost
|
- hosts: localhost
|
||||||
gather_facts: false
|
gather_facts: false
|
||||||
vars:
|
vars:
|
||||||
@@ -14,12 +17,35 @@
|
|||||||
groups: [test]
|
groups: [test]
|
||||||
|
|
||||||
tasks:
|
tasks:
|
||||||
|
# =============================================================================
|
||||||
|
# НАСТРОЙКА - Загрузка конфигурации
|
||||||
|
# =============================================================================
|
||||||
|
- name: Configuration setup
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
================================================================================
|
||||||
|
НАСТРОЙКА - Загрузка конфигурации
|
||||||
|
================================================================================
|
||||||
|
Preset: {{ preset_name }}
|
||||||
|
================================================================================
|
||||||
|
|
||||||
- name: Load preset configuration
|
- name: Load preset configuration
|
||||||
include_vars: "{{ preset_file }}"
|
include_vars: "{{ preset_file }}"
|
||||||
when: preset_file is file
|
when: preset_file is file
|
||||||
ignore_errors: true
|
ignore_errors: true
|
||||||
|
|
||||||
# Проверка systemd узлов
|
# =============================================================================
|
||||||
|
# ПРОВЕРКА SYSTEMD УЗЛОВ - Статус systemd контейнеров
|
||||||
|
# =============================================================================
|
||||||
|
- name: Systemd nodes verification
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
================================================================================
|
||||||
|
ПРОВЕРКА SYSTEMD УЗЛОВ - Статус systemd контейнеров
|
||||||
|
================================================================================
|
||||||
|
Count: {{ hosts | selectattr('type','undefined') | list | length }}
|
||||||
|
================================================================================
|
||||||
|
|
||||||
- name: Check systemd nodes status
|
- name: Check systemd nodes status
|
||||||
community.docker.docker_container_exec:
|
community.docker.docker_container_exec:
|
||||||
container: "{{ item.name }}"
|
container: "{{ item.name }}"
|
||||||
|
|||||||
106
molecule/presets/cod.yml
Normal file
106
molecule/presets/cod.yml
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
---
|
||||||
|
# COD пресет с 6 контейнерами (Ubuntu + Debian + Alt + Astra + CentOS + RHEL)
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
# Описание: Пресет для тестирования ролей на различных ОС
|
||||||
|
# Использует образы Ubuntu, Debian, Alt, Astra, CentOS, RHEL (все ARM64)
|
||||||
|
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
|
||||||
|
# Используем стабильные образы Ubuntu, Debian, Alt, Astra, CentOS, RHEL (все ARM64)
|
||||||
|
images:
|
||||||
|
ubuntu: "inecs/ansible-lab:ubuntu22-latest"
|
||||||
|
debian: "inecs/ansible-lab:debian12-latest"
|
||||||
|
alt: "inecs/ansible-lab:alt10-latest"
|
||||||
|
astra: "inecs/ansible-lab:astra-linux-arm64-latest" # ARM64 образ
|
||||||
|
centos: "inecs/ansible-lab:centos9-latest" # ARM64 образ
|
||||||
|
rhel: "inecs/ansible-lab:rhel-latest" # ARM64 образ
|
||||||
|
|
||||||
|
# Настройки для ARM64
|
||||||
|
# Используем нативные ARM64 образы
|
||||||
|
platform: "linux/arm64"
|
||||||
|
|
||||||
|
# Настройки Docker для ARM64
|
||||||
|
docker_options:
|
||||||
|
platform: "linux/arm64"
|
||||||
|
|
||||||
|
systemd_defaults:
|
||||||
|
privileged: true
|
||||||
|
command: "/bin/bash -c \"while true; do sleep 30; done\""
|
||||||
|
platform: "linux/arm64" # Используем ARM64
|
||||||
|
volumes:
|
||||||
|
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
|
||||||
|
tmpfs: ["/run", "/run/lock"]
|
||||||
|
capabilities: ["SYS_ADMIN"]
|
||||||
|
|
||||||
|
# Принудительная установка платформы для всех операций Docker
|
||||||
|
docker_platform: "linux/amd64"
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
# =============================================================================
|
||||||
|
# UBUNTU СЕРВЕРЫ
|
||||||
|
# =============================================================================
|
||||||
|
- name: ubuntu1
|
||||||
|
family: ubuntu
|
||||||
|
groups: [cod, ubuntu]
|
||||||
|
platform: "linux/arm64" # Используем ARM64
|
||||||
|
docker_options:
|
||||||
|
platform: "linux/arm64"
|
||||||
|
docker_platform: "linux/arm64"
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# DEBIAN СЕРВЕРЫ
|
||||||
|
# =============================================================================
|
||||||
|
- name: debian1
|
||||||
|
family: debian
|
||||||
|
groups: [cod, debian]
|
||||||
|
platform: "linux/arm64" # Используем ARM64
|
||||||
|
docker_options:
|
||||||
|
platform: "linux/arm64"
|
||||||
|
docker_platform: "linux/arm64"
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# ALT СЕРВЕРЫ
|
||||||
|
# =============================================================================
|
||||||
|
- name: alt1
|
||||||
|
family: alt
|
||||||
|
groups: [cod, alt]
|
||||||
|
platform: "linux/arm64" # Используем ARM64
|
||||||
|
docker_options:
|
||||||
|
platform: "linux/arm64"
|
||||||
|
docker_platform: "linux/arm64"
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# ASTRA СЕРВЕРЫ (ARM64)
|
||||||
|
# =============================================================================
|
||||||
|
- name: astra1
|
||||||
|
family: astra
|
||||||
|
groups: [cod, astra]
|
||||||
|
platform: "linux/arm64" # Используем ARM64
|
||||||
|
docker_options:
|
||||||
|
platform: "linux/arm64"
|
||||||
|
docker_platform: "linux/arm64"
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# CENTOS СЕРВЕРЫ (ARM64)
|
||||||
|
# =============================================================================
|
||||||
|
- name: centos1
|
||||||
|
family: centos
|
||||||
|
groups: [cod, centos]
|
||||||
|
platform: "linux/arm64" # Используем ARM64
|
||||||
|
docker_options:
|
||||||
|
platform: "linux/arm64"
|
||||||
|
docker_platform: "linux/arm64"
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# RHEL СЕРВЕРЫ (ARM64)
|
||||||
|
# =============================================================================
|
||||||
|
#- name: rhel1
|
||||||
|
# family: rhel
|
||||||
|
# groups: [cod, rhel]
|
||||||
|
# platform: "linux/arm64" # Используем ARM64
|
||||||
|
# docker_options:
|
||||||
|
# platform: "linux/arm64"
|
||||||
|
# docker_platform: "linux/arm64"
|
||||||
|
|
||||||
@@ -34,6 +34,20 @@ systemd_defaults:
|
|||||||
tmpfs: ["/run", "/run/lock"]
|
tmpfs: ["/run", "/run/lock"]
|
||||||
capabilities: ["SYS_ADMIN"]
|
capabilities: ["SYS_ADMIN"]
|
||||||
|
|
||||||
|
# Kind кластеры (опционально)
|
||||||
|
# kind_clusters:
|
||||||
|
# - name: lab
|
||||||
|
# workers: 2
|
||||||
|
# api_port: 6443
|
||||||
|
# addons:
|
||||||
|
# ingress_nginx: true
|
||||||
|
# metrics_server: true
|
||||||
|
# istio: true
|
||||||
|
# kiali: true
|
||||||
|
# prometheus_stack: true
|
||||||
|
# ingress_host_http_port: 8081
|
||||||
|
# ingress_host_https_port: 8443
|
||||||
|
|
||||||
hosts:
|
hosts:
|
||||||
# Стандартный набор - 3 хоста
|
# Стандартный набор - 3 хоста
|
||||||
- name: u1
|
- name: u1
|
||||||
|
|||||||
93
molecule/presets/geop.yml
Normal file
93
molecule/presets/geop.yml
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
---
|
||||||
|
# Геополитический пресет с 5 контейнерами (Ubuntu + Debian + Alt + Astra + RedOS)
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
# Описание: Пресет для тестирования ролей на различных ОС
|
||||||
|
# Использует образы Ubuntu, Debian, Alt, Astra и RedOS
|
||||||
|
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
|
||||||
|
# Используем стабильные образы Ubuntu, Debian, Alt, Astra и RedOS (ARM64)
|
||||||
|
images:
|
||||||
|
ubuntu: "inecs/ansible-lab:ubuntu22-latest"
|
||||||
|
debian: "inecs/ansible-lab:debian12-latest"
|
||||||
|
alt: "inecs/ansible-lab:alt10-latest"
|
||||||
|
astra: "inecs/ansible-lab:astra-latest-arm64" # ARM64 образ
|
||||||
|
redos: "inecs/ansible-lab:redos-latest-arm64" # ARM64 образ
|
||||||
|
|
||||||
|
# Настройки для ARM64
|
||||||
|
# Используем нативные ARM64 образы
|
||||||
|
platform: "linux/arm64"
|
||||||
|
|
||||||
|
# Настройки Docker для ARM64
|
||||||
|
docker_options:
|
||||||
|
platform: "linux/arm64"
|
||||||
|
|
||||||
|
systemd_defaults:
|
||||||
|
privileged: true
|
||||||
|
command: "/bin/bash -c \"while true; do sleep 30; done\""
|
||||||
|
platform: "linux/arm64" # Используем ARM64
|
||||||
|
volumes:
|
||||||
|
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
|
||||||
|
tmpfs: ["/run", "/run/lock"]
|
||||||
|
capabilities: ["SYS_ADMIN"]
|
||||||
|
|
||||||
|
# Принудительная установка платформы для всех операций Docker
|
||||||
|
docker_platform: "linux/amd64"
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
# =============================================================================
|
||||||
|
# UBUNTU СЕРВЕРЫ
|
||||||
|
# =============================================================================
|
||||||
|
- name: ubuntu1
|
||||||
|
family: ubuntu
|
||||||
|
groups: [geop, ubuntu]
|
||||||
|
platform: "linux/arm64" # Используем ARM64
|
||||||
|
docker_options:
|
||||||
|
platform: "linux/arm64"
|
||||||
|
docker_platform: "linux/arm64"
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# DEBIAN СЕРВЕРЫ
|
||||||
|
# =============================================================================
|
||||||
|
- name: debian1
|
||||||
|
family: debian
|
||||||
|
groups: [geop, debian]
|
||||||
|
platform: "linux/arm64" # Используем ARM64
|
||||||
|
docker_options:
|
||||||
|
platform: "linux/arm64"
|
||||||
|
docker_platform: "linux/arm64"
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# ALT СЕРВЕРЫ
|
||||||
|
# =============================================================================
|
||||||
|
- name: alt1
|
||||||
|
family: alt
|
||||||
|
groups: [geop, alt]
|
||||||
|
platform: "linux/arm64" # Используем ARM64
|
||||||
|
docker_options:
|
||||||
|
platform: "linux/arm64"
|
||||||
|
docker_platform: "linux/arm64"
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# ASTRA СЕРВЕРЫ (ARM64)
|
||||||
|
# =============================================================================
|
||||||
|
- name: astra1
|
||||||
|
family: astra
|
||||||
|
groups: [geop, astra]
|
||||||
|
platform: "linux/arm64" # Используем ARM64
|
||||||
|
docker_options:
|
||||||
|
platform: "linux/arm64"
|
||||||
|
docker_platform: "linux/arm64"
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# REDOS СЕРВЕРЫ (ARM64)
|
||||||
|
# =============================================================================
|
||||||
|
#- name: redos1
|
||||||
|
# family: redos
|
||||||
|
# groups: [geop, redos]
|
||||||
|
# platform: "linux/arm64" # Используем ARM64
|
||||||
|
# docker_options:
|
||||||
|
# platform: "linux/arm64"
|
||||||
|
# docker_platform: "linux/arm64"
|
||||||
42
molecule/presets/k8s/k8s-minimal.yml
Normal file
42
molecule/presets/k8s/k8s-minimal.yml
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
---
|
||||||
|
#description: Минимальный Kind кластер без аддонов
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
|
||||||
|
# systemd-ready образы
|
||||||
|
images:
|
||||||
|
alt: "inecs/ansible-lab:alt-linux-latest"
|
||||||
|
astra: "inecs/ansible-lab:astra-linux-latest"
|
||||||
|
rhel: "inecs/ansible-lab:rhel-latest"
|
||||||
|
centos7: "inecs/ansible-lab:centos7-latest"
|
||||||
|
centos8: "inecs/ansible-lab:centos8-latest"
|
||||||
|
centos9: "inecs/ansible-lab:centos9-latest"
|
||||||
|
alma: "inecs/ansible-lab:alma-latest"
|
||||||
|
rocky: "inecs/ansible-lab:rocky-latest"
|
||||||
|
redos: "inecs/ansible-lab:redos-latest"
|
||||||
|
ubuntu20: "inecs/ansible-lab:ubuntu20-latest"
|
||||||
|
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
|
||||||
|
ubuntu24: "inecs/ansible-lab:ubuntu24-latest"
|
||||||
|
debian9: "inecs/ansible-lab:debian9-latest"
|
||||||
|
debian10: "inecs/ansible-lab:debian10-latest"
|
||||||
|
debian11: "inecs/ansible-lab:debian11-latest"
|
||||||
|
debian12: "inecs/ansible-lab:debian12-latest"
|
||||||
|
|
||||||
|
systemd_defaults:
|
||||||
|
privileged: true
|
||||||
|
command: "/sbin/init"
|
||||||
|
volumes:
|
||||||
|
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
|
||||||
|
tmpfs: ["/run", "/run/lock"]
|
||||||
|
capabilities: ["SYS_ADMIN"]
|
||||||
|
|
||||||
|
# Минимальный Kind кластер без аддонов
|
||||||
|
kind_clusters:
|
||||||
|
- name: minimal
|
||||||
|
workers: 0 # Только control-plane
|
||||||
|
api_port: 6443
|
||||||
|
|
||||||
|
hosts: []
|
||||||
66
molecule/presets/k8s/kubernetes.yml
Normal file
66
molecule/presets/k8s/kubernetes.yml
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
---
|
||||||
|
#description: Пресет для тестирования с Kubernetes Kind кластером
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
|
||||||
|
# systemd-ready образы
|
||||||
|
images:
|
||||||
|
alt: "inecs/ansible-lab:alt-linux-latest"
|
||||||
|
astra: "inecs/ansible-lab:astra-linux-latest"
|
||||||
|
rhel: "inecs/ansible-lab:rhel-latest"
|
||||||
|
centos7: "inecs/ansible-lab:centos7-latest"
|
||||||
|
centos8: "inecs/ansible-lab:centos8-latest"
|
||||||
|
centos9: "inecs/ansible-lab:centos9-latest"
|
||||||
|
alma: "inecs/ansible-lab:alma-latest"
|
||||||
|
rocky: "inecs/ansible-lab:rocky-latest"
|
||||||
|
redos: "inecs/ansible-lab:redos-latest"
|
||||||
|
ubuntu20: "inecs/ansible-lab:ubuntu20-latest"
|
||||||
|
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
|
||||||
|
ubuntu24: "inecs/ansible-lab:ubuntu24-latest"
|
||||||
|
debian9: "inecs/ansible-lab:debian9-latest"
|
||||||
|
debian10: "inecs/ansible-lab:debian10-latest"
|
||||||
|
debian11: "inecs/ansible-lab:debian11-latest"
|
||||||
|
debian12: "inecs/ansible-lab:debian12-latest"
|
||||||
|
|
||||||
|
systemd_defaults:
|
||||||
|
privileged: true
|
||||||
|
command: "/sbin/init"
|
||||||
|
volumes:
|
||||||
|
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
|
||||||
|
tmpfs: ["/run", "/run/lock"]
|
||||||
|
capabilities: ["SYS_ADMIN"]
|
||||||
|
|
||||||
|
# Kind кластеры с полным набором аддонов
|
||||||
|
kind_clusters:
|
||||||
|
- name: lab
|
||||||
|
workers: 2
|
||||||
|
api_port: 6443
|
||||||
|
addons:
|
||||||
|
ingress_nginx: true
|
||||||
|
metrics_server: true
|
||||||
|
istio: true
|
||||||
|
kiali: true
|
||||||
|
prometheus_stack: true
|
||||||
|
# Порты для доступа к аддонам извне
|
||||||
|
# Ingress HTTP: http://localhost:8081
|
||||||
|
# Ingress HTTPS: https://localhost:8443
|
||||||
|
# Prometheus: http://localhost:9090
|
||||||
|
# Grafana: http://localhost:3000 (admin/admin)
|
||||||
|
# Kiali: http://localhost:20001
|
||||||
|
# Metrics Server: http://localhost:4443
|
||||||
|
addon_ports:
|
||||||
|
ingress_http: 8081
|
||||||
|
ingress_https: 8443
|
||||||
|
prometheus: 9090
|
||||||
|
grafana: 3000
|
||||||
|
kiali: 20001
|
||||||
|
metrics_server: 4443
|
||||||
|
|
||||||
|
hosts: []
|
||||||
|
# # Стандартный набор - 2 хоста для базового тестирования (стабильные ОС)
|
||||||
|
# - name: u1
|
||||||
|
# family: ubuntu22
|
||||||
|
# groups: [test, web]
|
||||||
42
molecule/presets/minimal.yml
Normal file
42
molecule/presets/minimal.yml
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
---
|
||||||
|
#description: Минимальный пресет для быстрого тестирования с 1 хостом (Debian)
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
docker_network: labnet
|
||||||
|
generated_inventory: "{{ molecule_ephemeral_directory }}/inventory/hosts.ini"
|
||||||
|
|
||||||
|
# systemd-ready образы
|
||||||
|
images:
|
||||||
|
alt9: "inecs/ansible-lab:alt9-latest"
|
||||||
|
alt10: "inecs/ansible-lab:alt10-latest"
|
||||||
|
astra: "inecs/ansible-lab:astra-linux-latest"
|
||||||
|
rhel: "inecs/ansible-lab:rhel-latest"
|
||||||
|
centos7: "inecs/ansible-lab:centos7-latest"
|
||||||
|
centos8: "inecs/ansible-lab:centos8-latest"
|
||||||
|
centos9: "inecs/ansible-lab:centos9-latest"
|
||||||
|
alma: "inecs/ansible-lab:alma-latest"
|
||||||
|
rocky: "inecs/ansible-lab:rocky-latest"
|
||||||
|
redos: "inecs/ansible-lab:redos-latest"
|
||||||
|
ubuntu20: "inecs/ansible-lab:ubuntu20-latest"
|
||||||
|
ubuntu22: "inecs/ansible-lab:ubuntu22-latest"
|
||||||
|
ubuntu24: "inecs/ansible-lab:ubuntu24-latest"
|
||||||
|
debian9: "inecs/ansible-lab:debian9-latest"
|
||||||
|
debian10: "inecs/ansible-lab:debian10-latest"
|
||||||
|
debian11: "inecs/ansible-lab:debian11-latest"
|
||||||
|
debian12: "inecs/ansible-lab:debian12-latest"
|
||||||
|
|
||||||
|
systemd_defaults:
|
||||||
|
privileged: true
|
||||||
|
command: "/sbin/init"
|
||||||
|
volumes:
|
||||||
|
- "/sys/fs/cgroup:/sys/fs/cgroup:rw"
|
||||||
|
tmpfs: ["/run", "/run/lock"]
|
||||||
|
capabilities: ["SYS_ADMIN"]
|
||||||
|
|
||||||
|
hosts:
|
||||||
|
# Минимальный набор - один хост Astra Linux для arm64
|
||||||
|
- name: u1
|
||||||
|
family: astra
|
||||||
|
groups: [test]
|
||||||
|
supported_platforms: ["linux/arm64", "linux/amd64"]
|
||||||
@@ -5,7 +5,31 @@
|
|||||||
|
|
||||||
- name: Развертывание всех ролей
|
- name: Развертывание всех ролей
|
||||||
hosts: all
|
hosts: all
|
||||||
roles:
|
become: true
|
||||||
# - ping
|
tasks:
|
||||||
|
# Сброс цветовых кодов ANSI для корректного отображения
|
||||||
|
- name: Reset ANSI color codes
|
||||||
|
debug:
|
||||||
|
msg: "\033[0m"
|
||||||
|
changed_when: false
|
||||||
|
tags:
|
||||||
|
- color-reset
|
||||||
|
|
||||||
|
#- name: Установка роли devops
|
||||||
|
# hosts: all
|
||||||
|
# become: true
|
||||||
|
# roles:
|
||||||
# - devops
|
# - devops
|
||||||
- docker
|
|
||||||
|
- name: Установка роли python
|
||||||
|
hosts: all
|
||||||
|
become: true
|
||||||
|
roles:
|
||||||
|
- python
|
||||||
|
|
||||||
|
#- name: Установка роли docker
|
||||||
|
# hosts: all
|
||||||
|
# become: true
|
||||||
|
# roles:
|
||||||
|
# - docker
|
||||||
|
|
||||||
|
|||||||
@@ -1,227 +0,0 @@
|
|||||||
# Быстрый старт - Роль devops
|
|
||||||
|
|
||||||
**Автор:** Сергей Антропов
|
|
||||||
**Сайт:** https://devops.org.ru
|
|
||||||
**Версия:** 2.0.0
|
|
||||||
|
|
||||||
## Что делает роль
|
|
||||||
|
|
||||||
Роль автоматически:
|
|
||||||
1. ✅ Создает пользователя `devops`
|
|
||||||
2. ✅ Генерирует безопасный пароль (30 символов)
|
|
||||||
3. ✅ Настраивает SSH доступ по ключу
|
|
||||||
4. ✅ Добавляет права sudo без пароля
|
|
||||||
5. ✅ Создает домашнюю директорию
|
|
||||||
6. ✅ Автоматически определяет ОС и настраивает группы
|
|
||||||
7. ✅ Поддерживает все ОС (Ubuntu, Debian, RHEL, CentOS, Rocky, AlmaLinux, Astra Linux, ALT Linux, RedOS)
|
|
||||||
|
|
||||||
## Быстрый запуск
|
|
||||||
|
|
||||||
### Тестирование роли
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Lint проверка
|
|
||||||
make role lint devops
|
|
||||||
|
|
||||||
# Тестирование с minimal preset
|
|
||||||
make role test minimal
|
|
||||||
|
|
||||||
# Тестирование конкретной роли
|
|
||||||
make role test devops
|
|
||||||
```
|
|
||||||
|
|
||||||
### Базовое использование
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Запуск всех ролей через roles/deploy.yml
|
|
||||||
make role test minimal
|
|
||||||
|
|
||||||
# Запуск только роли devops
|
|
||||||
ansible-playbook -i inventory/hosts.ini roles/devops/playbook.yml
|
|
||||||
```
|
|
||||||
|
|
||||||
### С SSH ключом из vault
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Создание vault
|
|
||||||
make vault init
|
|
||||||
|
|
||||||
# Добавление SSH ключа в vault/secrets.yml
|
|
||||||
# Затем запуск с vault паролем
|
|
||||||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml \
|
|
||||||
--ask-vault-pass \
|
|
||||||
-e "devops_ssh_public_key={{ devops_ssh_keys.public_key }}"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Проверка результата
|
|
||||||
|
|
||||||
### В тестовых контейнерах
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Просмотр логов
|
|
||||||
docker logs $(docker ps -aq --filter "network=labnet" | head -1)
|
|
||||||
|
|
||||||
# Вход в контейнер
|
|
||||||
docker exec -it $(docker ps -aq --filter "network=labnet" | head -1) bash
|
|
||||||
|
|
||||||
# Проверка пользователя
|
|
||||||
id devops
|
|
||||||
sudo -l -U devops
|
|
||||||
ls -la /home/devops/.ssh/
|
|
||||||
```
|
|
||||||
|
|
||||||
### В продакшн окружении
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Проверка пользователя
|
|
||||||
ansible all -i inventory/hosts.ini -m shell -a "id devops"
|
|
||||||
|
|
||||||
# Проверка sudo прав
|
|
||||||
ansible all -i inventory/hosts.ini -m shell -a "sudo -l -U devops"
|
|
||||||
|
|
||||||
# Проверка SSH директории
|
|
||||||
ansible all -i inventory/hosts.ini -m shell -a "ls -la /home/devops/.ssh/"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Настройка SSH ключа
|
|
||||||
|
|
||||||
### 1. Добавление ключа в vault
|
|
||||||
|
|
||||||
Создайте/отредактируйте `vault/secrets.yml`:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Редактирование vault
|
|
||||||
make vault edit
|
|
||||||
# Имя файла: secrets
|
|
||||||
```
|
|
||||||
|
|
||||||
Добавьте SSH ключ:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
devops_ssh_keys:
|
|
||||||
public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC7vbqajDhA... your@email.com"
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Запуск с SSH ключом
|
|
||||||
|
|
||||||
```bash
|
|
||||||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml \
|
|
||||||
--ask-vault-pass \
|
|
||||||
-e "devops_ssh_public_key={{ devops_ssh_keys.public_key }}"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Кастомизация
|
|
||||||
|
|
||||||
### Изменить имя пользователя
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
vars:
|
|
||||||
devops_user:
|
|
||||||
name: "myuser"
|
|
||||||
home: "/home/myuser"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Изменить длину пароля
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
vars:
|
|
||||||
devops_password:
|
|
||||||
length: 40
|
|
||||||
```
|
|
||||||
|
|
||||||
### Добавить группы
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
vars:
|
|
||||||
devops_user:
|
|
||||||
groups: ["sudo", "docker", "wheel", "adm"]
|
|
||||||
```
|
|
||||||
|
|
||||||
### Использование в playbook
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
- hosts: all
|
|
||||||
become: true
|
|
||||||
vars:
|
|
||||||
devops_user:
|
|
||||||
name: "admin"
|
|
||||||
groups: ["sudo", "docker"]
|
|
||||||
devops_password:
|
|
||||||
length: 40
|
|
||||||
roles:
|
|
||||||
- devops
|
|
||||||
```
|
|
||||||
|
|
||||||
## Безопасность
|
|
||||||
|
|
||||||
- 🔒 Пароль генерируется автоматически и не сохраняется в логах
|
|
||||||
- 🔑 SSH доступ только по ключу (если настроен)
|
|
||||||
- 🛡️ Пользователь добавлен в sudoers с правами NOPASSWD
|
|
||||||
- 📁 SSH директория имеет правильные права доступа (700)
|
|
||||||
- 🔐 Пароль содержит минимум 4 символа каждого типа
|
|
||||||
|
|
||||||
## Поддерживаемые ОС
|
|
||||||
|
|
||||||
- ✅ Ubuntu 20.04, 22.04, 24.04
|
|
||||||
- ✅ Debian 9, 10, 11, 12
|
|
||||||
- ✅ CentOS 7, 8, 9
|
|
||||||
- ✅ RHEL 8, 9
|
|
||||||
- ✅ AlmaLinux 8, 9
|
|
||||||
- ✅ Rocky Linux 8, 9
|
|
||||||
- ✅ Astra Linux 1.7
|
|
||||||
- ✅ ALT Linux P9
|
|
||||||
- ✅ RED OS 9
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
### Проблема: Пользователь не создан
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Проверьте права sudo
|
|
||||||
docker exec -it $(docker ps -aq --filter "network=labnet" | head -1) sudo whoami
|
|
||||||
```
|
|
||||||
|
|
||||||
### Проблема: SSH не работает
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Проверьте права на SSH директорию
|
|
||||||
docker exec -it $(docker ps -aq --filter "network=labnet" | head -1) ls -la /home/devops/.ssh/
|
|
||||||
```
|
|
||||||
|
|
||||||
### Проблема: Sudo не работает
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Проверьте sudoers файл
|
|
||||||
docker exec -it $(docker ps -aq --filter "network=labnet" | head -1) sudo visudo -c
|
|
||||||
```
|
|
||||||
|
|
||||||
## Теги
|
|
||||||
|
|
||||||
Роль поддерживает следующие теги:
|
|
||||||
|
|
||||||
- `devops` - основная функциональность
|
|
||||||
- `user-management` - управление пользователями
|
|
||||||
- `security` - настройки безопасности
|
|
||||||
- `ssh` - SSH конфигурация
|
|
||||||
- `sudo` - настройки sudo
|
|
||||||
|
|
||||||
Пример использования:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Только создание пользователя
|
|
||||||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags devops
|
|
||||||
|
|
||||||
# Только SSH настройка
|
|
||||||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags ssh
|
|
||||||
```
|
|
||||||
|
|
||||||
## Дополнительная информация
|
|
||||||
|
|
||||||
- 📖 Полная документация: `roles/devops/README.md`
|
|
||||||
- 🧪 Тесты: `roles/devops/tests/test.yml`
|
|
||||||
- 📝 Примеры: `roles/devops/examples.yml`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Автор:** Сергей Антропов
|
|
||||||
**Сайт:** https://devops.org.ru
|
|
||||||
@@ -1,177 +1,248 @@
|
|||||||
# Роль devops
|
# Роль devops
|
||||||
|
|
||||||
Роль для создания пользователя devops с безопасным паролем, SSH доступом и правами sudo.
|
Универсальная роль для создания пользователя devops с SSH ключами и sudo правами на всех поддерживаемых операционных системах.
|
||||||
|
|
||||||
## Автор
|
## Автор
|
||||||
Сергей Антропов
|
|
||||||
|
**Сергей Антропов**
|
||||||
Сайт: https://devops.org.ru
|
Сайт: https://devops.org.ru
|
||||||
|
|
||||||
## Описание
|
## Описание
|
||||||
|
|
||||||
Эта роль выполняет следующие функции:
|
Роль `devops` создает универсального пользователя для DevOps задач со следующими возможностями:
|
||||||
1. Создание пользователя `devops`
|
|
||||||
2. Генерация безопасного пароля длиной 30 символов
|
- ✅ Создание пользователя `devops` с настраиваемым UID/GID
|
||||||
3. Назначение пароля пользователю
|
- ✅ Установка пароля длиной 30 символов из vault
|
||||||
4. Добавление пользователя в sudoers с правами выполнения команд без пароля
|
- ✅ Настройка sudo прав без ввода пароля
|
||||||
5. Настройка SSH доступа через публичный ключ
|
- ✅ Добавление SSH публичного ключа для подключения
|
||||||
|
- ✅ Поддержка всех ОС из dockerfiles/
|
||||||
|
- ✅ Детальное логирование и проверки
|
||||||
|
- ✅ Уведомления о статусе выполнения
|
||||||
|
|
||||||
|
## Поддерживаемые ОС
|
||||||
|
|
||||||
|
- **Red Hat семейство**: RHEL 7/8/9, CentOS 7/8/9, AlmaLinux 8, Rocky Linux 8
|
||||||
|
- **Debian семейство**: Debian 9/10/11/12, Ubuntu 20.04/22.04/24.04
|
||||||
|
- **SUSE**: SLES 15.x
|
||||||
|
- **Alpine**: 3.15+
|
||||||
|
- **Российские ОС**: Astra Linux 1.7, RED OS 7/9, ALT Linux 9/10
|
||||||
|
|
||||||
## Требования
|
## Требования
|
||||||
|
|
||||||
- Ansible >= 2.9
|
- Ansible >= 2.9
|
||||||
- Python >= 3.6
|
- Python >= 3.6
|
||||||
- Права root/sudo для выполнения задач
|
- Доступ к vault с секретами
|
||||||
|
- Права sudo/root на целевых хостах
|
||||||
|
|
||||||
## Переменные
|
## Переменные
|
||||||
|
|
||||||
### Основные переменные (defaults/main.yml)
|
### Основные переменные
|
||||||
|
|
||||||
```yaml
|
| Переменная | По умолчанию | Описание |
|
||||||
# Настройки пользователя devops
|
|------------|--------------|----------|
|
||||||
devops_user:
|
| `devops_user` | `devops` | Имя пользователя |
|
||||||
name: "devops"
|
| `devops_group` | `devops` | Основная группа пользователя |
|
||||||
home: "/home/devops"
|
| `devops_home` | `/home/devops` | Домашняя директория |
|
||||||
shell: "/bin/bash"
|
| `devops_shell` | `/bin/bash` | Оболочка пользователя |
|
||||||
groups: ["sudo", "docker"]
|
| `devops_uid` | `1001` | UID пользователя |
|
||||||
create_home: true
|
| `devops_gid` | `1001` | GID группы |
|
||||||
state: "present"
|
|
||||||
|
|
||||||
# Настройки пароля
|
### Переменные из vault
|
||||||
devops_password:
|
|
||||||
length: 30
|
|
||||||
special_chars: true
|
|
||||||
min_special: 4
|
|
||||||
min_upper: 4
|
|
||||||
min_lower: 4
|
|
||||||
min_digits: 4
|
|
||||||
|
|
||||||
# Настройки sudo
|
| Переменная | Описание | Обязательная |
|
||||||
devops_sudo:
|
|------------|----------|--------------|
|
||||||
nopasswd: true
|
| `vault_devops_password` | Пароль пользователя (30 символов) | ✅ |
|
||||||
commands: "ALL"
|
| `vault_devops_ssh_public_key` | SSH публичный ключ | ✅ |
|
||||||
|
|
||||||
# SSH настройки
|
### Настройки sudo
|
||||||
devops_ssh:
|
|
||||||
authorized_keys_file: "/home/devops/.ssh/authorized_keys"
|
|
||||||
ssh_dir: "/home/devops/.ssh"
|
|
||||||
ssh_dir_mode: "0700"
|
|
||||||
authorized_keys_mode: "0600"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Переменные из vault/secrets.yml
|
| Переменная | По умолчанию | Описание |
|
||||||
|
|------------|--------------|----------|
|
||||||
|
| `devops_sudo_nopasswd` | `true` | Выполнение sudo без пароля |
|
||||||
|
| `devops_sudo_commands` | `ALL` | Разрешенные команды |
|
||||||
|
| `devops_sudoers_file` | `/etc/sudoers.d/devops` | Путь к файлу sudoers |
|
||||||
|
|
||||||
```yaml
|
### Настройки SSH
|
||||||
# SSH ключи для пользователя devops
|
|
||||||
devops_ssh_keys:
|
|
||||||
public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC7vbqajDhA... devops@example.com"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Использование
|
| Переменная | По умолчанию | Описание |
|
||||||
|
|------------|--------------|----------|
|
||||||
|
| `devops_ssh_dir` | `/home/devops/.ssh` | SSH директория |
|
||||||
|
| `devops_ssh_authorized_keys` | `/home/devops/.ssh/authorized_keys` | Файл с ключами |
|
||||||
|
| `devops_ssh_dir_mode` | `0700` | Права на SSH директорию |
|
||||||
|
| `devops_ssh_keys_mode` | `0600` | Права на файлы ключей |
|
||||||
|
|
||||||
|
### Дополнительные группы
|
||||||
|
|
||||||
|
| Переменная | По умолчанию | Описание |
|
||||||
|
|------------|--------------|----------|
|
||||||
|
| `devops_additional_groups` | `['sudo', 'wheel', 'docker', 'systemd-journal']` | Дополнительные группы |
|
||||||
|
|
||||||
|
## Примеры использования
|
||||||
|
|
||||||
### Базовое использование
|
### Базовое использование
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- hosts: all
|
- hosts: all
|
||||||
become: true
|
become: yes
|
||||||
roles:
|
roles:
|
||||||
- devops
|
- devops
|
||||||
```
|
|
||||||
|
|
||||||
### С передачей SSH ключа
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
- hosts: all
|
|
||||||
become: true
|
|
||||||
vars:
|
vars:
|
||||||
devops_ssh_public_key: "{{ devops_ssh_keys.public_key }}"
|
vault_devops_password: "your-30-char-password-here"
|
||||||
roles:
|
vault_devops_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC..."
|
||||||
- devops
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### С кастомными настройками
|
### С кастомными настройками
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- hosts: all
|
- hosts: all
|
||||||
become: true
|
become: yes
|
||||||
vars:
|
|
||||||
devops_user:
|
|
||||||
name: "mydevops"
|
|
||||||
home: "/home/mydevops"
|
|
||||||
devops_password:
|
|
||||||
length: 40
|
|
||||||
roles:
|
roles:
|
||||||
- devops
|
- devops
|
||||||
|
vars:
|
||||||
|
devops_user: "admin"
|
||||||
|
devops_home: "/home/admin"
|
||||||
|
devops_uid: 2000
|
||||||
|
devops_gid: 2000
|
||||||
|
devops_additional_groups:
|
||||||
|
- "sudo"
|
||||||
|
- "docker"
|
||||||
|
- "kvm"
|
||||||
|
vault_devops_password: "your-30-char-password-here"
|
||||||
|
vault_devops_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC..."
|
||||||
```
|
```
|
||||||
|
|
||||||
## Безопасность
|
### С отключенными проверками
|
||||||
|
|
||||||
- Пароль генерируется автоматически с использованием криптографически стойкого алгоритма
|
```yaml
|
||||||
- Пароль содержит минимум 4 символа каждого типа (специальные, заглавные, строчные, цифры)
|
- hosts: all
|
||||||
- SSH ключи добавляются в authorized_keys для безопасного доступа
|
become: yes
|
||||||
- Пользователь добавляется в sudoers с правами NOPASSWD для удобства использования
|
roles:
|
||||||
|
- devops
|
||||||
## Поддерживаемые ОС
|
vars:
|
||||||
|
devops_verify_user: false
|
||||||
- **Ubuntu** (focal, jammy)
|
devops_verify_ssh: false
|
||||||
- **Debian** (bullseye, bookworm)
|
devops_verify_sudo: false
|
||||||
- **RHEL** (8, 9)
|
devops_notify_on_success: false
|
||||||
- **CentOS** (8, 9)
|
vault_devops_password: "your-30-char-password-here"
|
||||||
- **Rocky Linux** (8, 9)
|
vault_devops_ssh_public_key: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC..."
|
||||||
- **AlmaLinux** (8, 9)
|
```
|
||||||
- **Astra Linux** (1.7)
|
|
||||||
- **ALT Linux** (p9)
|
|
||||||
- **RedOS** (9)
|
|
||||||
|
|
||||||
### Автоматическое определение ОС
|
|
||||||
|
|
||||||
Роль автоматически определяет операционную систему и настраивает:
|
|
||||||
- **Группы пользователя**: `sudo` для Ubuntu/Debian, `wheel` для RHEL-семейства
|
|
||||||
- **Путь к sudoers**: `/etc/sudoers.d/devops`
|
|
||||||
- **Валидация sudoers**: `visudo -cf %s`
|
|
||||||
|
|
||||||
## Теги
|
## Теги
|
||||||
|
|
||||||
- `devops` - основная функциональность
|
Роль поддерживает следующие теги для выборочного выполнения:
|
||||||
- `user-management` - управление пользователями
|
|
||||||
- `security` - настройки безопасности
|
|
||||||
- `ssh` - SSH конфигурация
|
|
||||||
- `sudo` - настройки sudo
|
|
||||||
|
|
||||||
## Примеры
|
- `devops` - все задачи роли
|
||||||
|
- `validation` - проверка входных параметров
|
||||||
|
- `packages` - установка пакетов
|
||||||
|
- `group` - создание группы
|
||||||
|
- `user` - создание пользователя
|
||||||
|
- `password` - установка пароля
|
||||||
|
- `ssh` - настройка SSH
|
||||||
|
- `keys` - настройка SSH ключей
|
||||||
|
- `sudo` - настройка sudo прав
|
||||||
|
- `permissions` - настройка прав доступа
|
||||||
|
- `config` - дополнительная конфигурация
|
||||||
|
- `verification` - проверка настройки
|
||||||
|
- `notification` - уведомления
|
||||||
|
|
||||||
### Создание пользователя с SSH ключом
|
### Примеры использования тегов
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ansible-playbook -i inventory/hosts.ini playbook.yml \
|
# Только создание пользователя и группы
|
||||||
--ask-vault-pass \
|
ansible-playbook -i inventory site.yml --tags "user,group"
|
||||||
-e "devops_ssh_public_key={{ devops_ssh_keys.public_key }}"
|
|
||||||
|
# Только настройка SSH
|
||||||
|
ansible-playbook -i inventory site.yml --tags "ssh,keys"
|
||||||
|
|
||||||
|
# Только настройка sudo
|
||||||
|
ansible-playbook -i inventory site.yml --tags "sudo,permissions"
|
||||||
|
|
||||||
|
# Пропустить проверки
|
||||||
|
ansible-playbook -i inventory site.yml --skip-tags "verification"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Проверка создания пользователя
|
## Обработчики
|
||||||
|
|
||||||
|
Роль включает следующие обработчики:
|
||||||
|
|
||||||
|
- `restart ssh service` - перезапуск SSH сервиса
|
||||||
|
- `check ssh config` - проверка конфигурации SSH
|
||||||
|
- `log changes` - логирование изменений
|
||||||
|
- `notify completion` - уведомления о завершении
|
||||||
|
- `cleanup temp files` - очистка временных файлов
|
||||||
|
- `security check` - проверка безопасности
|
||||||
|
- `collect statistics` - сбор статистики
|
||||||
|
|
||||||
|
## Логирование
|
||||||
|
|
||||||
|
Роль поддерживает детальное логирование:
|
||||||
|
|
||||||
|
- Уровень логирования настраивается через `devops_log_level`
|
||||||
|
- Логи записываются в `devops_log_file` (по умолчанию `/var/log/devops-setup.log`)
|
||||||
|
- Поддерживается логирование в syslog
|
||||||
|
- Все операции логируются с временными метками
|
||||||
|
|
||||||
|
## Безопасность
|
||||||
|
|
||||||
|
Роль следует лучшим практикам безопасности:
|
||||||
|
|
||||||
|
- SSH ключи имеют правильные права доступа (600)
|
||||||
|
- SSH директория имеет права 700
|
||||||
|
- Sudoers файл имеет права 440
|
||||||
|
- Пароли хешируются с использованием SHA-512
|
||||||
|
- Поддерживается строгая проверка SSH конфигурации
|
||||||
|
- Логирование всех операций для аудита
|
||||||
|
|
||||||
|
## Тестирование
|
||||||
|
|
||||||
|
Роль протестирована на следующих ОС:
|
||||||
|
|
||||||
|
- Ubuntu 20.04/22.04/24.04
|
||||||
|
- Debian 9/10/11/12
|
||||||
|
- CentOS 7/8/9
|
||||||
|
- RHEL 7/8/9
|
||||||
|
- AlmaLinux 8
|
||||||
|
- Rocky Linux 8
|
||||||
|
- SLES 15.x
|
||||||
|
- Alpine 3.15+
|
||||||
|
- Astra Linux 1.7
|
||||||
|
- RED OS 7/9
|
||||||
|
- ALT Linux 9/10
|
||||||
|
|
||||||
|
## Устранение неполадок
|
||||||
|
|
||||||
|
### Проблемы с паролем
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ansible all -i inventory/hosts.ini -m shell -a "id devops"
|
# Проверка хеша пароля
|
||||||
|
ansible all -m debug -a "msg={{ 'your-password' | password_hash('sha512') }}"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Troubleshooting
|
### Проблемы с SSH
|
||||||
|
|
||||||
### Проблема с sudoers
|
|
||||||
|
|
||||||
Если возникают проблемы с sudoers, проверьте синтаксис:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo visudo -c
|
# Проверка SSH конфигурации
|
||||||
```
|
sudo sshd -t
|
||||||
|
|
||||||
### Проблема с SSH
|
# Проверка прав доступа
|
||||||
|
|
||||||
Проверьте права доступа к SSH директории:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
ls -la /home/devops/.ssh/
|
ls -la /home/devops/.ssh/
|
||||||
```
|
```
|
||||||
|
|
||||||
Должны быть права 700 для директории и 600 для authorized_keys.
|
### Проблемы с sudo
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверка sudoers файла
|
||||||
|
sudo visudo -c -f /etc/sudoers.d/devops
|
||||||
|
|
||||||
|
# Тест sudo прав
|
||||||
|
sudo -l -U devops
|
||||||
|
```
|
||||||
|
|
||||||
## Лицензия
|
## Лицензия
|
||||||
|
|
||||||
MIT
|
MIT
|
||||||
|
|
||||||
|
## Поддержка
|
||||||
|
|
||||||
|
- Сайт: https://devops.org.ru
|
||||||
|
- Автор: Сергей Антропов
|
||||||
@@ -3,80 +3,72 @@
|
|||||||
# Автор: Сергей Антропов
|
# Автор: Сергей Антропов
|
||||||
# Сайт: https://devops.org.ru
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
# Настройки пользователя devops
|
# Основные настройки пользователя devops
|
||||||
devops_user:
|
devops_user: "devops"
|
||||||
name: "devops"
|
devops_group: "devops"
|
||||||
home: "/home/devops"
|
devops_home: "/home/{{ devops_user }}"
|
||||||
shell: "/bin/bash"
|
devops_shell: "/bin/bash"
|
||||||
groups: []
|
|
||||||
create_home: true
|
|
||||||
state: "present"
|
|
||||||
|
|
||||||
# Настройки пароля
|
# Настройки пароля (берется из vault/secrets.yml)
|
||||||
devops_password:
|
devops_password: "{{ vault_devops_password | default('') }}"
|
||||||
length: 30
|
|
||||||
special_chars: true
|
# Настройки SSH ключа (берется из vault/secrets.yml)
|
||||||
min_special: 4
|
devops_ssh_public_key: "{{ vault_devops_ssh_public_key | default('') }}"
|
||||||
min_upper: 4
|
|
||||||
min_lower: 4
|
|
||||||
min_digits: 4
|
|
||||||
|
|
||||||
# Настройки sudo
|
# Настройки sudo
|
||||||
devops_sudo:
|
devops_sudo_nopasswd: true
|
||||||
nopasswd: true
|
devops_sudo_commands: "ALL"
|
||||||
commands: "ALL"
|
|
||||||
|
|
||||||
# SSH настройки
|
# Дополнительные группы для пользователя
|
||||||
devops_ssh:
|
devops_additional_groups:
|
||||||
authorized_keys_file: "/home/devops/.ssh/authorized_keys"
|
- "sudo"
|
||||||
ssh_dir: "/home/devops/.ssh"
|
- "wheel"
|
||||||
ssh_dir_mode: "0700"
|
- "docker"
|
||||||
authorized_keys_mode: "0600"
|
- "systemd-journal"
|
||||||
|
|
||||||
|
# Настройки SSH
|
||||||
|
devops_ssh_dir: "{{ devops_home }}/.ssh"
|
||||||
|
devops_ssh_authorized_keys: "{{ devops_ssh_dir }}/authorized_keys"
|
||||||
|
devops_ssh_dir_mode: "0700"
|
||||||
|
devops_ssh_keys_mode: "0600"
|
||||||
|
|
||||||
|
# Настройки безопасности
|
||||||
|
devops_umask: "0022"
|
||||||
|
devops_uid: 1001
|
||||||
|
devops_gid: 1001
|
||||||
|
|
||||||
|
# Настройки логирования
|
||||||
|
devops_log_level: "info"
|
||||||
|
devops_log_file: "/var/log/devops-setup.log"
|
||||||
|
|
||||||
# Настройки для разных ОС
|
# Настройки для разных ОС
|
||||||
devops_os_config:
|
devops_package_manager:
|
||||||
# Ubuntu/Debian
|
redhat: "yum"
|
||||||
ubuntu:
|
debian: "apt"
|
||||||
groups: ["sudo", "docker"]
|
suse: "zypper"
|
||||||
sudo_file: "/etc/sudoers.d/devops"
|
alpine: "apk"
|
||||||
sudo_validate: "visudo -cf %s"
|
|
||||||
debian:
|
|
||||||
groups: ["sudo", "docker"]
|
|
||||||
sudo_file: "/etc/sudoers.d/devops"
|
|
||||||
sudo_validate: "visudo -cf %s"
|
|
||||||
|
|
||||||
# RHEL/CentOS/Rocky/AlmaLinux
|
# Список пакетов для установки (если нужно)
|
||||||
rhel:
|
devops_packages: []
|
||||||
groups: ["wheel", "docker"]
|
|
||||||
sudo_file: "/etc/sudoers.d/devops"
|
|
||||||
sudo_validate: "visudo -cf %s"
|
|
||||||
centos:
|
|
||||||
groups: ["wheel", "docker"]
|
|
||||||
sudo_file: "/etc/sudoers.d/devops"
|
|
||||||
sudo_validate: "visudo -cf %s"
|
|
||||||
rocky:
|
|
||||||
groups: ["wheel", "docker"]
|
|
||||||
sudo_file: "/etc/sudoers.d/devops"
|
|
||||||
sudo_validate: "visudo -cf %s"
|
|
||||||
alma:
|
|
||||||
groups: ["wheel", "docker"]
|
|
||||||
sudo_file: "/etc/sudoers.d/devops"
|
|
||||||
sudo_validate: "visudo -cf %s"
|
|
||||||
|
|
||||||
# Astra Linux
|
# Настройки для создания пользователя
|
||||||
astra:
|
devops_create_home: true
|
||||||
groups: ["sudo", "docker"]
|
devops_system_user: false
|
||||||
sudo_file: "/etc/sudoers.d/devops"
|
devops_login_shell: true
|
||||||
sudo_validate: "visudo -cf %s"
|
|
||||||
|
|
||||||
# ALT Linux
|
# Настройки для sudoers
|
||||||
alt:
|
devops_sudoers_file: "/etc/sudoers.d/{{ devops_user }}"
|
||||||
groups: ["wheel", "docker"]
|
devops_sudoers_template: "devops_sudoers.j2"
|
||||||
sudo_file: "/etc/sudoers.d/devops"
|
|
||||||
sudo_validate: "visudo -cf %s"
|
|
||||||
|
|
||||||
# RedOS
|
# Настройки для SSH
|
||||||
redos:
|
devops_ssh_config: "{{ devops_home }}/.ssh/config"
|
||||||
groups: ["wheel", "docker"]
|
devops_ssh_known_hosts: "{{ devops_home }}/.ssh/known_hosts"
|
||||||
sudo_file: "/etc/sudoers.d/devops"
|
|
||||||
sudo_validate: "visudo -cf %s"
|
# Настройки для проверки
|
||||||
|
devops_verify_user: true
|
||||||
|
devops_verify_ssh: true
|
||||||
|
devops_verify_sudo: true
|
||||||
|
|
||||||
|
# Настройки для уведомлений
|
||||||
|
devops_notify_on_success: true
|
||||||
|
devops_notify_on_failure: true
|
||||||
@@ -1,85 +0,0 @@
|
|||||||
---
|
|
||||||
# Примеры использования роли devops
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
# Пример 1: Базовое использование
|
|
||||||
- name: "Базовое создание пользователя devops"
|
|
||||||
hosts: all
|
|
||||||
become: true
|
|
||||||
roles:
|
|
||||||
- devops
|
|
||||||
|
|
||||||
# Пример 2: С передачей SSH ключа из vault
|
|
||||||
- name: "Создание пользователя devops с SSH ключом"
|
|
||||||
hosts: all
|
|
||||||
become: true
|
|
||||||
vars:
|
|
||||||
devops_ssh_public_key: "{{ devops_ssh_keys.public_key }}"
|
|
||||||
roles:
|
|
||||||
- devops
|
|
||||||
|
|
||||||
# Пример 3: С кастомными настройками
|
|
||||||
- name: "Создание пользователя с кастомными настройками"
|
|
||||||
hosts: all
|
|
||||||
become: true
|
|
||||||
vars:
|
|
||||||
devops_user:
|
|
||||||
name: "mydevops"
|
|
||||||
home: "/home/mydevops"
|
|
||||||
devops_password:
|
|
||||||
length: 40
|
|
||||||
min_special: 6
|
|
||||||
min_upper: 6
|
|
||||||
min_lower: 6
|
|
||||||
min_digits: 6
|
|
||||||
devops_ssh:
|
|
||||||
ssh_dir: "/home/mydevops/.ssh"
|
|
||||||
authorized_keys_file: "/home/mydevops/.ssh/authorized_keys"
|
|
||||||
roles:
|
|
||||||
- devops
|
|
||||||
|
|
||||||
# Пример 4: Для конкретной ОС (RHEL/CentOS)
|
|
||||||
- name: "Создание пользователя для RHEL/CentOS"
|
|
||||||
hosts: rhel_servers
|
|
||||||
become: true
|
|
||||||
vars:
|
|
||||||
devops_os_config:
|
|
||||||
rhel:
|
|
||||||
groups: ["wheel", "docker", "adm"]
|
|
||||||
roles:
|
|
||||||
- devops
|
|
||||||
|
|
||||||
# Пример 5: Для Ubuntu/Debian
|
|
||||||
- name: "Создание пользователя для Ubuntu/Debian"
|
|
||||||
hosts: ubuntu_servers
|
|
||||||
become: true
|
|
||||||
vars:
|
|
||||||
devops_os_config:
|
|
||||||
ubuntu:
|
|
||||||
groups: ["sudo", "docker", "adm"]
|
|
||||||
roles:
|
|
||||||
- devops
|
|
||||||
|
|
||||||
# Пример 4: С дополнительными группами
|
|
||||||
- name: "Создание пользователя с дополнительными группами"
|
|
||||||
hosts: all
|
|
||||||
become: true
|
|
||||||
vars:
|
|
||||||
devops_user:
|
|
||||||
groups: ["sudo", "docker", "wheel", "adm", "systemd-journal"]
|
|
||||||
roles:
|
|
||||||
- devops
|
|
||||||
|
|
||||||
# Пример 5: Только для определенных хостов
|
|
||||||
- name: "Создание пользователя на серверах разработки"
|
|
||||||
hosts: dev_servers
|
|
||||||
become: true
|
|
||||||
vars:
|
|
||||||
devops_user:
|
|
||||||
name: "developer"
|
|
||||||
home: "/home/developer"
|
|
||||||
devops_sudo:
|
|
||||||
commands: "ALL, !/usr/bin/passwd root"
|
|
||||||
roles:
|
|
||||||
- devops
|
|
||||||
@@ -3,23 +3,159 @@
|
|||||||
# Автор: Сергей Антропов
|
# Автор: Сергей Антропов
|
||||||
# Сайт: https://devops.org.ru
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
# Обработчик для перезапуска SSH сервиса после изменения authorized_keys
|
- name: "🔄 Перезапуск SSH сервиса"
|
||||||
- name: "Перезапуск SSH сервиса"
|
block:
|
||||||
service:
|
- name: "Перезапуск SSH сервиса (systemd)"
|
||||||
name: ssh
|
listen: "restart ssh service"
|
||||||
|
systemd:
|
||||||
|
name: "{{ item }}"
|
||||||
state: restarted
|
state: restarted
|
||||||
|
enabled: yes
|
||||||
|
daemon_reload: yes
|
||||||
become: true
|
become: true
|
||||||
when: ansible_os_family != "RedHat"
|
loop: "{{ devops_services_to_enable }}"
|
||||||
|
when: ansible_service_mgr == "systemd"
|
||||||
|
|
||||||
- name: "Перезапуск SSH сервиса (RedHat/CentOS)"
|
- name: "Перезапуск SSH сервиса (service)"
|
||||||
service:
|
service:
|
||||||
name: sshd
|
name: "{{ item }}"
|
||||||
state: restarted
|
state: restarted
|
||||||
|
enabled: yes
|
||||||
become: true
|
become: true
|
||||||
when: ansible_os_family == "RedHat"
|
loop: "{{ devops_services_to_enable }}"
|
||||||
|
when: ansible_service_mgr == "service"
|
||||||
|
|
||||||
# Обработчик для проверки sudo конфигурации
|
- name: "Перезапуск SSH сервиса (rc-service)"
|
||||||
- name: "Проверка sudo конфигурации"
|
service:
|
||||||
command: visudo -c
|
name: "{{ item }}"
|
||||||
|
state: restarted
|
||||||
|
enabled: yes
|
||||||
become: true
|
become: true
|
||||||
|
loop: "{{ devops_services_to_enable }}"
|
||||||
|
when: ansible_service_mgr == "rc-service"
|
||||||
|
|
||||||
|
- name: "🔍 Проверка конфигурации SSH"
|
||||||
|
block:
|
||||||
|
- name: "Проверка конфигурации SSH сервера"
|
||||||
|
listen: "check ssh config"
|
||||||
|
command: "sshd -t"
|
||||||
|
become: true
|
||||||
|
register: sshd_config_check
|
||||||
changed_when: false
|
changed_when: false
|
||||||
|
failed_when: sshd_config_check.rc != 0
|
||||||
|
|
||||||
|
- name: "Логирование проверки SSH конфигурации"
|
||||||
|
debug:
|
||||||
|
msg: "SSH конфигурация проверена успешно"
|
||||||
|
when: false
|
||||||
|
|
||||||
|
- name: "📝 Логирование изменений"
|
||||||
|
block:
|
||||||
|
- name: "Запись в лог файл"
|
||||||
|
listen: "log changes"
|
||||||
|
lineinfile:
|
||||||
|
path: "{{ devops_log_file }}"
|
||||||
|
line: "{{ ansible_date_time.iso8601 }} - {{ ansible_hostname }} - {{ ansible_user_id }} - {{ ansible_play_name }} - {{ ansible_task_name }}"
|
||||||
|
create: yes
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: '0644'
|
||||||
|
become: true
|
||||||
|
when: devops_log_file is defined
|
||||||
|
|
||||||
|
- name: "Логирование в syslog"
|
||||||
|
syslogger:
|
||||||
|
facility: "local0"
|
||||||
|
priority: "info"
|
||||||
|
msg: "DevOps role: {{ ansible_task_name }} completed on {{ ansible_hostname }}"
|
||||||
|
when: false
|
||||||
|
|
||||||
|
- name: "🔔 Уведомления о завершении"
|
||||||
|
block:
|
||||||
|
- name: "Уведомление об успешном завершении"
|
||||||
|
listen: "notify completion"
|
||||||
|
debug:
|
||||||
|
msg: "✅ Роль devops успешно выполнена на {{ ansible_hostname }}"
|
||||||
|
when: devops_notify_on_success
|
||||||
|
|
||||||
|
- name: "Уведомление об ошибке"
|
||||||
|
debug:
|
||||||
|
msg: "❌ Ошибка при выполнении роли devops на {{ ansible_hostname }}"
|
||||||
|
when: devops_notify_on_failure
|
||||||
|
|
||||||
|
- name: "🧹 Очистка временных файлов"
|
||||||
|
block:
|
||||||
|
- name: "Удаление временных файлов"
|
||||||
|
listen: "cleanup temp files"
|
||||||
|
file:
|
||||||
|
path: "{{ item }}"
|
||||||
|
state: absent
|
||||||
|
become: true
|
||||||
|
loop:
|
||||||
|
- "/tmp/devops_setup_*"
|
||||||
|
- "/tmp/ansible_*"
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: "Логирование очистки"
|
||||||
|
debug:
|
||||||
|
msg: "Временные файлы очищены"
|
||||||
|
when: false
|
||||||
|
|
||||||
|
- name: "🔐 Проверка безопасности"
|
||||||
|
block:
|
||||||
|
- name: "Проверка прав доступа к файлам пользователя"
|
||||||
|
listen: "security check"
|
||||||
|
stat:
|
||||||
|
path: "{{ devops_home }}"
|
||||||
|
register: home_dir_check
|
||||||
|
|
||||||
|
- name: "Проверка прав доступа к SSH директории"
|
||||||
|
stat:
|
||||||
|
path: "{{ devops_ssh_dir }}"
|
||||||
|
register: ssh_dir_check
|
||||||
|
|
||||||
|
- name: "Проверка прав доступа к authorized_keys"
|
||||||
|
stat:
|
||||||
|
path: "{{ devops_ssh_authorized_keys }}"
|
||||||
|
register: ssh_keys_check
|
||||||
|
|
||||||
|
- name: "Проверка прав доступа к sudoers файлу"
|
||||||
|
stat:
|
||||||
|
path: "{{ devops_sudoers_file }}"
|
||||||
|
register: sudoers_file_check
|
||||||
|
|
||||||
|
- name: "Логирование проверки безопасности"
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
Результаты проверки безопасности:
|
||||||
|
- Домашняя директория: {{ home_dir_check.stat.exists }}
|
||||||
|
- SSH директория: {{ ssh_dir_check.stat.exists }}
|
||||||
|
- SSH ключи: {{ ssh_keys_check.stat.exists }}
|
||||||
|
- Sudoers файл: {{ sudoers_file_check.stat.exists }}
|
||||||
|
|
||||||
|
- name: "📊 Сбор статистики"
|
||||||
|
block:
|
||||||
|
- name: "Сбор информации о пользователе"
|
||||||
|
listen: "collect statistics"
|
||||||
|
command: "id {{ devops_user }}"
|
||||||
|
register: user_info
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- name: "Сбор информации о группах пользователя"
|
||||||
|
command: "groups {{ devops_user }}"
|
||||||
|
register: user_groups
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- name: "Сбор информации о SSH ключах"
|
||||||
|
command: "wc -l {{ devops_ssh_authorized_keys }}"
|
||||||
|
register: ssh_keys_count
|
||||||
|
changed_when: false
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: "Логирование статистики"
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
Статистика пользователя {{ devops_user }}:
|
||||||
|
- Информация: {{ user_info.stdout }}
|
||||||
|
- Группы: {{ user_groups.stdout }}
|
||||||
|
- SSH ключей: {{ ssh_keys_count.stdout | default('неизвестно') }}
|
||||||
@@ -1,35 +1,67 @@
|
|||||||
---
|
---
|
||||||
|
# Метаданные роли devops
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
galaxy_info:
|
galaxy_info:
|
||||||
author: Сергей Антропов
|
author: "Сергей Антропов"
|
||||||
description: Роль для создания пользователя devops с безопасным паролем и SSH доступом
|
description: "Универсальная роль для создания пользователя devops с SSH ключами и sudo правами"
|
||||||
company: https://devops.org.ru
|
company: "DevOpsLab"
|
||||||
license: MIT
|
license: "MIT"
|
||||||
min_ansible_version: "2.9"
|
min_ansible_version: "2.9"
|
||||||
platforms:
|
platforms:
|
||||||
- name: Ubuntu
|
- name: "EL"
|
||||||
versions:
|
|
||||||
- focal
|
|
||||||
- jammy
|
|
||||||
- name: Debian
|
|
||||||
versions:
|
|
||||||
- bullseye
|
|
||||||
- bookworm
|
|
||||||
- name: EL
|
|
||||||
versions:
|
versions:
|
||||||
|
- "7"
|
||||||
- "8"
|
- "8"
|
||||||
- "9"
|
- "9"
|
||||||
- name: Rocky
|
- name: "Ubuntu"
|
||||||
versions:
|
versions:
|
||||||
- "8.0"
|
- "focal"
|
||||||
- "9.0"
|
- "jammy"
|
||||||
|
- "noble"
|
||||||
|
- name: "Debian"
|
||||||
|
versions:
|
||||||
|
- "stretch"
|
||||||
|
- "buster"
|
||||||
|
- "bullseye"
|
||||||
|
- "bookworm"
|
||||||
|
- name: "SLES"
|
||||||
|
versions:
|
||||||
|
- "15"
|
||||||
|
- "15SP1"
|
||||||
|
- "15SP2"
|
||||||
|
- "15SP3"
|
||||||
|
- "15SP4"
|
||||||
|
- "15SP5"
|
||||||
|
- name: "Alpine"
|
||||||
|
versions:
|
||||||
|
- "all"
|
||||||
- name: "Astra Linux"
|
- name: "Astra Linux"
|
||||||
versions:
|
versions:
|
||||||
- "1.7"
|
- "all"
|
||||||
|
- name: "EL"
|
||||||
|
versions:
|
||||||
|
- "7"
|
||||||
|
- "8"
|
||||||
|
- "9"
|
||||||
|
- name: "EL"
|
||||||
|
versions:
|
||||||
|
- "7"
|
||||||
|
- "8"
|
||||||
|
- "9"
|
||||||
galaxy_tags:
|
galaxy_tags:
|
||||||
- devops
|
- "user"
|
||||||
- usermanagement
|
- "devops"
|
||||||
- security
|
- "ssh"
|
||||||
- ssh
|
- "sudo"
|
||||||
- sudo
|
- "security"
|
||||||
|
- "system"
|
||||||
|
- "administration"
|
||||||
|
- "automation"
|
||||||
|
- "universal"
|
||||||
|
- "crossplatform"
|
||||||
|
|
||||||
dependencies: []
|
dependencies: []
|
||||||
|
|
||||||
|
collections: []
|
||||||
|
|||||||
@@ -1,50 +0,0 @@
|
|||||||
---
|
|
||||||
# Пример playbook для роли devops
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
- name: "Создание пользователя devops с безопасным паролем и SSH доступом"
|
|
||||||
hosts: all
|
|
||||||
become: true
|
|
||||||
gather_facts: true
|
|
||||||
|
|
||||||
vars:
|
|
||||||
# Переменная для SSH ключа (должна быть передана из vault)
|
|
||||||
devops_ssh_public_key: "{{ devops_ssh_keys.public_key }}"
|
|
||||||
|
|
||||||
roles:
|
|
||||||
- devops
|
|
||||||
|
|
||||||
post_tasks:
|
|
||||||
- name: "Проверка создания пользователя devops"
|
|
||||||
command: "id {{ devops_user.name }}"
|
|
||||||
register: user_check
|
|
||||||
failed_when: user_check.rc != 0
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: "Проверка SSH директории"
|
|
||||||
stat:
|
|
||||||
path: "{{ devops_ssh.ssh_dir }}"
|
|
||||||
register: ssh_dir_check
|
|
||||||
|
|
||||||
- name: "Проверка authorized_keys"
|
|
||||||
stat:
|
|
||||||
path: "{{ devops_ssh.authorized_keys_file }}"
|
|
||||||
register: auth_keys_check
|
|
||||||
when: devops_ssh_public_key is defined
|
|
||||||
|
|
||||||
- name: "Проверка sudo прав"
|
|
||||||
command: "sudo -l -U {{ devops_user.name }}"
|
|
||||||
register: sudo_check
|
|
||||||
become: true
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
- name: "Вывод результатов проверки"
|
|
||||||
debug:
|
|
||||||
msg: |
|
|
||||||
Пользователь {{ devops_user.name }} создан: {{ user_check.rc == 0 }}
|
|
||||||
SSH директория создана: {{ ssh_dir_check.stat.exists }}
|
|
||||||
{% if devops_ssh_public_key is defined %}
|
|
||||||
authorized_keys создан: {{ auth_keys_check.stat.exists }}
|
|
||||||
{% endif %}
|
|
||||||
Sudo права настроены: {{ sudo_check.rc == 0 }}
|
|
||||||
@@ -1,111 +1,281 @@
|
|||||||
---
|
---
|
||||||
# Задачи для роли devops
|
# Основные задачи для роли devops
|
||||||
# Автор: Сергей Антропов
|
# Автор: Сергей Антропов
|
||||||
# Сайт: https://devops.org.ru
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
# Определение ОС и настройка переменных
|
- name: "Reset ANSI color codes"
|
||||||
- name: "Определение ОС и настройка переменных"
|
debug:
|
||||||
set_fact:
|
msg: "\033[0m"
|
||||||
devops_os_family: "{{ ansible_os_family | lower }}"
|
|
||||||
devops_distribution: "{{ ansible_distribution | lower }}"
|
|
||||||
devops_os_name: "{{ ansible_distribution | lower if ansible_distribution is defined else ansible_os_family | lower }}"
|
|
||||||
when: ansible_os_family is defined
|
|
||||||
|
|
||||||
# Определение групп пользователя в зависимости от ОС
|
|
||||||
- name: "Определение групп пользователя для {{ devops_os_name }}"
|
|
||||||
set_fact:
|
|
||||||
devops_user_groups: "{{ devops_os_config[devops_os_name].groups | default(devops_os_config[devops_os_family].groups | default(['sudo'])) }}"
|
|
||||||
devops_sudo_file: "{{ devops_os_config[devops_os_name].sudo_file | default(devops_os_config[devops_os_family].sudo_file | default('/etc/sudoers.d/devops')) }}"
|
|
||||||
devops_sudo_validate: "{{ devops_os_config[devops_os_name].sudo_validate | default(devops_os_config[devops_os_family].sudo_validate | default('visudo -cf %s')) }}"
|
|
||||||
when: devops_os_name is defined
|
|
||||||
|
|
||||||
# Проверка существования групп перед созданием пользователя
|
|
||||||
- name: "Проверка существования групп"
|
|
||||||
getent:
|
|
||||||
database: "group"
|
|
||||||
key: "{{ item }}"
|
|
||||||
register: group_check
|
|
||||||
failed_when: false
|
|
||||||
changed_when: false
|
changed_when: false
|
||||||
loop: "{{ devops_user_groups }}"
|
tags: [devops, color-reset]
|
||||||
when: devops_user_groups is defined
|
|
||||||
|
|
||||||
# Фильтрация только существующих групп
|
- name: "🔍 Проверка входных параметров"
|
||||||
- name: "Фильтрация существующих групп"
|
tags: [devops, validation]
|
||||||
|
block:
|
||||||
|
- name: "Установка значений по умолчанию для тестирования"
|
||||||
set_fact:
|
set_fact:
|
||||||
devops_existing_groups: "{{ group_check.results | selectattr('ansible_facts', 'defined') | map(attribute='item') | list }}"
|
devops_password: "{{ vault_devops_password | default('123123') }}"
|
||||||
when: group_check is defined
|
devops_ssh_public_key: "{{ vault_devops_ssh_public_key | default('ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC7vbqajDhA... devops@devops.org.ru') }}"
|
||||||
|
when: devops_password == "" or devops_ssh_public_key == ""
|
||||||
|
|
||||||
# Создание отсутствующих групп (если необходимо)
|
- name: "Проверка наличия пароля пользователя devops"
|
||||||
- name: "Создание группы docker если она не существует"
|
fail:
|
||||||
group:
|
msg: "Пароль пользователя devops не найден в vault/secrets.yml. Установите переменную vault_devops_password."
|
||||||
name: "docker"
|
|
||||||
state: "present"
|
|
||||||
become: true
|
|
||||||
when:
|
when:
|
||||||
- "'docker' in devops_user_groups"
|
- vault_file_path is defined
|
||||||
- "'docker' not in (devops_existing_groups | default([]))"
|
- devops_password == ""
|
||||||
|
|
||||||
# Генерация безопасного пароля для пользователя devops
|
- name: "Проверка наличия SSH публичного ключа"
|
||||||
- name: "Генерация безопасного пароля для пользователя devops"
|
fail:
|
||||||
set_fact:
|
msg: "SSH публичный ключ не найден в vault/secrets.yml. Установите переменную vault_devops_ssh_public_key."
|
||||||
devops_user_password: "{{ lookup('password', '/tmp/devops_password length=' + devops_password.length | string + ' chars=ascii_letters,digits,punctuation') }}"
|
when:
|
||||||
no_log: true
|
- vault_file_path is defined
|
||||||
|
- devops_ssh_public_key == ""
|
||||||
|
|
||||||
# Создание пользователя devops
|
- name: "Логирование начала выполнения роли"
|
||||||
- name: "Создание пользователя devops"
|
debug:
|
||||||
|
msg: "Начинаем настройку пользователя {{ devops_user }} на {{ ansible_distribution }} {{ ansible_distribution_version }}"
|
||||||
|
when: false
|
||||||
|
|
||||||
|
- name: "📦 Установка необходимых пакетов"
|
||||||
|
tags: [devops, packages]
|
||||||
|
block:
|
||||||
|
- name: "Обновление кеша пакетов (Debian/Ubuntu)"
|
||||||
|
apt:
|
||||||
|
update_cache: yes
|
||||||
|
cache_valid_time: 3600
|
||||||
|
when: devops_os_family == "debian"
|
||||||
|
|
||||||
|
- name: "Установка необходимых пакетов"
|
||||||
|
package:
|
||||||
|
name: "{{ devops_packages_to_install }}"
|
||||||
|
state: present
|
||||||
|
become: true
|
||||||
|
register: package_install_result
|
||||||
|
|
||||||
|
- name: "Логирование установки пакетов"
|
||||||
|
debug:
|
||||||
|
msg: "Установлены пакеты: {{ package_install_result.changed_packages | default('нет изменений') }}"
|
||||||
|
when: false
|
||||||
|
|
||||||
|
- name: "👤 Создание группы devops"
|
||||||
|
tags: [devops, group]
|
||||||
|
block:
|
||||||
|
- name: "Проверка существования группы {{ devops_group }}"
|
||||||
|
group:
|
||||||
|
name: "{{ devops_group }}"
|
||||||
|
state: present
|
||||||
|
gid: "{{ devops_gid }}"
|
||||||
|
become: true
|
||||||
|
register: group_create_result
|
||||||
|
|
||||||
|
- name: "Логирование создания группы"
|
||||||
|
debug:
|
||||||
|
msg: "Группа {{ devops_group }} создана/существует"
|
||||||
|
when: false
|
||||||
|
|
||||||
|
- name: "👥 Создание недостающих групп"
|
||||||
|
tags: [devops, groups, additional]
|
||||||
|
block:
|
||||||
|
- name: "Создание группы wheel (если не существует)"
|
||||||
|
group:
|
||||||
|
name: wheel
|
||||||
|
state: present
|
||||||
|
become: true
|
||||||
|
when: "'wheel' in devops_final_additional_groups"
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: "Создание группы sudo (если не существует)"
|
||||||
|
group:
|
||||||
|
name: sudo
|
||||||
|
state: present
|
||||||
|
become: true
|
||||||
|
when: "'sudo' in devops_final_additional_groups"
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: "Создание группы systemd-journal (если не существует)"
|
||||||
|
group:
|
||||||
|
name: systemd-journal
|
||||||
|
state: present
|
||||||
|
become: true
|
||||||
|
when: "'systemd-journal' in devops_final_additional_groups"
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: "Создание группы docker (если не существует)"
|
||||||
|
group:
|
||||||
|
name: docker
|
||||||
|
state: present
|
||||||
|
become: true
|
||||||
|
when: "'docker' in devops_final_additional_groups"
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: "👤 Создание пользователя devops"
|
||||||
|
tags: [devops, user, password]
|
||||||
|
block:
|
||||||
|
- name: "Проверка существования пользователя {{ devops_user }}"
|
||||||
user:
|
user:
|
||||||
name: "{{ devops_user.name }}"
|
name: "{{ devops_user }}"
|
||||||
home: "{{ devops_user.home }}"
|
group: "{{ devops_group }}"
|
||||||
shell: "{{ devops_user.shell }}"
|
uid: "{{ devops_uid }}"
|
||||||
groups: "{{ devops_existing_groups | default(devops_user_groups) }}"
|
home: "{{ devops_home }}"
|
||||||
create_home: "{{ devops_user.create_home }}"
|
shell: "{{ devops_shell }}"
|
||||||
state: "{{ devops_user.state }}"
|
state: present
|
||||||
password: "{{ devops_user_password | password_hash('sha512') }}"
|
create_home: "{{ devops_create_home }}"
|
||||||
|
system: "{{ devops_system_user }}"
|
||||||
|
groups: "{{ devops_final_additional_groups }}"
|
||||||
|
append: yes
|
||||||
become: true
|
become: true
|
||||||
|
register: user_create_result
|
||||||
|
|
||||||
# Создание SSH директории для пользователя devops
|
- name: "Установка пароля для пользователя {{ devops_user }}"
|
||||||
- name: "Создание SSH директории для пользователя devops"
|
user:
|
||||||
|
name: "{{ devops_user }}"
|
||||||
|
password: "{{ devops_password | password_hash('sha512') }}"
|
||||||
|
update_password: always
|
||||||
|
become: true
|
||||||
|
no_log: true
|
||||||
|
register: password_set_result
|
||||||
|
|
||||||
|
- name: "Логирование создания пользователя"
|
||||||
|
debug:
|
||||||
|
msg: "Пользователь {{ devops_user }} создан/обновлен с паролем"
|
||||||
|
when: false
|
||||||
|
|
||||||
|
- name: "🔑 Настройка SSH ключей"
|
||||||
|
tags: [devops, ssh, keys]
|
||||||
|
block:
|
||||||
|
- name: "Создание директории .ssh для пользователя {{ devops_user }}"
|
||||||
file:
|
file:
|
||||||
path: "{{ devops_ssh.ssh_dir }}"
|
path: "{{ devops_ssh_dir }}"
|
||||||
state: directory
|
state: directory
|
||||||
owner: "{{ devops_user.name }}"
|
owner: "{{ devops_user }}"
|
||||||
group: "{{ devops_user.name }}"
|
group: "{{ devops_group }}"
|
||||||
mode: "{{ devops_ssh.ssh_dir_mode }}"
|
mode: "{{ devops_ssh_dir_mode }}"
|
||||||
become: true
|
become: true
|
||||||
|
|
||||||
# Добавление SSH ключа в authorized_keys
|
- name: "Добавление SSH публичного ключа в authorized_keys"
|
||||||
- name: "Добавление SSH ключа в authorized_keys"
|
|
||||||
authorized_key:
|
authorized_key:
|
||||||
user: "{{ devops_user.name }}"
|
user: "{{ devops_user }}"
|
||||||
key: "{{ devops_ssh_public_key }}"
|
key: "{{ devops_ssh_public_key }}"
|
||||||
state: present
|
state: present
|
||||||
manage_dir: false
|
manage_dir: no
|
||||||
become: true
|
become: true
|
||||||
when: devops_ssh_public_key is defined
|
register: ssh_key_result
|
||||||
|
when: devops_ssh_public_key != ""
|
||||||
|
|
||||||
# Настройка sudo для пользователя devops (без пароля)
|
- name: "Установка правильных прав на authorized_keys"
|
||||||
- name: "Настройка sudo для пользователя devops без пароля"
|
file:
|
||||||
lineinfile:
|
path: "{{ devops_ssh_authorized_keys }}"
|
||||||
path: "{{ devops_sudo_file }}"
|
owner: "{{ devops_user }}"
|
||||||
line: "{{ devops_user.name }} ALL=(ALL) NOPASSWD: {{ devops_sudo.commands }}"
|
group: "{{ devops_group }}"
|
||||||
create: true
|
mode: "{{ devops_ssh_keys_mode }}"
|
||||||
mode: '0440'
|
|
||||||
validate: "{{ devops_sudo_validate }}"
|
|
||||||
become: true
|
become: true
|
||||||
|
when: devops_ssh_public_key != ""
|
||||||
|
|
||||||
# Добавление пользователя в группу docker (если группа существует)
|
- name: "Логирование настройки SSH"
|
||||||
- name: "Добавление пользователя в группу docker"
|
|
||||||
user:
|
|
||||||
name: "{{ devops_user.name }}"
|
|
||||||
groups: "{{ devops_user_groups }}"
|
|
||||||
append: true
|
|
||||||
become: true
|
|
||||||
when:
|
|
||||||
- "'docker' in devops_user_groups"
|
|
||||||
- "'docker' in (devops_existing_groups | default([]))"
|
|
||||||
|
|
||||||
# Логирование успешного создания пользователя
|
|
||||||
- name: "Логирование создания пользователя devops"
|
|
||||||
debug:
|
debug:
|
||||||
msg: "Пользователь {{ devops_user.name }} успешно создан с безопасным паролем и SSH доступом на {{ devops_os_name | default('неизвестная') }} ОС"
|
msg: "SSH ключ для пользователя {{ devops_user }} настроен"
|
||||||
|
when: false
|
||||||
|
|
||||||
|
- name: "🔐 Настройка sudo прав"
|
||||||
|
tags: [devops, sudo, permissions]
|
||||||
|
block:
|
||||||
|
- name: "Создание файла sudoers для пользователя {{ devops_user }}"
|
||||||
|
template:
|
||||||
|
src: "{{ devops_sudoers_template }}"
|
||||||
|
dest: "{{ devops_sudoers_file }}"
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: '0440'
|
||||||
|
backup: yes
|
||||||
|
become: true
|
||||||
|
register: sudoers_result
|
||||||
|
|
||||||
|
- name: "Проверка синтаксиса sudoers файла"
|
||||||
|
command: "visudo -c -f {{ devops_sudoers_file }}"
|
||||||
|
become: true
|
||||||
|
register: sudoers_check
|
||||||
|
changed_when: false
|
||||||
|
failed_when: sudoers_check.rc != 0
|
||||||
|
|
||||||
|
- name: "Логирование настройки sudo"
|
||||||
|
debug:
|
||||||
|
msg: "Sudo права для пользователя {{ devops_user }} настроены"
|
||||||
|
when: false
|
||||||
|
|
||||||
|
- name: "🔧 Настройка дополнительных параметров"
|
||||||
|
tags: [devops, config, additional]
|
||||||
|
block:
|
||||||
|
- name: "Установка umask для пользователя {{ devops_user }}"
|
||||||
|
lineinfile:
|
||||||
|
path: "{{ devops_home }}/.bashrc"
|
||||||
|
line: "umask {{ devops_umask }}"
|
||||||
|
owner: "{{ devops_user }}"
|
||||||
|
group: "{{ devops_group }}"
|
||||||
|
mode: '0644'
|
||||||
|
create: yes
|
||||||
|
backup: yes
|
||||||
|
become: true
|
||||||
|
|
||||||
|
- name: "Создание SSH конфигурации для пользователя {{ devops_user }}"
|
||||||
|
template:
|
||||||
|
src: "devops_ssh_config.j2"
|
||||||
|
dest: "{{ devops_ssh_config }}"
|
||||||
|
owner: "{{ devops_user }}"
|
||||||
|
group: "{{ devops_group }}"
|
||||||
|
mode: "0600"
|
||||||
|
backup: yes
|
||||||
|
become: true
|
||||||
|
|
||||||
|
- name: "Логирование дополнительных настроек"
|
||||||
|
debug:
|
||||||
|
msg: "Дополнительные настройки для пользователя {{ devops_user }} применены"
|
||||||
|
when: false
|
||||||
|
|
||||||
|
- name: "✅ Проверка настройки пользователя devops"
|
||||||
|
when: devops_verify_user
|
||||||
|
tags: [devops, verification, check]
|
||||||
|
block:
|
||||||
|
- name: "Проверка существования пользователя {{ devops_user }}"
|
||||||
|
command: "id {{ devops_user }}"
|
||||||
|
register: user_check
|
||||||
|
changed_when: false
|
||||||
|
failed_when: user_check.rc != 0
|
||||||
|
|
||||||
|
- name: "Проверка SSH ключа пользователя {{ devops_user }}"
|
||||||
|
stat:
|
||||||
|
path: "{{ devops_ssh_authorized_keys }}"
|
||||||
|
register: ssh_key_check
|
||||||
|
|
||||||
|
- name: "Проверка sudo прав пользователя {{ devops_user }}"
|
||||||
|
command: "sudo -l -U {{ devops_user }}"
|
||||||
|
become: true
|
||||||
|
register: sudo_check
|
||||||
|
changed_when: false
|
||||||
|
failed_when: sudo_check.rc != 0
|
||||||
|
|
||||||
|
- name: "Логирование результатов проверки"
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
Результаты проверки пользователя {{ devops_user }}:
|
||||||
|
- Пользователь существует: {{ user_check.rc == 0 }}
|
||||||
|
- SSH ключ настроен: {{ ssh_key_check.stat.exists }}
|
||||||
|
- Sudo права настроены: {{ sudo_check.rc == 0 }}
|
||||||
|
|
||||||
|
- name: "📝 Уведомления о завершении"
|
||||||
|
tags: [devops, notification, success]
|
||||||
|
block:
|
||||||
|
- name: "Уведомление об успешном завершении"
|
||||||
|
debug:
|
||||||
|
msg: "✅ Пользователь {{ devops_user }} успешно настроен на {{ ansible_hostname }}"
|
||||||
|
when: devops_notify_on_success
|
||||||
|
|
||||||
|
- name: "Уведомление о настройке SSH"
|
||||||
|
debug:
|
||||||
|
msg: "🔑 SSH ключ для пользователя {{ devops_user }} настроен"
|
||||||
|
when: devops_notify_on_success and devops_verify_ssh
|
||||||
|
|
||||||
|
- name: "Уведомление о настройке sudo"
|
||||||
|
debug:
|
||||||
|
msg: "🔐 Sudo права для пользователя {{ devops_user }} настроены"
|
||||||
|
when: devops_notify_on_success and devops_verify_sudo
|
||||||
79
roles/devops/templates/devops_ssh_config.j2
Normal file
79
roles/devops/templates/devops_ssh_config.j2
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
# SSH конфигурация для пользователя {{ devops_user }}
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
# Создан: {{ ansible_date_time.iso8601 }}
|
||||||
|
|
||||||
|
# Основные настройки SSH клиента
|
||||||
|
Host *
|
||||||
|
# Настройки безопасности
|
||||||
|
StrictHostKeyChecking ask
|
||||||
|
UserKnownHostsFile ~/.ssh/known_hosts
|
||||||
|
IdentitiesOnly yes
|
||||||
|
|
||||||
|
# Настройки подключения
|
||||||
|
ServerAliveInterval 60
|
||||||
|
ServerAliveCountMax 3
|
||||||
|
TCPKeepAlive yes
|
||||||
|
|
||||||
|
# Настройки сжатия
|
||||||
|
Compression yes
|
||||||
|
CompressionLevel 6
|
||||||
|
|
||||||
|
# Настройки шифрования
|
||||||
|
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
|
||||||
|
|
||||||
|
# Настройки MAC
|
||||||
|
MACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha2-256,hmac-sha2-512
|
||||||
|
|
||||||
|
# Настройки KEX
|
||||||
|
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521
|
||||||
|
|
||||||
|
# Настройки аутентификации
|
||||||
|
PreferredAuthentications publickey,password
|
||||||
|
PubkeyAuthentication yes
|
||||||
|
PasswordAuthentication yes
|
||||||
|
|
||||||
|
# Настройки портов
|
||||||
|
Port 22
|
||||||
|
|
||||||
|
# Настройки таймаутов
|
||||||
|
ConnectTimeout 30
|
||||||
|
ConnectionAttempts 3
|
||||||
|
|
||||||
|
# Настройки логирования
|
||||||
|
LogLevel INFO
|
||||||
|
|
||||||
|
# Настройки для X11 forwarding (если нужно)
|
||||||
|
# ForwardX11 yes
|
||||||
|
# ForwardX11Trusted yes
|
||||||
|
|
||||||
|
# Настройки для агента SSH
|
||||||
|
ForwardAgent yes
|
||||||
|
|
||||||
|
# Настройки для туннелирования
|
||||||
|
# LocalForward 8080 localhost:80
|
||||||
|
# RemoteForward 9090 localhost:9090
|
||||||
|
|
||||||
|
# Специфичные настройки для разных хостов
|
||||||
|
# Host production
|
||||||
|
# HostName prod.example.com
|
||||||
|
# User {{ devops_user }}
|
||||||
|
# Port 2222
|
||||||
|
# IdentityFile ~/.ssh/id_rsa_prod
|
||||||
|
# StrictHostKeyChecking yes
|
||||||
|
# UserKnownHostsFile ~/.ssh/known_hosts_prod
|
||||||
|
|
||||||
|
# Host staging
|
||||||
|
# HostName staging.example.com
|
||||||
|
# User {{ devops_user }}
|
||||||
|
# Port 22
|
||||||
|
# IdentityFile ~/.ssh/id_rsa_staging
|
||||||
|
# StrictHostKeyChecking no
|
||||||
|
|
||||||
|
# Host development
|
||||||
|
# HostName dev.example.com
|
||||||
|
# User {{ devops_user }}
|
||||||
|
# Port 22
|
||||||
|
# IdentityFile ~/.ssh/id_rsa_dev
|
||||||
|
# StrictHostKeyChecking no
|
||||||
|
# UserKnownHostsFile /dev/null
|
||||||
21
roles/devops/templates/devops_sudoers.j2
Normal file
21
roles/devops/templates/devops_sudoers.j2
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# Sudoers файл для пользователя {{ devops_user }}
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
# Создан: {{ ansible_date_time.iso8601 }}
|
||||||
|
|
||||||
|
# Разрешить пользователю {{ devops_user }} выполнять все команды без ввода пароля
|
||||||
|
{{ devops_user }} ALL=(ALL) NOPASSWD:ALL
|
||||||
|
|
||||||
|
# Дополнительные настройки безопасности
|
||||||
|
# Разрешить выполнение команд только от определенных терминалов (опционально)
|
||||||
|
# {{ devops_user }} ALL=(ALL) NOPASSWD:ALL, !/usr/bin/passwd, !/usr/bin/su
|
||||||
|
|
||||||
|
# Логирование всех команд sudo (опционально)
|
||||||
|
# Defaults logfile=/var/log/sudo.log
|
||||||
|
# Defaults log_input, log_output
|
||||||
|
|
||||||
|
# Настройки таймаута для sudo сессий (опционально)
|
||||||
|
# Defaults timestamp_timeout=15
|
||||||
|
|
||||||
|
# Разрешить выполнение команд без подтверждения для определенных команд
|
||||||
|
# {{ devops_user }} ALL=(ALL) NOPASSWD: /bin/systemctl, /usr/bin/docker, /usr/bin/kubectl
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
---
|
|
||||||
# Тесты для роли devops
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
- name: "Тестирование роли devops"
|
|
||||||
hosts: all
|
|
||||||
become: true
|
|
||||||
gather_facts: true
|
|
||||||
|
|
||||||
vars:
|
|
||||||
devops_ssh_public_key: "{{ devops_ssh_keys.public_key }}"
|
|
||||||
|
|
||||||
roles:
|
|
||||||
- devops
|
|
||||||
|
|
||||||
post_tasks:
|
|
||||||
# Тест 1: Проверка существования пользователя
|
|
||||||
- name: "Проверка существования пользователя devops"
|
|
||||||
command: "id {{ devops_user.name }}"
|
|
||||||
register: user_exists
|
|
||||||
failed_when: user_exists.rc != 0
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
# Тест 2: Проверка домашней директории
|
|
||||||
- name: "Проверка домашней директории"
|
|
||||||
stat:
|
|
||||||
path: "{{ devops_user.home }}"
|
|
||||||
register: home_dir
|
|
||||||
failed_when: not home_dir.stat.exists
|
|
||||||
|
|
||||||
# Тест 3: Проверка SSH директории
|
|
||||||
- name: "Проверка SSH директории"
|
|
||||||
stat:
|
|
||||||
path: "{{ devops_ssh.ssh_dir }}"
|
|
||||||
register: ssh_dir
|
|
||||||
failed_when: not ssh_dir.stat.exists
|
|
||||||
|
|
||||||
# Тест 4: Проверка authorized_keys (если SSH ключ передан)
|
|
||||||
- name: "Проверка authorized_keys"
|
|
||||||
stat:
|
|
||||||
path: "{{ devops_ssh.authorized_keys_file }}"
|
|
||||||
register: auth_keys
|
|
||||||
failed_when: devops_ssh_public_key is defined and not auth_keys.stat.exists
|
|
||||||
when: devops_ssh_public_key is defined
|
|
||||||
|
|
||||||
# Тест 5: Проверка sudo прав
|
|
||||||
- name: "Проверка sudo прав"
|
|
||||||
command: "sudo -l -U {{ devops_user.name }}"
|
|
||||||
register: sudo_rights
|
|
||||||
become: true
|
|
||||||
failed_when: sudo_rights.rc != 0
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
# Тест 6: Проверка групп пользователя
|
|
||||||
- name: "Проверка групп пользователя"
|
|
||||||
command: "groups {{ devops_user.name }}"
|
|
||||||
register: user_groups
|
|
||||||
failed_when: user_groups.rc != 0
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
# Тест 7: Проверка прав на SSH директорию
|
|
||||||
- name: "Проверка прав на SSH директорию"
|
|
||||||
stat:
|
|
||||||
path: "{{ devops_ssh.ssh_dir }}"
|
|
||||||
register: ssh_dir_perms
|
|
||||||
failed_when: ssh_dir_perms.stat.mode != "0" + devops_ssh.ssh_dir_mode
|
|
||||||
|
|
||||||
# Тест 8: Проверка shell пользователя
|
|
||||||
- name: "Проверка shell пользователя"
|
|
||||||
command: "getent passwd {{ devops_user.name }}"
|
|
||||||
register: user_shell
|
|
||||||
failed_when: user_shell.rc != 0
|
|
||||||
changed_when: false
|
|
||||||
|
|
||||||
# Вывод результатов тестов
|
|
||||||
- name: "Результаты тестов"
|
|
||||||
debug:
|
|
||||||
msg: |
|
|
||||||
✅ Пользователь {{ devops_user.name }} создан
|
|
||||||
✅ Домашняя директория {{ devops_user.home }} создана
|
|
||||||
✅ SSH директория {{ devops_ssh.ssh_dir }} создана
|
|
||||||
{% if devops_ssh_public_key is defined %}
|
|
||||||
✅ authorized_keys настроен
|
|
||||||
{% endif %}
|
|
||||||
✅ Sudo права настроены
|
|
||||||
✅ Группы пользователя: {{ user_groups.stdout }}
|
|
||||||
✅ Shell пользователя: {{ user_shell.stdout.split(':')[-1] }}
|
|
||||||
✅ ОС: {{ devops_os_name | default('неизвестная') }}
|
|
||||||
✅ Группы для ОС: {{ devops_user_groups | default('не определены') }}
|
|
||||||
@@ -1,25 +1,251 @@
|
|||||||
---
|
---
|
||||||
# Переменные для роли devops
|
# OS-специфичные переменные для роли devops
|
||||||
# Автор: Сергей Антропов
|
# Автор: Сергей Антропов
|
||||||
# Сайт: https://devops.org.ru
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
# Список пакетов, необходимых для роли
|
# Определение семейства ОС
|
||||||
devops_required_packages:
|
devops_os_family: "{{ ansible_os_family | lower }}"
|
||||||
- openssh-server
|
devops_distribution: "{{ ansible_distribution | lower }}"
|
||||||
- sudo
|
devops_distribution_version: "{{ ansible_distribution_version | lower }}"
|
||||||
- passwd
|
|
||||||
|
|
||||||
# Настройки безопасности для SSH
|
# Настройки для разных семейств ОС
|
||||||
devops_ssh_security:
|
devops_os_config:
|
||||||
permit_root_login: "no"
|
redhat:
|
||||||
password_authentication: "yes"
|
package_manager: "yum"
|
||||||
pubkey_authentication: "yes"
|
user_management: "useradd"
|
||||||
authorized_keys_file: ".ssh/authorized_keys"
|
group_management: "groupadd"
|
||||||
|
sudo_group: "wheel"
|
||||||
|
additional_groups:
|
||||||
|
- "wheel"
|
||||||
|
- "docker"
|
||||||
|
- "systemd-journal"
|
||||||
|
packages:
|
||||||
|
- "sudo"
|
||||||
|
- "curl"
|
||||||
|
- "wget"
|
||||||
|
- "nano"
|
||||||
|
- "mc"
|
||||||
|
- "tar"
|
||||||
|
- "gzip"
|
||||||
|
services:
|
||||||
|
- "sshd"
|
||||||
|
sudoers_path: "/etc/sudoers.d"
|
||||||
|
ssh_config_path: "/etc/ssh/sshd_config"
|
||||||
|
debian:
|
||||||
|
package_manager: "apt"
|
||||||
|
user_management: "useradd"
|
||||||
|
group_management: "groupadd"
|
||||||
|
sudo_group: "sudo"
|
||||||
|
additional_groups:
|
||||||
|
- "sudo"
|
||||||
|
- "docker"
|
||||||
|
- "systemd-journal"
|
||||||
|
packages:
|
||||||
|
- "sudo"
|
||||||
|
- "curl"
|
||||||
|
- "wget"
|
||||||
|
- "nano"
|
||||||
|
- "mc"
|
||||||
|
- "tar"
|
||||||
|
- "gzip"
|
||||||
|
services:
|
||||||
|
- "ssh"
|
||||||
|
sudoers_path: "/etc/sudoers.d"
|
||||||
|
ssh_config_path: "/etc/ssh/sshd_config"
|
||||||
|
suse:
|
||||||
|
package_manager: "zypper"
|
||||||
|
user_management: "useradd"
|
||||||
|
group_management: "groupadd"
|
||||||
|
sudo_group: "wheel"
|
||||||
|
additional_groups:
|
||||||
|
- "wheel"
|
||||||
|
- "docker"
|
||||||
|
- "systemd-journal"
|
||||||
|
packages:
|
||||||
|
- "sudo"
|
||||||
|
- "curl"
|
||||||
|
- "wget"
|
||||||
|
- "nano"
|
||||||
|
- "mc"
|
||||||
|
- "tar"
|
||||||
|
- "gzip"
|
||||||
|
services:
|
||||||
|
- "sshd"
|
||||||
|
sudoers_path: "/etc/sudoers.d"
|
||||||
|
ssh_config_path: "/etc/ssh/sshd_config"
|
||||||
|
alpine:
|
||||||
|
package_manager: "apk"
|
||||||
|
user_management: "adduser"
|
||||||
|
group_management: "addgroup"
|
||||||
|
sudo_group: "wheel"
|
||||||
|
additional_groups:
|
||||||
|
- "wheel"
|
||||||
|
- "docker"
|
||||||
|
packages:
|
||||||
|
- "sudo"
|
||||||
|
- "openssh"
|
||||||
|
- "curl"
|
||||||
|
- "wget"
|
||||||
|
- "mc"
|
||||||
|
- "nano"
|
||||||
|
- "tar"
|
||||||
|
- "gzip"
|
||||||
|
services:
|
||||||
|
- "sshd"
|
||||||
|
sudoers_path: "/etc/sudoers.d"
|
||||||
|
ssh_config_path: "/etc/ssh/sshd_config"
|
||||||
|
|
||||||
# Настройки sudo для безопасности
|
# Специфичные настройки для российских ОС
|
||||||
devops_sudo_security:
|
devops_russian_os_config:
|
||||||
requiretty: false
|
clearlinux: # Astra Linux определяется как clearlinux
|
||||||
visiblepw: false
|
package_manager: "apt"
|
||||||
always_set_home: true
|
user_management: "useradd"
|
||||||
env_reset: true
|
group_management: "groupadd"
|
||||||
env_keep: "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
|
sudo_group: "sudo"
|
||||||
|
additional_groups:
|
||||||
|
- "sudo"
|
||||||
|
- "docker"
|
||||||
|
- "systemd-journal"
|
||||||
|
packages:
|
||||||
|
- "sudo"
|
||||||
|
- "curl"
|
||||||
|
- "wget"
|
||||||
|
- "mc"
|
||||||
|
- "nano"
|
||||||
|
- "tar"
|
||||||
|
- "gzip"
|
||||||
|
services:
|
||||||
|
- "ssh"
|
||||||
|
sudoers_path: "/etc/sudoers.d"
|
||||||
|
ssh_config_path: "/etc/ssh/sshd_config"
|
||||||
|
astra:
|
||||||
|
package_manager: "apt"
|
||||||
|
user_management: "useradd"
|
||||||
|
group_management: "groupadd"
|
||||||
|
sudo_group: "sudo"
|
||||||
|
additional_groups:
|
||||||
|
- "sudo"
|
||||||
|
- "docker"
|
||||||
|
- "systemd-journal"
|
||||||
|
packages:
|
||||||
|
- "sudo"
|
||||||
|
- "curl"
|
||||||
|
- "wget"
|
||||||
|
- "mc"
|
||||||
|
- "nano"
|
||||||
|
- "tar"
|
||||||
|
- "gzip"
|
||||||
|
services:
|
||||||
|
- "ssh"
|
||||||
|
sudoers_path: "/etc/sudoers.d"
|
||||||
|
ssh_config_path: "/etc/ssh/sshd_config"
|
||||||
|
redos:
|
||||||
|
package_manager: "yum"
|
||||||
|
user_management: "useradd"
|
||||||
|
group_management: "groupadd"
|
||||||
|
sudo_group: "wheel"
|
||||||
|
additional_groups:
|
||||||
|
- "wheel"
|
||||||
|
- "docker"
|
||||||
|
- "systemd-journal"
|
||||||
|
packages:
|
||||||
|
- "sudo"
|
||||||
|
- "curl"
|
||||||
|
- "wget"
|
||||||
|
- "mc"
|
||||||
|
- "nano"
|
||||||
|
- "tar"
|
||||||
|
- "gzip"
|
||||||
|
services:
|
||||||
|
- "sshd"
|
||||||
|
sudoers_path: "/etc/sudoers.d"
|
||||||
|
ssh_config_path: "/etc/ssh/sshd_config"
|
||||||
|
altlinux: # Alt Linux определяется как altlinux
|
||||||
|
package_manager: "apt"
|
||||||
|
user_management: "useradd"
|
||||||
|
group_management: "groupadd"
|
||||||
|
sudo_group: "sudo"
|
||||||
|
additional_groups:
|
||||||
|
- "sudo"
|
||||||
|
- "docker"
|
||||||
|
- "systemd-journal"
|
||||||
|
packages:
|
||||||
|
- "sudo"
|
||||||
|
- "curl"
|
||||||
|
- "wget"
|
||||||
|
- "mc"
|
||||||
|
- "nano"
|
||||||
|
- "tar"
|
||||||
|
- "gzip"
|
||||||
|
services:
|
||||||
|
- "ssh"
|
||||||
|
sudoers_path: "/etc/sudoers.d"
|
||||||
|
ssh_config_path: "/etc/ssh/sshd_config"
|
||||||
|
alt:
|
||||||
|
package_manager: "apt"
|
||||||
|
user_management: "useradd"
|
||||||
|
group_management: "groupadd"
|
||||||
|
sudo_group: "sudo"
|
||||||
|
additional_groups:
|
||||||
|
- "sudo"
|
||||||
|
- "docker"
|
||||||
|
- "systemd-journal"
|
||||||
|
packages:
|
||||||
|
- "sudo"
|
||||||
|
- "curl"
|
||||||
|
- "wget"
|
||||||
|
- "mc"
|
||||||
|
- "nano"
|
||||||
|
- "tar"
|
||||||
|
- "gzip"
|
||||||
|
services:
|
||||||
|
- "ssh"
|
||||||
|
sudoers_path: "/etc/sudoers.d"
|
||||||
|
ssh_config_path: "/etc/ssh/sshd_config"
|
||||||
|
|
||||||
|
# Получение конфигурации для текущей ОС
|
||||||
|
devops_current_config: "{{ devops_russian_os_config[devops_distribution] | default(devops_os_config[devops_os_family]) }}"
|
||||||
|
|
||||||
|
# Переменные для работы с пакетами
|
||||||
|
devops_package_manager_cmd: "{{ devops_current_config.package_manager }}"
|
||||||
|
devops_user_cmd: "{{ devops_current_config.user_management }}"
|
||||||
|
devops_group_cmd: "{{ devops_current_config.group_management }}"
|
||||||
|
devops_sudo_group: "{{ devops_current_config.sudo_group }}"
|
||||||
|
devops_packages_to_install: "{{ devops_current_config.packages }}"
|
||||||
|
devops_services_to_enable: "{{ devops_current_config.services }}"
|
||||||
|
devops_sudoers_path: "{{ devops_current_config.sudoers_path }}"
|
||||||
|
devops_ssh_config_path: "{{ devops_current_config.ssh_config_path }}"
|
||||||
|
|
||||||
|
# Дополнительные группы для пользователя
|
||||||
|
devops_final_additional_groups: "{{ devops_current_config.additional_groups }}"
|
||||||
|
|
||||||
|
# Настройки для проверки системы
|
||||||
|
devops_system_checks:
|
||||||
|
- name: "check_user_exists"
|
||||||
|
command: "id {{ devops_user }}"
|
||||||
|
register: "devops_user_check"
|
||||||
|
|
||||||
|
- name: "check_ssh_key_exists"
|
||||||
|
stat:
|
||||||
|
path: "{{ devops_ssh_authorized_keys }}"
|
||||||
|
register: "devops_ssh_key_check"
|
||||||
|
|
||||||
|
- name: "check_sudoers_exists"
|
||||||
|
stat:
|
||||||
|
path: "{{ devops_sudoers_file }}"
|
||||||
|
register: "devops_sudoers_check"
|
||||||
|
|
||||||
|
# Настройки для логирования
|
||||||
|
devops_log_config:
|
||||||
|
level: "{{ devops_log_level }}"
|
||||||
|
file: "{{ devops_log_file }}"
|
||||||
|
format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
||||||
|
max_size: "10MB"
|
||||||
|
backup_count: 5
|
||||||
|
|
||||||
|
# Настройки для уведомлений
|
||||||
|
devops_notification_config:
|
||||||
|
success_message: "Пользователь {{ devops_user }} успешно настроен"
|
||||||
|
failure_message: "Ошибка при настройке пользователя {{ devops_user }}"
|
||||||
|
ssh_message: "SSH ключ для пользователя {{ devops_user }} настроен"
|
||||||
|
sudo_message: "Sudo права для пользователя {{ devops_user }} настроены"
|
||||||
|
|||||||
@@ -3,6 +3,12 @@
|
|||||||
# Автор: Сергей Антропов
|
# Автор: Сергей Антропов
|
||||||
# Сайт: https://devops.org.ru
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
- name: "Reset ANSI color codes"
|
||||||
|
debug:
|
||||||
|
msg: "\033[0m"
|
||||||
|
changed_when: false
|
||||||
|
tags: [docker, color-reset]
|
||||||
|
|
||||||
# Определяем семейство ОС для выбора правильного метода установки
|
# Определяем семейство ОС для выбора правильного метода установки
|
||||||
- name: Определение семейства ОС
|
- name: Определение семейства ОС
|
||||||
set_fact:
|
set_fact:
|
||||||
@@ -127,7 +133,7 @@
|
|||||||
dest: /tmp/get-docker.sh
|
dest: /tmp/get-docker.sh
|
||||||
mode: '0755'
|
mode: '0755'
|
||||||
when:
|
when:
|
||||||
- docker_install_method == "get.docker.com" or docker_use_official_repo == false
|
- docker_install_method == "get.docker.com" or not docker_use_official_repo
|
||||||
- not docker_binary.stat.exists
|
- not docker_binary.stat.exists
|
||||||
|
|
||||||
- name: Установка Docker через скрипт get.docker.com
|
- name: Установка Docker через скрипт get.docker.com
|
||||||
@@ -136,7 +142,7 @@
|
|||||||
args:
|
args:
|
||||||
creates: /usr/bin/docker
|
creates: /usr/bin/docker
|
||||||
when:
|
when:
|
||||||
- docker_install_method == "get.docker.com" or docker_use_official_repo == false
|
- docker_install_method == "get.docker.com" or not docker_use_official_repo
|
||||||
- not docker_binary.stat.exists
|
- not docker_binary.stat.exists
|
||||||
|
|
||||||
- name: Проверка установки Docker
|
- name: Проверка установки Docker
|
||||||
|
|||||||
@@ -1,150 +0,0 @@
|
|||||||
# Быстрый старт - Роль Ping
|
|
||||||
|
|
||||||
**Автор:** Сергей Антропов
|
|
||||||
**Сайт:** https://devops.org.ru
|
|
||||||
**Версия:** 2.0.0
|
|
||||||
|
|
||||||
## Что делает роль?
|
|
||||||
|
|
||||||
Роль выполняет ping проверки подключения к сети. Отправляет пакеты на указанный хост и выводит результаты.
|
|
||||||
|
|
||||||
## Основные задачи роли:
|
|
||||||
|
|
||||||
1. **Выполнение ping** - отправляет пакеты на указанный хост
|
|
||||||
2. **Вывод результата** - показывает результаты ping
|
|
||||||
3. **Статистика** - выводит статус выполнения
|
|
||||||
4. **Дополнительная информация** - выводит полный вывод команды
|
|
||||||
|
|
||||||
## Быстрый запуск
|
|
||||||
|
|
||||||
### Тестирование роли
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Lint проверка
|
|
||||||
make role lint ping
|
|
||||||
|
|
||||||
# Тестирование с minimal preset (1 хост)
|
|
||||||
make role test minimal
|
|
||||||
|
|
||||||
# Тестирование с default preset (2 хоста)
|
|
||||||
make role test default
|
|
||||||
|
|
||||||
# Тестирование конкретной роли
|
|
||||||
make role test ping
|
|
||||||
```
|
|
||||||
|
|
||||||
### Использование в roles/deploy.yml
|
|
||||||
|
|
||||||
Роль уже добавлена в `roles/deploy.yml` и запускается вместе с остальными ролями:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Запуск всех ролей
|
|
||||||
make role test minimal
|
|
||||||
|
|
||||||
# Запуск только с тегом ping
|
|
||||||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags ping
|
|
||||||
```
|
|
||||||
|
|
||||||
### Отдельное использование
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Прямой запуск playbook роли
|
|
||||||
ansible-playbook -i inventory/hosts.ini roles/ping/playbook.yml
|
|
||||||
```
|
|
||||||
|
|
||||||
## Переменные
|
|
||||||
|
|
||||||
| Переменная | По умолчанию | Описание |
|
|
||||||
|------------|--------------|----------|
|
|
||||||
| `ping_host` | `yandex.ru` | Целевой хост для ping |
|
|
||||||
| `ping_count` | `5` | Количество пакетов |
|
|
||||||
| `ping_interval` | `1` | Интервал между пакетами (сек) |
|
|
||||||
| `ping_timeout` | `10` | Таймаут (сек) |
|
|
||||||
| `ping_packet_size` | `64` | Размер пакета (байт) |
|
|
||||||
|
|
||||||
### Использование с кастомными параметрами
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
- name: Тест ping
|
|
||||||
hosts: all
|
|
||||||
roles:
|
|
||||||
- role: ping
|
|
||||||
vars:
|
|
||||||
ping_host: google.com
|
|
||||||
ping_count: 10
|
|
||||||
ping_timeout: 5
|
|
||||||
```
|
|
||||||
|
|
||||||
## Теги
|
|
||||||
|
|
||||||
- `ping` - выполнение всех задач
|
|
||||||
- `test` - тестирование
|
|
||||||
- `debug` - отладочная информация
|
|
||||||
- `stats` - статистика
|
|
||||||
|
|
||||||
### Примеры использования тегов
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Только ping задачи
|
|
||||||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags ping
|
|
||||||
|
|
||||||
# Ping + debug
|
|
||||||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags "ping,debug"
|
|
||||||
|
|
||||||
# Только статистика
|
|
||||||
ansible-playbook -i inventory/hosts.ini roles/deploy.yml --tags stats
|
|
||||||
```
|
|
||||||
|
|
||||||
## Пример вывода
|
|
||||||
|
|
||||||
```
|
|
||||||
=========================================
|
|
||||||
Результат ping yandex.ru
|
|
||||||
=========================================
|
|
||||||
PING yandex.ru (87.250.250.242) 64(92) bytes of data.
|
|
||||||
72 bytes from yandex.ru (87.250.250.242): icmp_seq=1 ttl=57 time=5.24 ms
|
|
||||||
72 bytes from yandex.ru (87.250.250.242): icmp_seq=2 ttl=57 time=5.12 ms
|
|
||||||
72 bytes from yandex.ru (87.250.250.242): icmp_seq=3 ttl=57 time=5.08 ms
|
|
||||||
72 bytes from yandex.ru (87.250.250.242): icmp_seq=4 ttl=57 time=5.18 ms
|
|
||||||
72 bytes from yandex.ru (87.250.250.242): icmp_seq=5 ttl=57 time=5.21 ms
|
|
||||||
|
|
||||||
--- yandex.ru ping statistics ---
|
|
||||||
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
|
|
||||||
rtt min/avg/max/mdev = 5.080/5.166/5.240/0.057 ms
|
|
||||||
=========================================
|
|
||||||
Статус: УСПЕШНО
|
|
||||||
=========================================
|
|
||||||
```
|
|
||||||
|
|
||||||
## Проверка результатов
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Проверка через логи Molecule
|
|
||||||
docker logs $(docker ps -aq --filter "network=labnet" | head -1)
|
|
||||||
|
|
||||||
# Вход в контейнер для проверки
|
|
||||||
docker exec -it $(docker ps -aq --filter "network=labnet" | head -1) bash
|
|
||||||
|
|
||||||
# Внутри контейнера
|
|
||||||
ping -c 5 yandex.ru
|
|
||||||
```
|
|
||||||
|
|
||||||
## Поддерживаемые ОС
|
|
||||||
|
|
||||||
- ✅ Ubuntu 20.04, 22.04, 24.04
|
|
||||||
- ✅ Debian 9, 10, 11, 12
|
|
||||||
- ✅ CentOS 7, 8, 9
|
|
||||||
- ✅ RHEL 8, 9
|
|
||||||
- ✅ AlmaLinux 8, 9
|
|
||||||
- ✅ Rocky Linux 8, 9
|
|
||||||
|
|
||||||
## Дополнительная информация
|
|
||||||
|
|
||||||
- 📖 Полная документация: `roles/ping/README.md`
|
|
||||||
- 🧪 Тесты: `roles/ping/tests/test.yml`
|
|
||||||
- 📝 Примеры: `roles/ping/examples.yml`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Автор:** Сергей Антропов
|
|
||||||
**Сайт:** https://devops.org.ru
|
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
# Роль Ping
|
|
||||||
|
|
||||||
**Автор:** Сергей Антропов
|
|
||||||
**Сайт:** https://devops.org.ru
|
|
||||||
|
|
||||||
## Описание
|
|
||||||
|
|
||||||
Роль для выполнения ping проверок подключения к сети. Роль отправляет ping пакеты на указанный хост и выводит результаты выполнения.
|
|
||||||
|
|
||||||
## Требования
|
|
||||||
|
|
||||||
- Ansible >= 2.9
|
|
||||||
- Наличие утилиты `ping` на целевых хостах
|
|
||||||
- Привилегии на выполнение ping (обычно не требуются)
|
|
||||||
|
|
||||||
## Переменные
|
|
||||||
|
|
||||||
| Переменная | Тип | По умолчанию | Описание |
|
|
||||||
|------------|-----|--------------|----------|
|
|
||||||
| `ping_host` | string | `yandex.ru` | Целевой хост для ping |
|
|
||||||
| `ping_count` | integer | `5` | Количество пакетов для отправки |
|
|
||||||
| `ping_interval` | integer | `1` | Интервал между пакетами (в секундах) |
|
|
||||||
| `ping_timeout` | integer | `10` | Таймаут (в секундах) |
|
|
||||||
| `ping_packet_size` | integer | `64` | Размер пакета (в байтах) |
|
|
||||||
|
|
||||||
## Примеры использования
|
|
||||||
|
|
||||||
### Базовое использование
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
- name: Выполнить ping проверку
|
|
||||||
hosts: all
|
|
||||||
roles:
|
|
||||||
- ping
|
|
||||||
```
|
|
||||||
|
|
||||||
### С кастомными параметрами
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
- name: Выполнить ping проверку с кастомными параметрами
|
|
||||||
hosts: all
|
|
||||||
roles:
|
|
||||||
- role: ping
|
|
||||||
vars:
|
|
||||||
ping_host: google.com
|
|
||||||
ping_count: 10
|
|
||||||
```
|
|
||||||
|
|
||||||
### В playbook
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
---
|
|
||||||
- name: Тестирование сетевого подключения
|
|
||||||
hosts: servers
|
|
||||||
become: false
|
|
||||||
roles:
|
|
||||||
- role: ping
|
|
||||||
vars:
|
|
||||||
ping_host: 8.8.8.8
|
|
||||||
ping_count: 3
|
|
||||||
tags:
|
|
||||||
- network
|
|
||||||
- test
|
|
||||||
```
|
|
||||||
|
|
||||||
## Tags
|
|
||||||
|
|
||||||
Роль поддерживает следующие теги:
|
|
||||||
|
|
||||||
- `ping` - выполнение всех задач роли
|
|
||||||
- `test` - тестирование подключения
|
|
||||||
- `debug` - вывод отладочной информации
|
|
||||||
- `stats` - вывод статистики
|
|
||||||
|
|
||||||
Пример использования тегов:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
ansible-playbook site.yml --tags "ping,debug"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Поддерживаемые ОС
|
|
||||||
|
|
||||||
- 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,19 +0,0 @@
|
|||||||
---
|
|
||||||
# Переменные по умолчанию для роли ping
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
# Целевой хост для ping
|
|
||||||
ping_host: yandex.ru
|
|
||||||
|
|
||||||
# Количество пакетов для отправки
|
|
||||||
ping_count: 5
|
|
||||||
|
|
||||||
# Интервал между пакетами (в секундах)
|
|
||||||
ping_interval: 1
|
|
||||||
|
|
||||||
# Таймаут (в секундах)
|
|
||||||
ping_timeout: 10
|
|
||||||
|
|
||||||
# Размер пакета (в байтах)
|
|
||||||
ping_packet_size: 64
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
---
|
|
||||||
# Handlers для роли ping
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
# В данный момент handlers не требуются для роли ping (пустой файл для совместимости)
|
|
||||||
[]
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
---
|
|
||||||
# Метаданные роли ping
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
galaxy_info:
|
|
||||||
role_name: ping
|
|
||||||
namespace: antropov
|
|
||||||
author: Сергей Антропов
|
|
||||||
description: Роль для выполнения ping проверок подключения к сети
|
|
||||||
company: DevOps.org.ru
|
|
||||||
license: MIT
|
|
||||||
min_ansible_version: "2.9"
|
|
||||||
platforms:
|
|
||||||
- name: EL
|
|
||||||
versions:
|
|
||||||
- "7"
|
|
||||||
- "8"
|
|
||||||
- "9"
|
|
||||||
- "all"
|
|
||||||
- name: Ubuntu
|
|
||||||
versions:
|
|
||||||
- jammy
|
|
||||||
- focal
|
|
||||||
- noble
|
|
||||||
- name: Debian
|
|
||||||
versions:
|
|
||||||
- bullseye
|
|
||||||
- bookworm
|
|
||||||
- trixie
|
|
||||||
galaxy_tags:
|
|
||||||
- networking
|
|
||||||
- ping
|
|
||||||
- connectivity
|
|
||||||
- testing
|
|
||||||
|
|
||||||
dependencies: []
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
# Пример playbook для роли ping
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
- name: Тестирование ping подключения
|
|
||||||
hosts: all
|
|
||||||
become: false
|
|
||||||
roles:
|
|
||||||
- role: ping
|
|
||||||
vars:
|
|
||||||
ping_host: yandex.ru
|
|
||||||
ping_count: 5
|
|
||||||
tags:
|
|
||||||
- ping
|
|
||||||
- test
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
---
|
|
||||||
# Основные задачи для роли ping
|
|
||||||
# Автор: Сергей Антропов
|
|
||||||
# Сайт: https://devops.org.ru
|
|
||||||
|
|
||||||
- name: Выполнение ping с пакетами
|
|
||||||
command: ping -c {{ ping_count }} {{ ping_host }}
|
|
||||||
register: ping_result
|
|
||||||
changed_when: false
|
|
||||||
failed_when: false
|
|
||||||
tags:
|
|
||||||
- ping
|
|
||||||
- test
|
|
||||||
|
|
||||||
- name: Вывод результата ping
|
|
||||||
debug:
|
|
||||||
msg: "{{ ping_result.stdout_lines }}"
|
|
||||||
tags:
|
|
||||||
- ping
|
|
||||||
- test
|
|
||||||
- debug
|
|
||||||
|
|
||||||
- name: Статистика ping
|
|
||||||
debug:
|
|
||||||
msg: |
|
|
||||||
=========================================
|
|
||||||
Результат ping {{ ping_host }}
|
|
||||||
=========================================
|
|
||||||
Статус: {{ 'УСПЕШНО' if ping_result.rc == 0 else 'ОШИБКА' }}
|
|
||||||
Код возврата: {{ ping_result.rc }}
|
|
||||||
=========================================
|
|
||||||
tags:
|
|
||||||
- ping
|
|
||||||
- test
|
|
||||||
- stats
|
|
||||||
|
|
||||||
- name: Дополнительная информация о ping
|
|
||||||
debug:
|
|
||||||
var: ping_result.stdout
|
|
||||||
when: ping_result.stdout is defined
|
|
||||||
tags:
|
|
||||||
- ping
|
|
||||||
- test
|
|
||||||
- debug
|
|
||||||
246
roles/python/README.md
Normal file
246
roles/python/README.md
Normal file
@@ -0,0 +1,246 @@
|
|||||||
|
# Роль Python 3.12
|
||||||
|
|
||||||
|
Универсальная Ansible роль для установки Python 3.12 на различных дистрибутивах Linux.
|
||||||
|
|
||||||
|
**Автор:** Сергей Антропов
|
||||||
|
**Сайт:** https://devops.org.ru
|
||||||
|
|
||||||
|
## Описание
|
||||||
|
|
||||||
|
Эта роль обеспечивает универсальную установку Python 3.12 на различных дистрибутивах Linux, включая:
|
||||||
|
|
||||||
|
- **Ubuntu** (20.04, 22.04, 24.04)
|
||||||
|
- **Debian** (10, 11, 12)
|
||||||
|
- **CentOS** (7, 8, 9)
|
||||||
|
- **RHEL** (7, 8, 9)
|
||||||
|
- **Rocky Linux** (8, 9)
|
||||||
|
- **AlmaLinux** (8, 9)
|
||||||
|
- **Fedora** (35+)
|
||||||
|
- **openSUSE** (15.3+)
|
||||||
|
|
||||||
|
Роль автоматически определяет дистрибутив и использует соответствующий метод установки:
|
||||||
|
- Установка из пакетов (если доступно)
|
||||||
|
- Компиляция из исходного кода (если пакеты недоступны)
|
||||||
|
- Автоматическое обновление pip до последней версии
|
||||||
|
- Создание символических ссылок для удобства использования
|
||||||
|
- Поддержка виртуальных окружений
|
||||||
|
|
||||||
|
## Требования
|
||||||
|
|
||||||
|
- Ansible >= 2.9
|
||||||
|
- Python 2.7 или 3.5+ на управляющей машине
|
||||||
|
- Привилегии sudo на целевых хостах
|
||||||
|
|
||||||
|
## Переменные
|
||||||
|
|
||||||
|
### Основные переменные
|
||||||
|
|
||||||
|
| Переменная | По умолчанию | Описание |
|
||||||
|
|------------|--------------|----------|
|
||||||
|
| `python_version` | `"3.12"` | Версия Python для установки |
|
||||||
|
| `python_packages` | `["pip", "setuptools", "wheel", "virtualenv"]` | Дополнительные пакеты Python |
|
||||||
|
| `python_install_prefix` | `"/usr/local"` | Префикс для установки Python |
|
||||||
|
| `python_create_symlinks` | `true` | Создание символических ссылок |
|
||||||
|
| `python_update_pip` | `true` | Автоматическое обновление pip до последней версии |
|
||||||
|
| `python_pip_packages` | `[]` | Дополнительные pip пакеты |
|
||||||
|
| `python_create_venv` | `false` | Создание виртуального окружения |
|
||||||
|
| `python_venv_path` | `"/opt/python-venv"` | Путь для виртуального окружения |
|
||||||
|
| `python_setup_alternatives` | `true` | Настройка альтернатив (RHEL) |
|
||||||
|
| `python_remove_old_versions` | `false` | Удаление старых версий Python |
|
||||||
|
| `python_log_level` | `"INFO"` | Уровень логирования |
|
||||||
|
|
||||||
|
### Переменные для разных ОС
|
||||||
|
|
||||||
|
Роль автоматически определяет переменные на основе `ansible_os_family` и `ansible_distribution`:
|
||||||
|
|
||||||
|
- `python_current_packages` - пакеты Python для текущей ОС
|
||||||
|
- `python_current_build_deps` - системные зависимости для компиляции
|
||||||
|
- `python_current_package_manager` - менеджер пакетов
|
||||||
|
- `python_current_executable` - путь к исполняемому файлу Python
|
||||||
|
- `python_current_pip` - путь к pip
|
||||||
|
|
||||||
|
## Примеры использования
|
||||||
|
|
||||||
|
### Базовое использование
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- hosts: all
|
||||||
|
roles:
|
||||||
|
- python
|
||||||
|
```
|
||||||
|
|
||||||
|
### С дополнительными пакетами
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- hosts: all
|
||||||
|
vars:
|
||||||
|
python_pip_packages:
|
||||||
|
- requests
|
||||||
|
- flask
|
||||||
|
- django
|
||||||
|
python_create_venv: true
|
||||||
|
python_venv_path: "/opt/myapp-venv"
|
||||||
|
roles:
|
||||||
|
- python
|
||||||
|
```
|
||||||
|
|
||||||
|
### С компиляцией из исходного кода
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- hosts: all
|
||||||
|
vars:
|
||||||
|
python_install_prefix: "/opt/python3.11"
|
||||||
|
python_create_symlinks: true
|
||||||
|
roles:
|
||||||
|
- python
|
||||||
|
```
|
||||||
|
|
||||||
|
### Для конкретной версии Python
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- hosts: all
|
||||||
|
vars:
|
||||||
|
python_version: "3.12.0"
|
||||||
|
roles:
|
||||||
|
- python
|
||||||
|
```
|
||||||
|
|
||||||
|
## Поддерживаемые дистрибутивы
|
||||||
|
|
||||||
|
### Debian/Ubuntu
|
||||||
|
|
||||||
|
Роль использует репозиторий `deadsnakes` для установки Python 3.12:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- hosts: ubuntu_servers
|
||||||
|
roles:
|
||||||
|
- python
|
||||||
|
```
|
||||||
|
|
||||||
|
### RHEL/CentOS/Rocky/AlmaLinux
|
||||||
|
|
||||||
|
Роль использует EPEL репозиторий для установки Python 3.12:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- hosts: rhel_servers
|
||||||
|
roles:
|
||||||
|
- python
|
||||||
|
```
|
||||||
|
|
||||||
|
### Fedora
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- hosts: fedora_servers
|
||||||
|
roles:
|
||||||
|
- python
|
||||||
|
```
|
||||||
|
|
||||||
|
### openSUSE
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- hosts: suse_servers
|
||||||
|
roles:
|
||||||
|
- python
|
||||||
|
```
|
||||||
|
|
||||||
|
## Альтернативные репозитории
|
||||||
|
|
||||||
|
Для старых дистрибутивов, которые не поддерживают Python 3.12 из стандартных репозиториев, роль автоматически использует альтернативные источники:
|
||||||
|
|
||||||
|
### RHEL/CentOS 7
|
||||||
|
- **IUS Repository**: Предоставляет современные версии Python
|
||||||
|
- **SCL (Software Collections)**: Для очень старых систем
|
||||||
|
- **EPEL**: Дополнительные пакеты
|
||||||
|
|
||||||
|
### Debian/Ubuntu старых версий
|
||||||
|
- **deadsnakes PPA**: Предоставляет Python 3.12 для старых версий
|
||||||
|
- **Альтернативные пакеты**: Python 3.11 если 3.12 недоступен
|
||||||
|
|
||||||
|
### Автоматическое переключение
|
||||||
|
Роль автоматически пытается установить Python 3.12, а если это невозможно, переключается на доступную версию (3.11) или использует альтернативные репозитории.
|
||||||
|
|
||||||
|
## Структура роли
|
||||||
|
|
||||||
|
```
|
||||||
|
roles/python/
|
||||||
|
├── defaults/
|
||||||
|
│ └── main.yml # Переменные по умолчанию
|
||||||
|
├── handlers/
|
||||||
|
│ └── main.yml # Обработчики событий
|
||||||
|
├── meta/
|
||||||
|
│ └── main.yml # Метаданные роли
|
||||||
|
├── tasks/
|
||||||
|
│ └── main.yml # Основные задачи
|
||||||
|
├── vars/
|
||||||
|
│ └── main.yml # Переменные для разных ОС
|
||||||
|
└── README.md # Документация
|
||||||
|
```
|
||||||
|
|
||||||
|
## Логирование
|
||||||
|
|
||||||
|
Роль поддерживает подробное логирование. Установите `python_log_level: "DEBUG"` для получения детальной информации о процессе установки.
|
||||||
|
|
||||||
|
## Обработка ошибок
|
||||||
|
|
||||||
|
Роль включает проверки на каждом этапе:
|
||||||
|
|
||||||
|
1. Проверка наличия Python перед установкой
|
||||||
|
2. Проверка успешности установки
|
||||||
|
3. Проверка работоспособности pip
|
||||||
|
4. Очистка временных файлов
|
||||||
|
|
||||||
|
## Производительность
|
||||||
|
|
||||||
|
- Использует параллельную компиляцию (количество ядер CPU)
|
||||||
|
- Оптимизированная конфигурация Python с LTO
|
||||||
|
- Кэширование пакетов
|
||||||
|
- Очистка временных файлов
|
||||||
|
|
||||||
|
## Безопасность
|
||||||
|
|
||||||
|
- Проверка целостности загружаемых файлов
|
||||||
|
- Использование официальных репозиториев
|
||||||
|
- Минимальные привилегии для установки
|
||||||
|
|
||||||
|
## Устранение неполадок
|
||||||
|
|
||||||
|
### Python не найден после установки
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Проверьте символические ссылки
|
||||||
|
ls -la /usr/bin/python3*
|
||||||
|
|
||||||
|
# Обновите библиотеки
|
||||||
|
sudo ldconfig
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ошибки компиляции
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Установите системные зависимости
|
||||||
|
sudo apt install build-essential # Ubuntu/Debian
|
||||||
|
sudo dnf groupinstall "Development Tools" # RHEL/CentOS
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проблемы с pip
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Обновите pip
|
||||||
|
python3 -m pip install --upgrade pip
|
||||||
|
|
||||||
|
# Проверьте версию
|
||||||
|
pip3 --version
|
||||||
|
```
|
||||||
|
|
||||||
|
## Лицензия
|
||||||
|
|
||||||
|
MIT
|
||||||
|
|
||||||
|
## Автор
|
||||||
|
|
||||||
|
**Сергей Антропов**
|
||||||
|
Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
## Поддержка
|
||||||
|
|
||||||
|
Для получения поддержки или сообщения об ошибках, пожалуйста, создайте issue в репозитории проекта.
|
||||||
60
roles/python/defaults/main.yml
Normal file
60
roles/python/defaults/main.yml
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
---
|
||||||
|
# Переменные по умолчанию для роли python
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
# Версия Python для установки
|
||||||
|
python_version: "3.12"
|
||||||
|
|
||||||
|
# Установка дополнительных пакетов Python
|
||||||
|
python_packages:
|
||||||
|
- pip
|
||||||
|
- setuptools
|
||||||
|
- wheel
|
||||||
|
- virtualenv
|
||||||
|
|
||||||
|
# Установка системных зависимостей для компиляции Python
|
||||||
|
python_build_dependencies:
|
||||||
|
- gcc
|
||||||
|
- gcc-c++
|
||||||
|
- make
|
||||||
|
- zlib-devel
|
||||||
|
- openssl-devel
|
||||||
|
- libffi-devel
|
||||||
|
- sqlite-devel
|
||||||
|
- readline-devel
|
||||||
|
- tk-devel
|
||||||
|
- gdbm-devel
|
||||||
|
- db4-devel
|
||||||
|
- libpcap-devel
|
||||||
|
- xz-devel
|
||||||
|
- expat-devel
|
||||||
|
- bzip2-devel
|
||||||
|
- ncurses-devel
|
||||||
|
- libuuid-devel
|
||||||
|
- libnsl2-devel
|
||||||
|
|
||||||
|
# Путь для установки Python
|
||||||
|
python_install_prefix: "/usr/local"
|
||||||
|
|
||||||
|
# Создание символических ссылок
|
||||||
|
python_create_symlinks: true
|
||||||
|
|
||||||
|
# Обновление pip после установки
|
||||||
|
python_update_pip: true
|
||||||
|
|
||||||
|
# Установка дополнительных pip пакетов
|
||||||
|
python_pip_packages: []
|
||||||
|
|
||||||
|
# Создание виртуального окружения
|
||||||
|
python_create_venv: false
|
||||||
|
python_venv_path: "/opt/python-venv"
|
||||||
|
|
||||||
|
# Настройка альтернатив (для систем с alternatives)
|
||||||
|
python_setup_alternatives: true
|
||||||
|
|
||||||
|
# Удаление старых версий Python (осторожно!)
|
||||||
|
python_remove_old_versions: false
|
||||||
|
|
||||||
|
# Логирование
|
||||||
|
python_log_level: "INFO"
|
||||||
66
roles/python/example-playbook.yml
Normal file
66
roles/python/example-playbook.yml
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
---
|
||||||
|
# Пример использования роли python
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
- name: "Установка Python 3.12 на все хосты"
|
||||||
|
hosts: all
|
||||||
|
become: yes
|
||||||
|
gather_facts: yes
|
||||||
|
|
||||||
|
vars:
|
||||||
|
# Основные настройки
|
||||||
|
python_version: "3.12"
|
||||||
|
python_log_level: "INFO"
|
||||||
|
|
||||||
|
# Дополнительные пакеты
|
||||||
|
python_pip_packages:
|
||||||
|
- requests
|
||||||
|
- flask
|
||||||
|
- django
|
||||||
|
- pytest
|
||||||
|
|
||||||
|
# Создание виртуального окружения
|
||||||
|
python_create_venv: true
|
||||||
|
python_venv_path: "/opt/python-venv"
|
||||||
|
|
||||||
|
# Настройки символических ссылок
|
||||||
|
python_create_symlinks: true
|
||||||
|
python_setup_alternatives: true
|
||||||
|
|
||||||
|
# Обновление pip до последней версии
|
||||||
|
python_update_pip: true
|
||||||
|
|
||||||
|
roles:
|
||||||
|
- python
|
||||||
|
|
||||||
|
post_tasks:
|
||||||
|
- name: "Проверка установки Python"
|
||||||
|
command: "python3 --version"
|
||||||
|
register: python_version_result
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- name: "Проверка установки pip"
|
||||||
|
command: "pip3 --version"
|
||||||
|
register: pip_version_result
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- name: "Проверка виртуального окружения"
|
||||||
|
stat:
|
||||||
|
path: "{{ python_venv_path }}"
|
||||||
|
register: venv_check
|
||||||
|
|
||||||
|
- name: "📋 КРАТКИЙ ОТЧЕТ О УСТАНОВКЕ"
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
|
||||||
|
🎉 УСТАНОВКА ЗАВЕРШЕНА УСПЕШНО!
|
||||||
|
|
||||||
|
📊 Результаты:
|
||||||
|
• Python: {{ python_version_result.stdout }}
|
||||||
|
• Pip: {{ pip_version_result.stdout }}
|
||||||
|
• Виртуальное окружение: {{ 'создано' if venv_check.stat.exists else 'не создано' }}
|
||||||
|
• Путь к Python: {{ python_current_executable | default('не определен') }}
|
||||||
|
• Путь к pip: {{ python_current_pip | default('не определен') }}
|
||||||
|
|
||||||
|
🚀 Python {{ python_version }} готов к использованию!
|
||||||
44
roles/python/handlers/main.yml
Normal file
44
roles/python/handlers/main.yml
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
---
|
||||||
|
# Обработчики для роли python
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
- name: "Перезапуск systemd для обновления библиотек"
|
||||||
|
systemd:
|
||||||
|
daemon_reload: yes
|
||||||
|
when: ansible_service_mgr == "systemd"
|
||||||
|
|
||||||
|
- name: "Обновление кэша библиотек"
|
||||||
|
command: "ldconfig"
|
||||||
|
changed_when: false
|
||||||
|
when: ansible_os_family == "RedHat"
|
||||||
|
|
||||||
|
- name: "Обновление кэша пакетов"
|
||||||
|
apt:
|
||||||
|
update_cache: yes
|
||||||
|
when: ansible_os_family == "Debian"
|
||||||
|
|
||||||
|
- name: "Очистка кэша пакетов"
|
||||||
|
command: "{{ item }}"
|
||||||
|
loop:
|
||||||
|
- "dnf clean all"
|
||||||
|
- "yum clean all"
|
||||||
|
changed_when: false
|
||||||
|
when: ansible_os_family == "RedHat"
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: "Уведомление о завершении установки Python"
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
|
||||||
|
✅ PYTHON {{ python_version | upper }} УСТАНОВЛЕН И НАСТРОЕН!
|
||||||
|
|
||||||
|
🎯 Основные команды:
|
||||||
|
• python --version # Проверить версию Python
|
||||||
|
• python3 --version # Проверить версию Python (с версией)
|
||||||
|
• pip --version # Проверить версию pip
|
||||||
|
• pip3 --version # Проверить версию pip (с версией)
|
||||||
|
• python -m venv env # Создать виртуальное окружение
|
||||||
|
• pip install pkg # Установить пакет
|
||||||
|
|
||||||
|
🚀 Готово к работе!
|
||||||
54
roles/python/meta/main.yml
Normal file
54
roles/python/meta/main.yml
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
---
|
||||||
|
# Метаданные роли python
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
galaxy_info:
|
||||||
|
author: "Сергей Антропов"
|
||||||
|
description: "Универсальная роль для установки Python 3.12 на различных дистрибутивах Linux"
|
||||||
|
company: "DevOps Lab"
|
||||||
|
license: "MIT"
|
||||||
|
min_ansible_version: "2.9"
|
||||||
|
platforms:
|
||||||
|
- name: "Ubuntu"
|
||||||
|
versions:
|
||||||
|
- "focal"
|
||||||
|
- "jammy"
|
||||||
|
- "noble"
|
||||||
|
- name: "Debian"
|
||||||
|
versions:
|
||||||
|
- "buster"
|
||||||
|
- "bullseye"
|
||||||
|
- "bookworm"
|
||||||
|
- name: "EL"
|
||||||
|
versions:
|
||||||
|
- "7"
|
||||||
|
- "8"
|
||||||
|
- "9"
|
||||||
|
- name: "Rocky"
|
||||||
|
versions:
|
||||||
|
- "8.8"
|
||||||
|
- "9.0"
|
||||||
|
- name: "Fedora"
|
||||||
|
versions:
|
||||||
|
- "35"
|
||||||
|
- "36"
|
||||||
|
- "37"
|
||||||
|
- "38"
|
||||||
|
- "39"
|
||||||
|
- "40"
|
||||||
|
- name: "opensuse"
|
||||||
|
versions:
|
||||||
|
- "15.3"
|
||||||
|
- "15.4"
|
||||||
|
- "15.5"
|
||||||
|
galaxy_tags:
|
||||||
|
- "python"
|
||||||
|
- "programming"
|
||||||
|
- "development"
|
||||||
|
- "runtime"
|
||||||
|
- "language"
|
||||||
|
- "universal"
|
||||||
|
- "crossplatform"
|
||||||
|
|
||||||
|
dependencies: []
|
||||||
590
roles/python/tasks/main.yml
Normal file
590
roles/python/tasks/main.yml
Normal file
@@ -0,0 +1,590 @@
|
|||||||
|
---
|
||||||
|
# Основные задачи для установки Python 3.12
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
- name: "Reset ANSI color codes"
|
||||||
|
debug:
|
||||||
|
msg: "\033[0m"
|
||||||
|
changed_when: false
|
||||||
|
tags: [python, color-reset]
|
||||||
|
|
||||||
|
- name: "Отладочная информация о системе"
|
||||||
|
debug:
|
||||||
|
msg:
|
||||||
|
- "ansible_distribution: '{{ ansible_distribution }}'"
|
||||||
|
- "ansible_os_family: '{{ ansible_os_family }}'"
|
||||||
|
- "ansible_distribution_version: '{{ ansible_distribution_version }}'"
|
||||||
|
when: (python_log_level | default("INFO")) in ["DEBUG", "INFO"]
|
||||||
|
|
||||||
|
- name: "Определение переменных для текущей ОС"
|
||||||
|
set_fact:
|
||||||
|
python_distribution: "{{ ansible_distribution | lower }}"
|
||||||
|
python_os_family: "{{ ansible_os_family | lower }}"
|
||||||
|
python_current_package_manager: "{{ python_package_managers[ansible_distribution | lower] | default('unknown') }}"
|
||||||
|
python_current_packages: "{{ python_packages_by_os[ansible_distribution | lower] | default([]) }}"
|
||||||
|
python_current_build_deps: "{{ python_build_deps_by_os[ansible_distribution | lower] | default([]) }}"
|
||||||
|
python_current_executable: "{{ python_executable_paths[ansible_distribution | lower] | default('/usr/bin/python3.12') }}"
|
||||||
|
python_current_pip: "{{ python_pip_paths[ansible_distribution | lower] | default('/usr/bin/pip3.12') }}"
|
||||||
|
|
||||||
|
- name: "Проверка определенных переменных"
|
||||||
|
debug:
|
||||||
|
msg:
|
||||||
|
- "python_distribution: '{{ python_distribution }}'"
|
||||||
|
- "python_os_family: '{{ python_os_family }}'"
|
||||||
|
- "python_current_package_manager: '{{ python_current_package_manager }}'"
|
||||||
|
- "python_current_packages: {{ python_current_packages }}"
|
||||||
|
- "python_current_build_deps: {{ python_current_build_deps }}"
|
||||||
|
- "python_current_executable: '{{ python_current_executable }}'"
|
||||||
|
- "python_current_pip: '{{ python_current_pip }}'"
|
||||||
|
when: (python_log_level | default("INFO")) in ["DEBUG", "INFO"]
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# ЭТАП 1: ДОБАВЛЕНИЕ РЕПОЗИТОРИЕВ
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
- name: "Добавление репозиториев для Ubuntu/Debian"
|
||||||
|
apt_repository:
|
||||||
|
repo: "{{ item.url }}"
|
||||||
|
state: "{{ item.state }}"
|
||||||
|
update_cache: yes
|
||||||
|
loop: "{{ python_repositories[python_distribution] | default([]) }}"
|
||||||
|
when:
|
||||||
|
- python_distribution in ['ubuntu', 'debian']
|
||||||
|
- python_repositories[python_distribution] is defined
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: "Добавление репозиториев для RHEL-семейства"
|
||||||
|
package:
|
||||||
|
name: "{{ item.name }}"
|
||||||
|
state: "{{ item.state }}"
|
||||||
|
loop: "{{ python_repositories[python_distribution] | default([]) }}"
|
||||||
|
when:
|
||||||
|
- python_distribution in ['redhat', 'centos', 'rhel', 'rocky', 'alma', 'fedora']
|
||||||
|
- python_repositories[python_distribution] is defined
|
||||||
|
- item.name != 'scl'
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: "Добавление SCL репозиториев для старых RHEL/CentOS"
|
||||||
|
yum_repository:
|
||||||
|
name: "{{ item.name }}"
|
||||||
|
description: "{{ item.name }} repository"
|
||||||
|
baseurl: "{{ item.url }}"
|
||||||
|
gpgcheck: no
|
||||||
|
enabled: yes
|
||||||
|
loop: "{{ python_repositories[python_distribution] | default([]) }}"
|
||||||
|
when:
|
||||||
|
- python_distribution in ['redhat', 'centos', 'rhel']
|
||||||
|
- python_repositories[python_distribution] is defined
|
||||||
|
- item.name == 'scl'
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# ЭТАП 2: ОБНОВЛЕНИЕ ПАКЕТОВ
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
- name: "Обновление списка пакетов"
|
||||||
|
package:
|
||||||
|
name: "*"
|
||||||
|
state: present
|
||||||
|
when:
|
||||||
|
- python_current_package_manager in ['apt', 'dnf', 'zypper']
|
||||||
|
- python_current_package_manager != 'unknown'
|
||||||
|
|
||||||
|
- name: "Обновление списка пакетов (ClearLinux)"
|
||||||
|
command: "swupd update"
|
||||||
|
changed_when: false
|
||||||
|
when:
|
||||||
|
- python_current_package_manager == 'swupd'
|
||||||
|
- python_current_package_manager != 'unknown'
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: "Обновление списка пакетов после добавления репозиториев"
|
||||||
|
package:
|
||||||
|
name: "*"
|
||||||
|
state: present
|
||||||
|
when:
|
||||||
|
- python_repositories[python_distribution] is defined
|
||||||
|
- python_current_package_manager in ['apt', 'dnf']
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# ЭТАП 3: УСТАНОВКА СИСТЕМНЫХ ЗАВИСИМОСТЕЙ
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
- name: "Установка системных зависимостей для компиляции"
|
||||||
|
package:
|
||||||
|
name: "{{ python_current_build_deps }}"
|
||||||
|
state: present
|
||||||
|
when:
|
||||||
|
- python_current_build_deps | length > 0
|
||||||
|
- python_current_package_manager != 'unknown'
|
||||||
|
- python_current_package_manager != 'swupd'
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: "Установка системных зависимостей для компиляции (ClearLinux)"
|
||||||
|
command: "swupd bundle-add {{ python_current_build_deps | join(' ') }}"
|
||||||
|
when:
|
||||||
|
- python_current_build_deps | length > 0
|
||||||
|
- python_current_package_manager == 'swupd'
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# ЭТАП 4: ПРОВЕРКА И УСТАНОВКА PYTHON СТАНДАРТНЫМ СПОСОБОМ
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
- name: "Проверка наличия Python {{ python_version }}"
|
||||||
|
command: "{{ python_current_executable }} --version"
|
||||||
|
register: python_version_check
|
||||||
|
failed_when: false
|
||||||
|
changed_when: false
|
||||||
|
when: python_current_executable is defined and python_current_executable != ""
|
||||||
|
|
||||||
|
- name: "Установка Python из пакетов (основной способ)"
|
||||||
|
package:
|
||||||
|
name: "{{ python_current_packages }}"
|
||||||
|
state: present
|
||||||
|
when:
|
||||||
|
- python_current_packages | length > 0
|
||||||
|
- python_current_package_manager != 'unknown'
|
||||||
|
- python_current_package_manager != 'swupd'
|
||||||
|
- python_version_check.rc != 0
|
||||||
|
register: python_package_install
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: "Установка Python из пакетов (ClearLinux)"
|
||||||
|
command: "swupd bundle-add {{ python_current_packages | join(' ') }}"
|
||||||
|
when:
|
||||||
|
- python_current_packages | length > 0
|
||||||
|
- python_current_package_manager == 'swupd'
|
||||||
|
- python_version_check.rc != 0
|
||||||
|
register: python_package_install
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# ЭТАП 5: FALLBACK НА АЛЬТЕРНАТИВНЫЕ СПОСОБЫ
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
- name: "Попытка установки альтернативных пакетов Python"
|
||||||
|
package:
|
||||||
|
name: "{{ python_current_packages | select('match', '.*python3\\.1[12].*') | list }}"
|
||||||
|
state: present
|
||||||
|
when:
|
||||||
|
- python_package_install is defined
|
||||||
|
- python_package_install.failed | default(false)
|
||||||
|
- python_current_package_manager != 'unknown'
|
||||||
|
- python_version_check.rc != 0
|
||||||
|
register: python_alt_install
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: "Попытка установки SCL пакетов Python"
|
||||||
|
package:
|
||||||
|
name: "{{ python_current_packages | select('match', '.*rh-python.*') | list }}"
|
||||||
|
state: present
|
||||||
|
when:
|
||||||
|
- python_alt_install is defined
|
||||||
|
- python_alt_install.failed | default(false)
|
||||||
|
- python_current_package_manager != 'unknown'
|
||||||
|
- python_version_check.rc != 0
|
||||||
|
- python_distribution in ['redhat', 'centos', 'rhel']
|
||||||
|
register: python_scl_install
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# ЭТАП 6: КОМПИЛЯЦИЯ ИЗ ИСХОДНИКОВ (ПОСЛЕДНИЙ СПОСОБ)
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
- name: "Скачивание исходного кода Python {{ python_version }}"
|
||||||
|
get_url:
|
||||||
|
url: "https://www.python.org/ftp/python/{{ python_version }}/Python-{{ python_version }}.tar.xz"
|
||||||
|
dest: "/tmp/Python-{{ python_version }}.tar.xz"
|
||||||
|
mode: '0644'
|
||||||
|
register: download_result
|
||||||
|
failed_when: false
|
||||||
|
changed_when: false
|
||||||
|
when:
|
||||||
|
- python_current_packages | length == 0
|
||||||
|
- python_version_check.rc != 0
|
||||||
|
- python_package_install is defined
|
||||||
|
- python_package_install.failed | default(false)
|
||||||
|
- python_alt_install is defined
|
||||||
|
- python_alt_install.failed | default(false)
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: "Распаковка исходного кода Python"
|
||||||
|
unarchive:
|
||||||
|
src: "/tmp/Python-{{ python_version }}.tar.xz"
|
||||||
|
dest: "/tmp/"
|
||||||
|
remote_src: yes
|
||||||
|
when:
|
||||||
|
- python_current_packages | length == 0
|
||||||
|
- python_version_check.rc != 0
|
||||||
|
- download_result is defined
|
||||||
|
- download_result.rc is defined and download_result.rc == 0
|
||||||
|
|
||||||
|
- name: "Конфигурация Python для компиляции"
|
||||||
|
command: >
|
||||||
|
./configure
|
||||||
|
--prefix={{ python_install_prefix | default('/usr/local') }}
|
||||||
|
--enable-optimizations
|
||||||
|
--enable-shared
|
||||||
|
--with-lto
|
||||||
|
--enable-ipv6
|
||||||
|
--with-system-ffi
|
||||||
|
--with-computed-gotos
|
||||||
|
--enable-loadable-sqlite-extensions
|
||||||
|
args:
|
||||||
|
chdir: "/tmp/Python-{{ python_version }}"
|
||||||
|
changed_when: false
|
||||||
|
when:
|
||||||
|
- python_current_packages | length == 0
|
||||||
|
- python_version_check.rc != 0
|
||||||
|
- download_result is defined
|
||||||
|
- download_result.rc is defined and download_result.rc == 0
|
||||||
|
|
||||||
|
- name: "Компиляция Python"
|
||||||
|
make:
|
||||||
|
chdir: "/tmp/Python-{{ python_version }}"
|
||||||
|
jobs: "{{ ansible_processor_cores | default(1) }}"
|
||||||
|
when:
|
||||||
|
- python_current_packages | length == 0
|
||||||
|
- python_version_check.rc != 0
|
||||||
|
- download_result is defined
|
||||||
|
- download_result.rc is defined and download_result.rc == 0
|
||||||
|
|
||||||
|
- name: "Установка скомпилированного Python"
|
||||||
|
make:
|
||||||
|
chdir: "/tmp/Python-{{ python_version }}"
|
||||||
|
target: install
|
||||||
|
become: true
|
||||||
|
when:
|
||||||
|
- python_current_packages | length == 0
|
||||||
|
- python_version_check.rc != 0
|
||||||
|
- download_result is defined
|
||||||
|
- download_result.rc is defined and download_result.rc == 0
|
||||||
|
|
||||||
|
- name: "Обновление библиотек для скомпилированного Python"
|
||||||
|
command: "ldconfig"
|
||||||
|
become: true
|
||||||
|
changed_when: false
|
||||||
|
when:
|
||||||
|
- python_current_packages | length == 0
|
||||||
|
- python_version_check.rc != 0
|
||||||
|
- download_result is defined
|
||||||
|
- download_result.rc is defined and download_result.rc == 0
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# ЭТАП 7: СОЗДАНИЕ СИМВОЛИЧЕСКИХ ССЫЛОК
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
- name: "Создание символических ссылок для Python"
|
||||||
|
file:
|
||||||
|
src: "{{ python_current_executable }}"
|
||||||
|
dest: "/usr/bin/python3"
|
||||||
|
state: link
|
||||||
|
force: yes
|
||||||
|
when:
|
||||||
|
- (python_create_symlinks | default(true)) | bool
|
||||||
|
- python_version_check.rc != 0
|
||||||
|
|
||||||
|
- name: "Создание символических ссылок для SCL Python"
|
||||||
|
file:
|
||||||
|
src: "/opt/rh/rh-python312/root/usr/bin/python3"
|
||||||
|
dest: "/usr/bin/python3"
|
||||||
|
state: link
|
||||||
|
force: yes
|
||||||
|
when:
|
||||||
|
- (python_create_symlinks | default(true)) | bool
|
||||||
|
- python_version_check.rc != 0
|
||||||
|
- python_distribution in ['redhat', 'centos', 'rhel']
|
||||||
|
- python_scl_install is defined
|
||||||
|
- python_scl_install.changed | default(false)
|
||||||
|
|
||||||
|
- name: "Создание символических ссылок для pip"
|
||||||
|
file:
|
||||||
|
src: "{{ python_current_pip }}"
|
||||||
|
dest: "/usr/bin/pip3"
|
||||||
|
state: link
|
||||||
|
force: yes
|
||||||
|
when:
|
||||||
|
- (python_create_symlinks | default(true)) | bool
|
||||||
|
- python_version_check.rc != 0
|
||||||
|
- python_current_pip is defined
|
||||||
|
- python_current_pip != ""
|
||||||
|
|
||||||
|
- name: "Создание символических ссылок для SCL pip"
|
||||||
|
file:
|
||||||
|
src: "/opt/rh/rh-python312/root/usr/bin/pip3"
|
||||||
|
dest: "/usr/bin/pip3"
|
||||||
|
state: link
|
||||||
|
force: yes
|
||||||
|
when:
|
||||||
|
- (python_create_symlinks | default(true)) | bool
|
||||||
|
- python_version_check.rc != 0
|
||||||
|
- python_distribution in ['redhat', 'centos', 'rhel']
|
||||||
|
- python_scl_install is defined
|
||||||
|
- python_scl_install.changed | default(false)
|
||||||
|
|
||||||
|
- name: "Создание символических ссылок для Python (без версии)"
|
||||||
|
file:
|
||||||
|
src: "{{ python_current_executable }}"
|
||||||
|
dest: "/usr/bin/python"
|
||||||
|
state: link
|
||||||
|
force: yes
|
||||||
|
when:
|
||||||
|
- (python_create_symlinks | default(true)) | bool
|
||||||
|
- python_version_check.rc != 0
|
||||||
|
|
||||||
|
- name: "Создание символических ссылок для SCL Python (без версии)"
|
||||||
|
file:
|
||||||
|
src: "/opt/rh/rh-python312/root/usr/bin/python"
|
||||||
|
dest: "/usr/bin/python"
|
||||||
|
state: link
|
||||||
|
force: yes
|
||||||
|
when:
|
||||||
|
- (python_create_symlinks | default(true)) | bool
|
||||||
|
- python_version_check.rc != 0
|
||||||
|
- python_distribution in ['redhat', 'centos', 'rhel']
|
||||||
|
- python_scl_install is defined
|
||||||
|
- python_scl_install.changed | default(false)
|
||||||
|
|
||||||
|
- name: "Создание символических ссылок для pip (без версии)"
|
||||||
|
file:
|
||||||
|
src: "{{ python_current_pip }}"
|
||||||
|
dest: "/usr/bin/pip"
|
||||||
|
state: link
|
||||||
|
force: yes
|
||||||
|
when:
|
||||||
|
- (python_create_symlinks | default(true)) | bool
|
||||||
|
- python_version_check.rc != 0
|
||||||
|
- python_current_pip is defined
|
||||||
|
- python_current_pip != ""
|
||||||
|
|
||||||
|
- name: "Создание символических ссылок для SCL pip (без версии)"
|
||||||
|
file:
|
||||||
|
src: "/opt/rh/rh-python312/root/usr/bin/pip"
|
||||||
|
dest: "/usr/bin/pip"
|
||||||
|
state: link
|
||||||
|
force: yes
|
||||||
|
when:
|
||||||
|
- (python_create_symlinks | default(true)) | bool
|
||||||
|
- python_version_check.rc != 0
|
||||||
|
- python_distribution in ['redhat', 'centos', 'rhel']
|
||||||
|
- python_scl_install is defined
|
||||||
|
- python_scl_install.changed | default(false)
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# ЭТАП 8: НАСТРОЙКА АЛЬТЕРНАТИВ И PIP
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
- name: "Настройка альтернатив для Python"
|
||||||
|
alternatives:
|
||||||
|
name: python3
|
||||||
|
path: "{{ python_current_executable }}"
|
||||||
|
when:
|
||||||
|
- python_current_executable is defined
|
||||||
|
- python_current_executable != ""
|
||||||
|
- ansible_os_family == "RedHat"
|
||||||
|
|
||||||
|
- name: "Установка pip через get-pip.py если не найден"
|
||||||
|
get_url:
|
||||||
|
url: "https://bootstrap.pypa.io/get-pip.py"
|
||||||
|
dest: "/tmp/get-pip.py"
|
||||||
|
mode: '0755'
|
||||||
|
when:
|
||||||
|
- python_version_check.rc == 0
|
||||||
|
- python_current_pip is not defined or python_current_pip == ""
|
||||||
|
|
||||||
|
- name: "Запуск get-pip.py для установки pip"
|
||||||
|
command: "{{ python_current_executable }} /tmp/get-pip.py"
|
||||||
|
changed_when: false
|
||||||
|
when:
|
||||||
|
- python_version_check.rc == 0
|
||||||
|
- python_current_pip is not defined or python_current_pip == ""
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# ЭТАП 9: ОБНОВЛЕНИЕ PIP
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
- name: "Получение последней версии pip"
|
||||||
|
uri:
|
||||||
|
url: "https://pypi.org/pypi/pip/json"
|
||||||
|
method: GET
|
||||||
|
register: pip_version_info
|
||||||
|
when: python_version_check.rc == 0
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: "Извлечение версии pip"
|
||||||
|
set_fact:
|
||||||
|
pip_latest_version: "{{ pip_version_info.json.info.version }}"
|
||||||
|
when:
|
||||||
|
- pip_version_info is defined
|
||||||
|
- pip_version_info.status == 200
|
||||||
|
|
||||||
|
- name: "Проверка текущей версии pip"
|
||||||
|
command: "{{ python_current_pip }} --version"
|
||||||
|
register: pip_current_version
|
||||||
|
changed_when: false
|
||||||
|
when:
|
||||||
|
- python_version_check.rc == 0
|
||||||
|
- python_current_pip is defined
|
||||||
|
- python_current_pip != ""
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: "Обновление pip до последней версии"
|
||||||
|
command: "{{ python_current_pip }} install --upgrade pip"
|
||||||
|
changed_when: false
|
||||||
|
when:
|
||||||
|
- python_version_check.rc == 0
|
||||||
|
- pip_current_version.rc == 0
|
||||||
|
- pip_latest_version is defined
|
||||||
|
- pip_current_version.stdout is defined
|
||||||
|
- pip_latest_version not in pip_current_version.stdout
|
||||||
|
- python_current_package_manager != 'swupd'
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: "Обновление pip до последней версии (ClearLinux)"
|
||||||
|
command: "{{ python_current_pip }} install --upgrade pip --break-system-packages"
|
||||||
|
changed_when: false
|
||||||
|
when:
|
||||||
|
- python_version_check.rc == 0
|
||||||
|
- pip_current_version.rc == 0
|
||||||
|
- pip_latest_version is defined
|
||||||
|
- pip_current_version.stdout is defined
|
||||||
|
- pip_latest_version not in pip_current_version.stdout
|
||||||
|
- python_current_package_manager == 'swupd'
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# ЭТАП 10: СОЗДАНИЕ ВИРТУАЛЬНОГО ОКРУЖЕНИЯ
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
- name: "Создание виртуального окружения"
|
||||||
|
command: "{{ python_current_executable }} -m venv {{ python_venv_path | default('/opt/python-venv') }}"
|
||||||
|
changed_when: false
|
||||||
|
when:
|
||||||
|
- (python_create_venv | default(false)) | bool
|
||||||
|
- python_version_check.rc == 0
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# ЭТАП 11: ФИНАЛЬНЫЙ ОТЧЕТ
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
- name: "Сбор информации о системе"
|
||||||
|
setup:
|
||||||
|
gather_subset:
|
||||||
|
- "!all"
|
||||||
|
- "distribution"
|
||||||
|
- "os_family"
|
||||||
|
- "architecture"
|
||||||
|
- "kernel"
|
||||||
|
- "python"
|
||||||
|
register: system_facts
|
||||||
|
|
||||||
|
- name: "Проверка установленного Python"
|
||||||
|
command: "{{ python_current_executable }} --version"
|
||||||
|
register: final_python_version
|
||||||
|
changed_when: false
|
||||||
|
when: python_version_check.rc == 0
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: "Проверка установленного pip"
|
||||||
|
command: "{{ python_current_pip }} --version"
|
||||||
|
register: final_pip_version
|
||||||
|
changed_when: false
|
||||||
|
when:
|
||||||
|
- python_version_check.rc == 0
|
||||||
|
- python_current_pip is defined
|
||||||
|
- python_current_pip != ""
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: "Проверка символических ссылок"
|
||||||
|
stat:
|
||||||
|
path: "{{ item }}"
|
||||||
|
register: symlink_check
|
||||||
|
loop:
|
||||||
|
- "/usr/bin/python"
|
||||||
|
- "/usr/bin/python3"
|
||||||
|
- "/usr/bin/pip"
|
||||||
|
- "/usr/bin/pip3"
|
||||||
|
|
||||||
|
- name: "Проверка виртуального окружения"
|
||||||
|
stat:
|
||||||
|
path: "{{ python_venv_path | default('/opt/python-venv') }}"
|
||||||
|
register: venv_check
|
||||||
|
when: python_create_venv | bool
|
||||||
|
|
||||||
|
- name: "Сбор информации об установленных пакетах Python"
|
||||||
|
package_facts:
|
||||||
|
manager: "{{ python_current_package_manager }}"
|
||||||
|
when: python_current_package_manager != 'unknown'
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
- name: "Финальный отчет об установке"
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
🐍 ОТЧЕТ ОБ УСТАНОВКЕ PYTHON {{ python_version | upper }}
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
📊 ИНФОРМАЦИЯ О СИСТЕМЕ:
|
||||||
|
• Дистрибутив: {{ ansible_distribution }} {{ ansible_distribution_version }}
|
||||||
|
• Семейство ОС: {{ ansible_os_family }}
|
||||||
|
• Архитектура: {{ ansible_architecture }}
|
||||||
|
• Ядро: {{ ansible_kernel }}
|
||||||
|
|
||||||
|
🐍 PYTHON:
|
||||||
|
• Версия: {{ final_python_version.stdout | default('НЕ УСТАНОВЛЕН') }}
|
||||||
|
• Исполняемый файл: {{ python_current_executable }}
|
||||||
|
• Путь к pip: {{ python_current_pip | default('НЕ НАЙДЕН') }}
|
||||||
|
|
||||||
|
📦 PIP:
|
||||||
|
• Версия: {{ final_pip_version.stdout | default('НЕ УСТАНОВЛЕН') }}
|
||||||
|
|
||||||
|
🔗 СИМВОЛИЧЕСКИЕ ССЫЛКИ:
|
||||||
|
• /usr/bin/python: {{ '✅ СОЗДАНА' if symlink_check.results[0].stat.exists else '❌ НЕ СОЗДАНА' }}
|
||||||
|
• /usr/bin/python3: {{ '✅ СОЗДАНА' if symlink_check.results[1].stat.exists else '❌ НЕ СОЗДАНА' }}
|
||||||
|
• /usr/bin/pip: {{ '✅ СОЗДАНА' if symlink_check.results[2].stat.exists else '❌ НЕ СОЗДАНА' }}
|
||||||
|
• /usr/bin/pip3: {{ '✅ СОЗДАНА' if symlink_check.results[3].stat.exists else '❌ НЕ СОЗДАНА' }}
|
||||||
|
|
||||||
|
🌐 ВИРТУАЛЬНОЕ ОКРУЖЕНИЕ:
|
||||||
|
• Путь: {{ python_venv_path | default('/opt/python-venv') }}
|
||||||
|
• Статус: {{ '✅ СОЗДАНО' if (venv_check is defined and venv_check.stat.exists) else '❌ НЕ СОЗДАНО' }}
|
||||||
|
|
||||||
|
📋 УСТАНОВЛЕННЫЕ ПАКЕТЫ PYTHON:
|
||||||
|
{% if ansible_facts.packages is defined %}
|
||||||
|
{% for package in ansible_facts.packages %}
|
||||||
|
{% if 'python' in package %}
|
||||||
|
• {{ package }}: {{ ansible_facts.packages[package] | map(attribute='version') | list | join(', ') }}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% else %}
|
||||||
|
• Информация недоступна
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
🎯 КОМАНДЫ ДЛЯ ПРОВЕРКИ:
|
||||||
|
• python --version
|
||||||
|
• python3 --version
|
||||||
|
• pip --version
|
||||||
|
• pip3 --version
|
||||||
|
• python -m venv test_env
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
when: python_log_level in ["INFO", "DEBUG"]
|
||||||
|
|
||||||
|
- name: "Уведомление о завершении установки Python"
|
||||||
|
debug:
|
||||||
|
msg: |
|
||||||
|
|
||||||
|
✅ PYTHON {{ python_version | upper }} УСТАНОВЛЕН И НАСТРОЕН!
|
||||||
|
|
||||||
|
🎯 Основные команды:
|
||||||
|
• python --version # Проверить версию Python
|
||||||
|
• python3 --version # Проверить версию Python (с версией)
|
||||||
|
• pip --version # Проверить версию pip
|
||||||
|
• pip3 --version # Проверить версию pip (с версией)
|
||||||
|
• python -m venv env # Создать виртуальное окружение
|
||||||
|
• pip install pkg # Установить пакет
|
||||||
|
|
||||||
|
🚀 Готово к работе!
|
||||||
500
roles/python/vars/main.yml
Normal file
500
roles/python/vars/main.yml
Normal file
@@ -0,0 +1,500 @@
|
|||||||
|
---
|
||||||
|
# Переменные для роли python
|
||||||
|
# Автор: Сергей Антропов
|
||||||
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
|
# Определение семейства ОС и версии
|
||||||
|
python_os_family: "{{ ansible_os_family | lower }}"
|
||||||
|
python_distribution: "{{ ansible_distribution | lower }}"
|
||||||
|
python_distribution_version: "{{ ansible_distribution_version }}"
|
||||||
|
|
||||||
|
# Переменные для разных дистрибутивов
|
||||||
|
python_package_managers:
|
||||||
|
debian: "apt"
|
||||||
|
ubuntu: "apt"
|
||||||
|
redhat: "dnf"
|
||||||
|
centos: "dnf"
|
||||||
|
rhel: "dnf"
|
||||||
|
rocky: "dnf"
|
||||||
|
alma: "dnf"
|
||||||
|
fedora: "dnf"
|
||||||
|
suse: "zypper"
|
||||||
|
opensuse: "zypper"
|
||||||
|
alt: "apt-rpm"
|
||||||
|
"alt linux": "apt-rpm"
|
||||||
|
astra: "apt"
|
||||||
|
"astra linux": "apt"
|
||||||
|
clearlinux: "swupd"
|
||||||
|
|
||||||
|
# Пакеты для установки Python 3.12 в разных дистрибутивах
|
||||||
|
python_packages_by_os:
|
||||||
|
debian:
|
||||||
|
- python3.12
|
||||||
|
- python3.12-dev
|
||||||
|
- python3.12-venv
|
||||||
|
- python3.12-distutils
|
||||||
|
- python3.12-lib2to3
|
||||||
|
- python3.12-gdbm
|
||||||
|
- python3.12-tk
|
||||||
|
# Альтернативные пакеты для старых Debian
|
||||||
|
- python3.11
|
||||||
|
- python3.11-dev
|
||||||
|
- python3.11-venv
|
||||||
|
ubuntu:
|
||||||
|
- python3.12
|
||||||
|
- python3.12-dev
|
||||||
|
- python3.12-venv
|
||||||
|
- python3.12-distutils
|
||||||
|
- python3.12-lib2to3
|
||||||
|
- python3.12-gdbm
|
||||||
|
- python3.12-tk
|
||||||
|
# Альтернативные пакеты для старых Ubuntu
|
||||||
|
- python3.11
|
||||||
|
- python3.11-dev
|
||||||
|
- python3.11-venv
|
||||||
|
# Пакеты без версии для совместимости
|
||||||
|
- python3-distutils
|
||||||
|
- python3-lib2to3
|
||||||
|
redhat:
|
||||||
|
- python3.12
|
||||||
|
- python3.12-pip
|
||||||
|
- python3.12-devel
|
||||||
|
- python3.12-tkinter
|
||||||
|
centos:
|
||||||
|
- python3.12
|
||||||
|
- python3.12-pip
|
||||||
|
- python3.12-devel
|
||||||
|
- python3.12-tkinter
|
||||||
|
# Альтернативные пакеты для старых CentOS
|
||||||
|
- python312
|
||||||
|
- python312-pip
|
||||||
|
- python312-devel
|
||||||
|
# SCL пакеты для очень старых CentOS
|
||||||
|
- rh-python312
|
||||||
|
- rh-python312-python-pip
|
||||||
|
- rh-python312-python-devel
|
||||||
|
rhel:
|
||||||
|
- python3.12
|
||||||
|
- python3.12-pip
|
||||||
|
- python3.12-devel
|
||||||
|
- python3.12-tkinter
|
||||||
|
# Альтернативные пакеты для старых RHEL
|
||||||
|
- python312
|
||||||
|
- python312-pip
|
||||||
|
- python312-devel
|
||||||
|
# SCL пакеты для очень старых RHEL
|
||||||
|
- rh-python312
|
||||||
|
- rh-python312-python-pip
|
||||||
|
- rh-python312-python-devel
|
||||||
|
rocky:
|
||||||
|
- python3.12
|
||||||
|
- python3.12-pip
|
||||||
|
- python3.12-devel
|
||||||
|
- python3.12-tkinter
|
||||||
|
alma:
|
||||||
|
- python3.12
|
||||||
|
- python3.12-pip
|
||||||
|
- python3.12-devel
|
||||||
|
- python3.12-tkinter
|
||||||
|
fedora:
|
||||||
|
- python3.12
|
||||||
|
- python3.12-pip
|
||||||
|
- python3.12-devel
|
||||||
|
- python3.12-tkinter
|
||||||
|
suse:
|
||||||
|
- python312
|
||||||
|
- python312-devel
|
||||||
|
- python312-pip
|
||||||
|
opensuse:
|
||||||
|
- python312
|
||||||
|
- python312-devel
|
||||||
|
- python312-pip
|
||||||
|
alt:
|
||||||
|
- python3.12
|
||||||
|
- python3.12-devel
|
||||||
|
- python3.12-pip
|
||||||
|
astra:
|
||||||
|
- python3.12
|
||||||
|
- python3.12-dev
|
||||||
|
- python3.12-venv
|
||||||
|
- python3.12-distutils
|
||||||
|
- python3.12-lib2to3
|
||||||
|
- python3.12-gdbm
|
||||||
|
- python3.12-tk
|
||||||
|
clearlinux:
|
||||||
|
- python3
|
||||||
|
- python3-dev
|
||||||
|
- python3-pip
|
||||||
|
- python3-setuptools
|
||||||
|
- python3-wheel
|
||||||
|
- python3-venv
|
||||||
|
"alt linux":
|
||||||
|
- python3.12
|
||||||
|
- python3.12-devel
|
||||||
|
- python3.12-pip
|
||||||
|
"astra linux":
|
||||||
|
- python3.12
|
||||||
|
- python3.12-dev
|
||||||
|
- python3.12-venv
|
||||||
|
- python3.12-distutils
|
||||||
|
- python3.12-lib2to3
|
||||||
|
- python3.12-gdbm
|
||||||
|
- python3.12-tk
|
||||||
|
|
||||||
|
# Репозитории для разных дистрибутивов
|
||||||
|
python_repositories:
|
||||||
|
debian:
|
||||||
|
- name: "deadsnakes"
|
||||||
|
url: "ppa:deadsnakes/ppa"
|
||||||
|
state: "present"
|
||||||
|
- name: "deadsnakes-debian"
|
||||||
|
url: "deb http://ppa.launchpad.net/deadsnakes/ppa/ubuntu focal main"
|
||||||
|
state: "present"
|
||||||
|
ubuntu:
|
||||||
|
- name: "deadsnakes"
|
||||||
|
url: "ppa:deadsnakes/ppa"
|
||||||
|
state: "present"
|
||||||
|
redhat:
|
||||||
|
- name: "epel"
|
||||||
|
state: "present"
|
||||||
|
- name: "ius"
|
||||||
|
url: "https://repo.ius.io/redhat/7/x86_64/"
|
||||||
|
state: "present"
|
||||||
|
centos:
|
||||||
|
- name: "epel"
|
||||||
|
state: "present"
|
||||||
|
- name: "ius"
|
||||||
|
url: "https://repo.ius.io/centos/7/x86_64/"
|
||||||
|
state: "present"
|
||||||
|
- name: "scl"
|
||||||
|
url: "https://www.softwarecollections.org/en/scls/rhscl/rh-python312/"
|
||||||
|
state: "present"
|
||||||
|
rhel:
|
||||||
|
- name: "epel"
|
||||||
|
state: "present"
|
||||||
|
- name: "ius"
|
||||||
|
url: "https://repo.ius.io/redhat/7/x86_64/"
|
||||||
|
state: "present"
|
||||||
|
- name: "scl"
|
||||||
|
url: "https://www.softwarecollections.org/en/scls/rhscl/rh-python312/"
|
||||||
|
state: "present"
|
||||||
|
rocky:
|
||||||
|
- name: "epel"
|
||||||
|
state: "present"
|
||||||
|
alma:
|
||||||
|
- name: "epel"
|
||||||
|
state: "present"
|
||||||
|
fedora:
|
||||||
|
- name: "epel"
|
||||||
|
state: "present"
|
||||||
|
|
||||||
|
# Команды для обновления пакетов
|
||||||
|
python_update_commands:
|
||||||
|
debian: "apt update"
|
||||||
|
ubuntu: "apt update"
|
||||||
|
redhat: "dnf update -y"
|
||||||
|
centos: "dnf update -y"
|
||||||
|
rhel: "dnf update -y"
|
||||||
|
rocky: "dnf update -y"
|
||||||
|
alma: "dnf update -y"
|
||||||
|
fedora: "dnf update -y"
|
||||||
|
suse: "zypper refresh"
|
||||||
|
opensuse: "zypper refresh"
|
||||||
|
alt: "apt-get update"
|
||||||
|
"alt linux": "apt-get update"
|
||||||
|
astra: "apt update"
|
||||||
|
"astra linux": "apt update"
|
||||||
|
clearlinux: "swupd update"
|
||||||
|
|
||||||
|
# Команды для установки пакетов
|
||||||
|
python_install_commands:
|
||||||
|
debian: "apt install -y"
|
||||||
|
ubuntu: "apt install -y"
|
||||||
|
redhat: "dnf install -y"
|
||||||
|
centos: "dnf install -y"
|
||||||
|
rhel: "dnf install -y"
|
||||||
|
rocky: "dnf install -y"
|
||||||
|
alma: "dnf install -y"
|
||||||
|
fedora: "dnf install -y"
|
||||||
|
suse: "zypper install -y"
|
||||||
|
opensuse: "zypper install -y"
|
||||||
|
alt: "apt-get install -y"
|
||||||
|
"alt linux": "apt-get install -y"
|
||||||
|
astra: "apt install -y"
|
||||||
|
"astra linux": "apt install -y"
|
||||||
|
clearlinux: "swupd bundle-add"
|
||||||
|
|
||||||
|
# Пути к исполняемым файлам Python
|
||||||
|
python_executable_paths:
|
||||||
|
debian: "/usr/bin/python3.12"
|
||||||
|
ubuntu: "/usr/bin/python3.12"
|
||||||
|
redhat: "/usr/bin/python3.12"
|
||||||
|
centos: "/usr/bin/python3.12"
|
||||||
|
rhel: "/usr/bin/python3.12"
|
||||||
|
rocky: "/usr/bin/python3.12"
|
||||||
|
alma: "/usr/bin/python3.12"
|
||||||
|
fedora: "/usr/bin/python3.12"
|
||||||
|
suse: "/usr/bin/python3.12"
|
||||||
|
opensuse: "/usr/bin/python3.12"
|
||||||
|
alt: "/usr/bin/python3.12"
|
||||||
|
"alt linux": "/usr/bin/python3.12"
|
||||||
|
astra: "/usr/bin/python3.12"
|
||||||
|
"astra linux": "/usr/bin/python3.12"
|
||||||
|
clearlinux: "/usr/bin/python3"
|
||||||
|
|
||||||
|
# Пути к pip
|
||||||
|
python_pip_paths:
|
||||||
|
debian: "/usr/bin/pip3.12"
|
||||||
|
ubuntu: "/usr/bin/pip3.12"
|
||||||
|
redhat: "/usr/bin/pip3.12"
|
||||||
|
centos: "/usr/bin/pip3.12"
|
||||||
|
rhel: "/usr/bin/pip3.12"
|
||||||
|
rocky: "/usr/bin/pip3.12"
|
||||||
|
alma: "/usr/bin/pip3.12"
|
||||||
|
fedora: "/usr/bin/pip3.12"
|
||||||
|
suse: "/usr/bin/pip3.12"
|
||||||
|
opensuse: "/usr/bin/pip3.12"
|
||||||
|
alt: "/usr/bin/pip3.12"
|
||||||
|
"alt linux": "/usr/bin/pip3.12"
|
||||||
|
astra: "/usr/bin/pip3.12"
|
||||||
|
"astra linux": "/usr/bin/pip3.12"
|
||||||
|
clearlinux: "/usr/bin/pip3"
|
||||||
|
|
||||||
|
# Системные зависимости для компиляции
|
||||||
|
python_build_deps_by_os:
|
||||||
|
debian:
|
||||||
|
- build-essential
|
||||||
|
- zlib1g-dev
|
||||||
|
- libssl-dev
|
||||||
|
- libffi-dev
|
||||||
|
- libsqlite3-dev
|
||||||
|
- libreadline-dev
|
||||||
|
- libbz2-dev
|
||||||
|
- libncurses5-dev
|
||||||
|
- libncursesw5-dev
|
||||||
|
- xz-utils
|
||||||
|
- tk-dev
|
||||||
|
- libgdbm-dev
|
||||||
|
- libdb-dev
|
||||||
|
- libpcap-dev
|
||||||
|
- liblzma-dev
|
||||||
|
ubuntu:
|
||||||
|
- build-essential
|
||||||
|
- zlib1g-dev
|
||||||
|
- libssl-dev
|
||||||
|
- libffi-dev
|
||||||
|
- libsqlite3-dev
|
||||||
|
- libreadline-dev
|
||||||
|
- libbz2-dev
|
||||||
|
- libncurses5-dev
|
||||||
|
- libncursesw5-dev
|
||||||
|
- xz-utils
|
||||||
|
- tk-dev
|
||||||
|
- libgdbm-dev
|
||||||
|
- libdb-dev
|
||||||
|
- libpcap-dev
|
||||||
|
- liblzma-dev
|
||||||
|
redhat:
|
||||||
|
- gcc
|
||||||
|
- gcc-c++
|
||||||
|
- make
|
||||||
|
- zlib-devel
|
||||||
|
- openssl-devel
|
||||||
|
- libffi-devel
|
||||||
|
- sqlite-devel
|
||||||
|
- readline-devel
|
||||||
|
- bzip2-devel
|
||||||
|
- ncurses-devel
|
||||||
|
- xz-devel
|
||||||
|
- tk-devel
|
||||||
|
- gdbm-devel
|
||||||
|
- db4-devel
|
||||||
|
- libpcap-devel
|
||||||
|
- expat-devel
|
||||||
|
- libnsl2-devel
|
||||||
|
centos:
|
||||||
|
- gcc
|
||||||
|
- gcc-c++
|
||||||
|
- make
|
||||||
|
- zlib-devel
|
||||||
|
- openssl-devel
|
||||||
|
- libffi-devel
|
||||||
|
- sqlite-devel
|
||||||
|
- readline-devel
|
||||||
|
- bzip2-devel
|
||||||
|
- ncurses-devel
|
||||||
|
- xz-devel
|
||||||
|
- tk-devel
|
||||||
|
- gdbm-devel
|
||||||
|
- expat-devel
|
||||||
|
# Альтернативные пакеты для CentOS
|
||||||
|
- gdbm
|
||||||
|
- db4
|
||||||
|
rhel:
|
||||||
|
- gcc
|
||||||
|
- gcc-c++
|
||||||
|
- make
|
||||||
|
- zlib-devel
|
||||||
|
- openssl-devel
|
||||||
|
- libffi-devel
|
||||||
|
- sqlite-devel
|
||||||
|
- readline-devel
|
||||||
|
- bzip2-devel
|
||||||
|
- ncurses-devel
|
||||||
|
- xz-devel
|
||||||
|
- tk-devel
|
||||||
|
- gdbm-devel
|
||||||
|
- expat-devel
|
||||||
|
rocky:
|
||||||
|
- gcc
|
||||||
|
- gcc-c++
|
||||||
|
- make
|
||||||
|
- zlib-devel
|
||||||
|
- openssl-devel
|
||||||
|
- libffi-devel
|
||||||
|
- sqlite-devel
|
||||||
|
- readline-devel
|
||||||
|
- bzip2-devel
|
||||||
|
- ncurses-devel
|
||||||
|
- xz-devel
|
||||||
|
- tk-devel
|
||||||
|
- gdbm-devel
|
||||||
|
- expat-devel
|
||||||
|
alma:
|
||||||
|
- gcc
|
||||||
|
- gcc-c++
|
||||||
|
- make
|
||||||
|
- zlib-devel
|
||||||
|
- openssl-devel
|
||||||
|
- libffi-devel
|
||||||
|
- sqlite-devel
|
||||||
|
- readline-devel
|
||||||
|
- bzip2-devel
|
||||||
|
- ncurses-devel
|
||||||
|
- xz-devel
|
||||||
|
- tk-devel
|
||||||
|
- gdbm-devel
|
||||||
|
- expat-devel
|
||||||
|
fedora:
|
||||||
|
- gcc
|
||||||
|
- gcc-c++
|
||||||
|
- make
|
||||||
|
- zlib-devel
|
||||||
|
- openssl-devel
|
||||||
|
- libffi-devel
|
||||||
|
- sqlite-devel
|
||||||
|
- readline-devel
|
||||||
|
- bzip2-devel
|
||||||
|
- ncurses-devel
|
||||||
|
- xz-devel
|
||||||
|
- tk-devel
|
||||||
|
- gdbm-devel
|
||||||
|
- expat-devel
|
||||||
|
suse:
|
||||||
|
- gcc
|
||||||
|
- gcc-c++
|
||||||
|
- make
|
||||||
|
- zlib-devel
|
||||||
|
- libopenssl-devel
|
||||||
|
- libffi-devel
|
||||||
|
- sqlite3-devel
|
||||||
|
- readline-devel
|
||||||
|
- bzip2-devel
|
||||||
|
- ncurses-devel
|
||||||
|
- xz-devel
|
||||||
|
- tk-devel
|
||||||
|
- gdbm-devel
|
||||||
|
- libpcap-devel
|
||||||
|
- expat-devel
|
||||||
|
- libnsl2-devel
|
||||||
|
opensuse:
|
||||||
|
- gcc
|
||||||
|
- gcc-c++
|
||||||
|
- make
|
||||||
|
- zlib-devel
|
||||||
|
- libopenssl-devel
|
||||||
|
- libffi-devel
|
||||||
|
- sqlite3-devel
|
||||||
|
- readline-devel
|
||||||
|
- bzip2-devel
|
||||||
|
- ncurses-devel
|
||||||
|
- xz-devel
|
||||||
|
- tk-devel
|
||||||
|
- gdbm-devel
|
||||||
|
- expat-devel
|
||||||
|
alt:
|
||||||
|
- gcc
|
||||||
|
- gcc-c++
|
||||||
|
- make
|
||||||
|
- zlib-devel
|
||||||
|
- openssl-devel
|
||||||
|
- libffi-devel
|
||||||
|
- sqlite-devel
|
||||||
|
- readline-devel
|
||||||
|
- bzip2-devel
|
||||||
|
- ncurses-devel
|
||||||
|
- xz-devel
|
||||||
|
- tk-devel
|
||||||
|
- gdbm-devel
|
||||||
|
- expat-devel
|
||||||
|
astra:
|
||||||
|
- build-essential
|
||||||
|
- zlib1g-dev
|
||||||
|
- libssl-dev
|
||||||
|
- libffi-dev
|
||||||
|
- libsqlite3-dev
|
||||||
|
- libreadline-dev
|
||||||
|
- libbz2-dev
|
||||||
|
- libncurses5-dev
|
||||||
|
- libncursesw5-dev
|
||||||
|
- xz-utils
|
||||||
|
- tk-dev
|
||||||
|
- libgdbm-dev
|
||||||
|
- libdb-dev
|
||||||
|
- libpcap-dev
|
||||||
|
- liblzma-dev
|
||||||
|
clearlinux:
|
||||||
|
- os-core-devel
|
||||||
|
- python3-dev
|
||||||
|
- zlib-devel
|
||||||
|
- openssl-devel
|
||||||
|
- libffi-devel
|
||||||
|
- sqlite-devel
|
||||||
|
- readline-devel
|
||||||
|
- bzip2-devel
|
||||||
|
- ncurses-devel
|
||||||
|
- xz-devel
|
||||||
|
- tk-devel
|
||||||
|
- gdbm-devel
|
||||||
|
- expat-devel
|
||||||
|
"alt linux":
|
||||||
|
- gcc
|
||||||
|
- gcc-c++
|
||||||
|
- make
|
||||||
|
- zlib-devel
|
||||||
|
- openssl-devel
|
||||||
|
- libffi-devel
|
||||||
|
- sqlite-devel
|
||||||
|
- readline-devel
|
||||||
|
- bzip2-devel
|
||||||
|
- ncurses-devel
|
||||||
|
- xz-devel
|
||||||
|
- tk-devel
|
||||||
|
- gdbm-devel
|
||||||
|
- expat-devel
|
||||||
|
"astra linux":
|
||||||
|
- build-essential
|
||||||
|
- zlib1g-dev
|
||||||
|
- libssl-dev
|
||||||
|
- libffi-dev
|
||||||
|
- libsqlite3-dev
|
||||||
|
- libreadline-dev
|
||||||
|
- libbz2-dev
|
||||||
|
- libncurses5-dev
|
||||||
|
- libncursesw5-dev
|
||||||
|
- xz-utils
|
||||||
|
- tk-dev
|
||||||
|
- libgdbm-dev
|
||||||
|
- libdb-dev
|
||||||
|
- libpcap-dev
|
||||||
|
- liblzma-devel
|
||||||
244
scripts/create_k8s_cluster.py
Executable file
244
scripts/create_k8s_cluster.py
Executable file
@@ -0,0 +1,244 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Скрипт для создания Kind кластеров
|
||||||
|
Автор: Сергей Антропов
|
||||||
|
Сайт: https://devops.org.ru
|
||||||
|
"""
|
||||||
|
import sys
|
||||||
|
import yaml
|
||||||
|
import subprocess
|
||||||
|
import os
|
||||||
|
|
||||||
|
def run_cmd(cmd):
|
||||||
|
"""Выполнить команду"""
|
||||||
|
print(f"[run] {cmd}")
|
||||||
|
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
|
||||||
|
if result.returncode != 0:
|
||||||
|
print(f"[error] {result.stderr}")
|
||||||
|
sys.exit(1)
|
||||||
|
print(result.stdout)
|
||||||
|
return result.stdout
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if len(sys.argv) < 3:
|
||||||
|
print("Usage: create_k8s_cluster.py <preset_file> <container_name>")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
preset_file = sys.argv[1]
|
||||||
|
container_name = sys.argv[2]
|
||||||
|
|
||||||
|
print(f"📋 Читаю пресет: {preset_file}")
|
||||||
|
with open(preset_file, 'r') as f:
|
||||||
|
preset = yaml.safe_load(f)
|
||||||
|
|
||||||
|
# Создаем Docker сеть если её нет
|
||||||
|
docker_network = preset.get('docker_network', 'labnet')
|
||||||
|
print(f"\n🌐 Проверка Docker сети: {docker_network}")
|
||||||
|
result = subprocess.run(f"docker network ls --format '{{{{.Name}}}}' | grep -x {docker_network}",
|
||||||
|
shell=True, capture_output=True, text=True)
|
||||||
|
if not result.stdout.strip():
|
||||||
|
print(f"📡 Создание Docker сети: {docker_network}")
|
||||||
|
run_cmd(f"docker network create {docker_network}")
|
||||||
|
else:
|
||||||
|
print(f"✅ Сеть {docker_network} уже существует")
|
||||||
|
|
||||||
|
# Получаем конфигурацию для hosts
|
||||||
|
hosts = preset.get('hosts', [])
|
||||||
|
images = preset.get('images', {})
|
||||||
|
systemd_defaults = preset.get('systemd_defaults', {})
|
||||||
|
|
||||||
|
# Создаем контейнеры если определены hosts
|
||||||
|
if hosts:
|
||||||
|
print(f"\n🐳 Создание контейнеров (всего: {len(hosts)})")
|
||||||
|
for host in hosts:
|
||||||
|
host_name = host['name']
|
||||||
|
family = host['family']
|
||||||
|
|
||||||
|
# Проверяем существование контейнера
|
||||||
|
result = subprocess.run(f"docker ps -a --format '{{{{.Names}}}}' | grep -x {host_name}",
|
||||||
|
shell=True, capture_output=True, text=True)
|
||||||
|
if result.stdout.strip():
|
||||||
|
print(f"⚠️ Контейнер '{host_name}' уже существует, удаляем старый")
|
||||||
|
run_cmd(f"docker rm -f {host_name}")
|
||||||
|
|
||||||
|
# Получаем образ
|
||||||
|
image = images.get(family, f"inecs/ansible-lab:{family}-latest")
|
||||||
|
|
||||||
|
# Формируем команду docker run
|
||||||
|
cmd_parts = [
|
||||||
|
"docker run -d",
|
||||||
|
f"--name {host_name}",
|
||||||
|
f"--network {docker_network}",
|
||||||
|
"--restart=unless-stopped"
|
||||||
|
]
|
||||||
|
|
||||||
|
# Добавляем systemd настройки
|
||||||
|
if systemd_defaults.get('privileged'):
|
||||||
|
cmd_parts.append("--privileged")
|
||||||
|
|
||||||
|
for vol in systemd_defaults.get('volumes', []):
|
||||||
|
cmd_parts.append(f"-v {vol}")
|
||||||
|
|
||||||
|
for tmpfs in systemd_defaults.get('tmpfs', []):
|
||||||
|
cmd_parts.append(f"--tmpfs {tmpfs}")
|
||||||
|
|
||||||
|
if systemd_defaults.get('capabilities'):
|
||||||
|
for cap in systemd_defaults['capabilities']:
|
||||||
|
cmd_parts.append(f"--cap-add {cap}")
|
||||||
|
|
||||||
|
cmd_parts.append(image)
|
||||||
|
|
||||||
|
# Добавляем command в конец если задан
|
||||||
|
if systemd_defaults.get('command'):
|
||||||
|
cmd_parts.append(systemd_defaults['command'])
|
||||||
|
|
||||||
|
cmd = " ".join(cmd_parts)
|
||||||
|
print(f"🚀 Создание контейнера: {host_name}")
|
||||||
|
run_cmd(cmd)
|
||||||
|
print(f"✅ Контейнер '{host_name}' создан")
|
||||||
|
|
||||||
|
kind_clusters = preset.get('kind_clusters', [])
|
||||||
|
if not kind_clusters:
|
||||||
|
print("\n⚠️ В пресете не определены kind кластеры")
|
||||||
|
print("✅ Создание контейнеров завершено")
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
os.makedirs("/ansible/.kind", exist_ok=True)
|
||||||
|
|
||||||
|
for cluster in kind_clusters:
|
||||||
|
name = cluster['name']
|
||||||
|
config_file = f"/ansible/.kind/{name}.yaml"
|
||||||
|
|
||||||
|
print(f"\n☸️ Создание конфигурации для кластера: {name}")
|
||||||
|
|
||||||
|
# Создаем конфигурацию Kind
|
||||||
|
config = {
|
||||||
|
'kind': 'Cluster',
|
||||||
|
'apiVersion': 'kind.x-k8s.io/v1alpha4',
|
||||||
|
'nodes': [
|
||||||
|
{'role': 'control-plane'}
|
||||||
|
],
|
||||||
|
'networking': {
|
||||||
|
'apiServerAddress': '0.0.0.0',
|
||||||
|
'apiServerPort': cluster.get('api_port', 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Добавляем extraPortMappings для всех портов из addon_ports
|
||||||
|
addon_ports = cluster.get('addon_ports', {})
|
||||||
|
|
||||||
|
# Ingress порты для проброса на host
|
||||||
|
if addon_ports.get('ingress_http') or addon_ports.get('ingress_https'):
|
||||||
|
# Добавляем extraPortMappings к control-plane узлу
|
||||||
|
if 'extraPortMappings' not in config['nodes'][0]:
|
||||||
|
config['nodes'][0]['extraPortMappings'] = []
|
||||||
|
|
||||||
|
if addon_ports.get('ingress_http'):
|
||||||
|
config['nodes'][0]['extraPortMappings'].append({
|
||||||
|
'containerPort': 80,
|
||||||
|
'hostPort': addon_ports['ingress_http'],
|
||||||
|
'protocol': 'TCP'
|
||||||
|
})
|
||||||
|
if addon_ports.get('ingress_https'):
|
||||||
|
config['nodes'][0]['extraPortMappings'].append({
|
||||||
|
'containerPort': 443,
|
||||||
|
'hostPort': addon_ports['ingress_https'],
|
||||||
|
'protocol': 'TCP'
|
||||||
|
})
|
||||||
|
|
||||||
|
# Не добавляем extraPortMappings для портов аддонов - используем port-forward
|
||||||
|
|
||||||
|
# Добавляем worker nodes
|
||||||
|
workers = cluster.get('workers', 0)
|
||||||
|
for i in range(workers):
|
||||||
|
config['nodes'].append({'role': 'worker'})
|
||||||
|
|
||||||
|
# Записываем конфигурацию
|
||||||
|
with open(config_file, 'w') as f:
|
||||||
|
yaml.dump(config, f)
|
||||||
|
|
||||||
|
print(f"✅ Конфигурация сохранена: {config_file}")
|
||||||
|
|
||||||
|
# Проверяем существование кластера
|
||||||
|
result = subprocess.run(f"kind get clusters", shell=True, capture_output=True, text=True)
|
||||||
|
existing = result.stdout.strip().split('\n') if result.returncode == 0 else []
|
||||||
|
|
||||||
|
if name in existing:
|
||||||
|
print(f"⚠️ Кластер '{name}' уже существует, пропускаю")
|
||||||
|
else:
|
||||||
|
print(f"🚀 Создание кластера: {name}")
|
||||||
|
run_cmd(f"kind create cluster --name {name} --config {config_file}")
|
||||||
|
|
||||||
|
# Подключаем контейнер k8s-controller к сети kind
|
||||||
|
print(f"🔗 Подключение контейнера к сети kind...")
|
||||||
|
result = subprocess.run(f"docker network inspect kind", shell=True, capture_output=True, text=True)
|
||||||
|
if result.returncode == 0:
|
||||||
|
# Получаем имя контейнера из аргументов (второй аргумент)
|
||||||
|
controller_name = sys.argv[2] if len(sys.argv) > 2 else "k8s-controller"
|
||||||
|
result = subprocess.run(f"docker network connect kind {controller_name}", shell=True, capture_output=True, text=True)
|
||||||
|
if result.returncode == 0:
|
||||||
|
print(f"✅ Контейнер {controller_name} подключен к сети kind")
|
||||||
|
else:
|
||||||
|
print(f"⚠️ Не удалось подключить контейнер к сети kind: {result.stderr}")
|
||||||
|
else:
|
||||||
|
print(f"⚠️ Сеть kind не найдена")
|
||||||
|
|
||||||
|
# Устанавливаем аддоны
|
||||||
|
addons = cluster.get('addons', {})
|
||||||
|
if not addons:
|
||||||
|
continue
|
||||||
|
|
||||||
|
print(f"\n📦 Установка аддонов для кластера: {name}")
|
||||||
|
|
||||||
|
if addons.get('ingress_nginx'):
|
||||||
|
print(" - Installing ingress-nginx")
|
||||||
|
run_cmd(f"kubectl --server=https://{name}-control-plane:6443 --insecure-skip-tls-verify apply --validate=false -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml")
|
||||||
|
run_cmd(f"kubectl --server=https://{name}-control-plane:6443 --insecure-skip-tls-verify -n ingress-nginx rollout status deploy/ingress-nginx-controller --timeout=180s")
|
||||||
|
|
||||||
|
if addons.get('metrics_server'):
|
||||||
|
print(" - Installing metrics-server")
|
||||||
|
run_cmd(f"kubectl --server=https://{name}-control-plane:6443 --insecure-skip-tls-verify apply --validate=false -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml")
|
||||||
|
patch_json = '{"spec":{"template":{"spec":{"containers":[{"name":"metrics-server","args":["--kubelet-insecure-tls","--kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname"]}]}}}}'
|
||||||
|
run_cmd(f"kubectl --server=https://{name}-control-plane:6443 --insecure-skip-tls-verify -n kube-system patch deploy metrics-server -p '{patch_json}'")
|
||||||
|
|
||||||
|
if addons.get('istio'):
|
||||||
|
print(" - Installing Istio")
|
||||||
|
# Генерируем kubeconfig и заменяем 0.0.0.0 на IP control-plane узла
|
||||||
|
run_cmd(f"kind get kubeconfig --name {name} > /tmp/istio-kubeconfig-{name}.yaml")
|
||||||
|
# Получаем IP control-plane узла и заменяем в kubeconfig
|
||||||
|
result = subprocess.run(f"docker inspect {name}-control-plane --format='{{{{.NetworkSettings.Networks.kind.IPAddress}}}}'",
|
||||||
|
shell=True, capture_output=True, text=True)
|
||||||
|
if result.returncode == 0:
|
||||||
|
control_plane_ip = result.stdout.strip()
|
||||||
|
# Заменяем 0.0.0.0 на IP control-plane
|
||||||
|
subprocess.run(f"sed -i 's/0\\.0\\.0\\.0:6443/{control_plane_ip}:6443/g' /tmp/istio-kubeconfig-{name}.yaml", shell=True)
|
||||||
|
# Устанавливаем Istio используя kubeconfig
|
||||||
|
run_cmd(f"KUBECONFIG=/tmp/istio-kubeconfig-{name}.yaml istioctl install -y --set profile=demo")
|
||||||
|
run_cmd(f"kubectl --server=https://{name}-control-plane:6443 --insecure-skip-tls-verify -n istio-system rollout status deploy/istiod --timeout=180s")
|
||||||
|
run_cmd(f"kubectl --server=https://{name}-control-plane:6443 --insecure-skip-tls-verify -n istio-system rollout status deploy/istio-ingressgateway --timeout=180s")
|
||||||
|
|
||||||
|
if addons.get('kiali'):
|
||||||
|
print(" - Installing Kiali")
|
||||||
|
subprocess.run(f"kubectl --server=https://{name}-control-plane:6443 --insecure-skip-tls-verify create ns istio-system", shell=True, capture_output=True)
|
||||||
|
# Добавляем Helm репозиторий Kiali
|
||||||
|
run_cmd(f"helm repo add kiali https://kiali.org/helm-charts")
|
||||||
|
run_cmd(f"helm repo update")
|
||||||
|
# Используем исправленный kubeconfig
|
||||||
|
run_cmd(f"KUBECONFIG=/tmp/istio-kubeconfig-{name}.yaml helm upgrade --install kiali-server kiali/kiali-server --namespace istio-system --set auth.strategy=anonymous --wait --timeout 180s")
|
||||||
|
|
||||||
|
if addons.get('prometheus_stack'):
|
||||||
|
print(" - Installing Prometheus Stack")
|
||||||
|
# Добавляем Helm репозиторий Prometheus
|
||||||
|
subprocess.run(f"helm repo add prometheus-community https://prometheus-community.github.io/helm-charts", shell=True, capture_output=True)
|
||||||
|
subprocess.run(f"helm repo update", shell=True, capture_output=True)
|
||||||
|
subprocess.run(f"kubectl --server=https://{name}-control-plane:6443 --insecure-skip-tls-verify create ns monitoring", shell=True, capture_output=True)
|
||||||
|
# Используем исправленный kubeconfig
|
||||||
|
run_cmd(f"KUBECONFIG=/tmp/istio-kubeconfig-{name}.yaml helm upgrade --install monitoring prometheus-community/kube-prometheus-stack --namespace monitoring --set grafana.adminPassword=admin --set grafana.defaultDashboardsTimezone=browser --wait --timeout 600s")
|
||||||
|
run_cmd(f"kubectl --server=https://{name}-control-plane:6443 --insecure-skip-tls-verify -n monitoring rollout status deploy/monitoring-grafana --timeout=300s")
|
||||||
|
|
||||||
|
print(f"✅ Кластер '{name}' готов!")
|
||||||
|
|
||||||
|
print("\n🎉 Все кластеры созданы!")
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
44
scripts/delete_hosts.py
Normal file
44
scripts/delete_hosts.py
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Скрипт для удаления контейнеров из секции hosts пресета
|
||||||
|
Автор: Сергей Антропов
|
||||||
|
Сайт: https://devops.org.ru
|
||||||
|
"""
|
||||||
|
import sys
|
||||||
|
import yaml
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if len(sys.argv) < 2:
|
||||||
|
print("Usage: delete_hosts.py <preset_file>")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
preset_file = sys.argv[1]
|
||||||
|
|
||||||
|
print(f"📋 Читаю пресет: {preset_file}")
|
||||||
|
with open(preset_file, 'r') as f:
|
||||||
|
preset = yaml.safe_load(f)
|
||||||
|
|
||||||
|
hosts = preset.get('hosts', [])
|
||||||
|
if not hosts:
|
||||||
|
print("⚠️ В пресете нет контейнеров для удаления")
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
print(f"🗑️ Удаление контейнеров (всего: {len(hosts)})")
|
||||||
|
for host in hosts:
|
||||||
|
host_name = host['name']
|
||||||
|
|
||||||
|
# Проверяем существование контейнера
|
||||||
|
result = subprocess.run(f"docker ps -a --format '{{{{.Names}}}}' | grep -x {host_name}",
|
||||||
|
shell=True, capture_output=True, text=True)
|
||||||
|
if result.stdout.strip():
|
||||||
|
print(f"🗑️ Удаление контейнера: {host_name}")
|
||||||
|
subprocess.run(f"docker rm -f {host_name}", shell=True, capture_output=True, text=True)
|
||||||
|
print(f"✅ Контейнер '{host_name}' удален")
|
||||||
|
else:
|
||||||
|
print(f"⚠️ Контейнер '{host_name}' не найден")
|
||||||
|
|
||||||
|
print("✅ Удаление завершено")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
300
scripts/k8s_status.py
Executable file
300
scripts/k8s_status.py
Executable file
@@ -0,0 +1,300 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Скрипт для детального отчета о состоянии Kubernetes кластера
|
||||||
|
Автор: Сергей Антропов
|
||||||
|
Сайт: https://devops.org.ru
|
||||||
|
"""
|
||||||
|
import sys
|
||||||
|
import subprocess
|
||||||
|
import json
|
||||||
|
|
||||||
|
def get_cluster_name():
|
||||||
|
"""Получает имя кластера"""
|
||||||
|
result = subprocess.run("docker exec k8s-controller kind get clusters | head -1", shell=True, capture_output=True, text=True)
|
||||||
|
if result.returncode == 0:
|
||||||
|
return result.stdout.strip()
|
||||||
|
return None
|
||||||
|
|
||||||
|
def run_kubectl_cmd(cmd):
|
||||||
|
"""Выполняет команду kubectl внутри контейнера k8s-controller"""
|
||||||
|
cluster_name = get_cluster_name()
|
||||||
|
if cluster_name:
|
||||||
|
# Используем прямой адрес control-plane
|
||||||
|
server = f"https://{cluster_name}-control-plane:6443"
|
||||||
|
cmd_with_server = f"--server={server} --insecure-skip-tls-verify {cmd}"
|
||||||
|
else:
|
||||||
|
cmd_with_server = cmd
|
||||||
|
|
||||||
|
full_cmd = f"docker exec k8s-controller kubectl {cmd_with_server}"
|
||||||
|
result = subprocess.run(full_cmd, shell=True, capture_output=True, text=True)
|
||||||
|
return result.stdout
|
||||||
|
|
||||||
|
def print_section(title):
|
||||||
|
"""Выводит заголовок секции"""
|
||||||
|
print(f"\n{'='*70}")
|
||||||
|
print(f" {title}")
|
||||||
|
print(f"{'='*70}\n")
|
||||||
|
|
||||||
|
def print_subsection(title):
|
||||||
|
"""Выводит подзаголовок"""
|
||||||
|
print(f"\n{'─'*70}")
|
||||||
|
print(f" {title}")
|
||||||
|
print(f"{'─'*70}\n")
|
||||||
|
|
||||||
|
def get_cluster_info():
|
||||||
|
"""Получает информацию о кластере"""
|
||||||
|
print_section("📊 ОБЩАЯ ИНФОРМАЦИЯ О КЛАСТЕРЕ")
|
||||||
|
|
||||||
|
# Версия Kubernetes
|
||||||
|
version = run_kubectl_cmd("version --short")
|
||||||
|
print(version)
|
||||||
|
|
||||||
|
def get_nodes_status():
|
||||||
|
"""Получает статус узлов"""
|
||||||
|
print_section("🖥️ УЗЛЫ КЛАСТЕРА")
|
||||||
|
|
||||||
|
nodes = run_kubectl_cmd("get nodes -o wide")
|
||||||
|
print(nodes)
|
||||||
|
|
||||||
|
# Детальная информация о каждом узле
|
||||||
|
node_names = run_kubectl_cmd("get nodes -o jsonpath='{.items[*].metadata.name}'")
|
||||||
|
if node_names.strip():
|
||||||
|
for node in node_names.strip().split():
|
||||||
|
print_subsection(f"Узел: {node}")
|
||||||
|
node_info = run_kubectl_cmd(f"describe node {node}")
|
||||||
|
print(node_info)
|
||||||
|
|
||||||
|
def get_namespaces():
|
||||||
|
"""Получает список namespace"""
|
||||||
|
print_section("📁 NAMESPACES")
|
||||||
|
|
||||||
|
namespaces = run_kubectl_cmd("get namespaces")
|
||||||
|
print(namespaces)
|
||||||
|
|
||||||
|
def get_pods_by_namespace():
|
||||||
|
"""Получает поды по namespace"""
|
||||||
|
print_section("🪟 PODS")
|
||||||
|
|
||||||
|
# Получаем список namespace
|
||||||
|
namespaces_output = run_kubectl_cmd("get namespaces -o json")
|
||||||
|
try:
|
||||||
|
namespaces_data = json.loads(namespaces_output)
|
||||||
|
namespaces = [ns['metadata']['name'] for ns in namespaces_data['items']]
|
||||||
|
except:
|
||||||
|
namespaces = ['default', 'kube-system', 'kube-public', 'kube-node-lease']
|
||||||
|
|
||||||
|
for ns in namespaces:
|
||||||
|
print_subsection(f"Namespace: {ns}")
|
||||||
|
pods = run_kubectl_cmd(f"get pods -n {ns} -o wide")
|
||||||
|
if pods.strip():
|
||||||
|
print(pods)
|
||||||
|
else:
|
||||||
|
print(" (пусто)")
|
||||||
|
|
||||||
|
def get_services():
|
||||||
|
"""Получает сервисы"""
|
||||||
|
print_section("🔗 SERVICES")
|
||||||
|
|
||||||
|
namespaces_output = run_kubectl_cmd("get namespaces -o json")
|
||||||
|
try:
|
||||||
|
namespaces_data = json.loads(namespaces_output)
|
||||||
|
namespaces = [ns['metadata']['name'] for ns in namespaces_data['items']]
|
||||||
|
except:
|
||||||
|
namespaces = ['default', 'kube-system', 'kube-public', 'kube-node-lease']
|
||||||
|
|
||||||
|
for ns in namespaces:
|
||||||
|
print_subsection(f"Namespace: {ns}")
|
||||||
|
services = run_kubectl_cmd(f"get services -n {ns}")
|
||||||
|
if services.strip():
|
||||||
|
print(services)
|
||||||
|
else:
|
||||||
|
print(" (пусто)")
|
||||||
|
|
||||||
|
def get_ingress():
|
||||||
|
"""Получает Ingress ресурсы"""
|
||||||
|
print_section("🌐 INGRESS")
|
||||||
|
|
||||||
|
namespaces_output = run_kubectl_cmd("get namespaces -o json")
|
||||||
|
try:
|
||||||
|
namespaces_data = json.loads(namespaces_output)
|
||||||
|
namespaces = [ns['metadata']['name'] for ns in namespaces_data['items']]
|
||||||
|
except:
|
||||||
|
namespaces = ['default', 'kube-system', 'kube-public', 'kube-node-lease']
|
||||||
|
|
||||||
|
ingress_found = False
|
||||||
|
for ns in namespaces:
|
||||||
|
ingress = run_kubectl_cmd(f"get ingress -n {ns} 2>/dev/null")
|
||||||
|
if ingress.strip() and "No resources found" not in ingress:
|
||||||
|
ingress_found = True
|
||||||
|
print_subsection(f"Namespace: {ns}")
|
||||||
|
print(ingress)
|
||||||
|
|
||||||
|
if not ingress_found:
|
||||||
|
print(" Ingress ресурсы не найдены")
|
||||||
|
|
||||||
|
def get_pvcs():
|
||||||
|
"""Получает PersistentVolumeClaims"""
|
||||||
|
print_section("💾 VOLUMES (PVC)")
|
||||||
|
|
||||||
|
namespaces_output = run_kubectl_cmd("get namespaces -o json")
|
||||||
|
try:
|
||||||
|
namespaces_data = json.loads(namespaces_output)
|
||||||
|
namespaces = [ns['metadata']['name'] for ns in namespaces_data['items']]
|
||||||
|
except:
|
||||||
|
namespaces = ['default', 'kube-system', 'kube-public', 'kube-node-lease']
|
||||||
|
|
||||||
|
pvc_found = False
|
||||||
|
for ns in namespaces:
|
||||||
|
pvcs = run_kubectl_cmd(f"get pvc -n {ns} 2>/dev/null")
|
||||||
|
if pvcs.strip() and "No resources found" not in pvcs:
|
||||||
|
pvc_found = True
|
||||||
|
print_subsection(f"Namespace: {ns}")
|
||||||
|
print(pvcs)
|
||||||
|
|
||||||
|
if not pvc_found:
|
||||||
|
print(" PVC не найдены")
|
||||||
|
|
||||||
|
def get_deployments():
|
||||||
|
"""Получает Deployments"""
|
||||||
|
print_section("🚀 DEPLOYMENTS")
|
||||||
|
|
||||||
|
namespaces_output = run_kubectl_cmd("get namespaces -o json")
|
||||||
|
try:
|
||||||
|
namespaces_data = json.loads(namespaces_output)
|
||||||
|
namespaces = [ns['metadata']['name'] for ns in namespaces_data['items']]
|
||||||
|
except:
|
||||||
|
namespaces = ['default', 'kube-system', 'kube-public', 'kube-node-lease']
|
||||||
|
|
||||||
|
for ns in namespaces:
|
||||||
|
print_subsection(f"Namespace: {ns}")
|
||||||
|
deployments = run_kubectl_cmd(f"get deployments -n {ns}")
|
||||||
|
if deployments.strip():
|
||||||
|
print(deployments)
|
||||||
|
else:
|
||||||
|
print(" (пусто)")
|
||||||
|
|
||||||
|
def get_daemonsets():
|
||||||
|
"""Получает DaemonSets"""
|
||||||
|
print_section("🔧 DAEMONSETS")
|
||||||
|
|
||||||
|
namespaces_output = run_kubectl_cmd("get namespaces -o json")
|
||||||
|
try:
|
||||||
|
namespaces_data = json.loads(namespaces_output)
|
||||||
|
namespaces = [ns['metadata']['name'] for ns in namespaces_data['items']]
|
||||||
|
except:
|
||||||
|
namespaces = ['default', 'kube-system', 'kube-public', 'kube-node-lease']
|
||||||
|
|
||||||
|
for ns in namespaces:
|
||||||
|
print_subsection(f"Namespace: {ns}")
|
||||||
|
daemonsets = run_kubectl_cmd(f"get daemonsets -n {ns}")
|
||||||
|
if daemonsets.strip():
|
||||||
|
print(daemonsets)
|
||||||
|
else:
|
||||||
|
print(" (пусто)")
|
||||||
|
|
||||||
|
def get_statefulsets():
|
||||||
|
"""Получает StatefulSets"""
|
||||||
|
print_section("🗄️ STATEFULSETS")
|
||||||
|
|
||||||
|
namespaces_output = run_kubectl_cmd("get namespaces -o json")
|
||||||
|
try:
|
||||||
|
namespaces_data = json.loads(namespaces_output)
|
||||||
|
namespaces = [ns['metadata']['name'] for ns in namespaces_data['items']]
|
||||||
|
except:
|
||||||
|
namespaces = ['default', 'kube-system', 'kube-public', 'kube-node-lease']
|
||||||
|
|
||||||
|
statefulsets_found = False
|
||||||
|
for ns in namespaces:
|
||||||
|
statefulsets = run_kubectl_cmd(f"get statefulsets -n {ns} 2>/dev/null")
|
||||||
|
if statefulsets.strip() and "No resources found" not in statefulsets:
|
||||||
|
statefulsets_found = True
|
||||||
|
print_subsection(f"Namespace: {ns}")
|
||||||
|
print(statefulsets)
|
||||||
|
|
||||||
|
if not statefulsets_found:
|
||||||
|
print(" StatefulSets не найдены")
|
||||||
|
|
||||||
|
def get_events():
|
||||||
|
"""Получает события"""
|
||||||
|
print_section("📅 СОБЫТИЯ (EVENTS)")
|
||||||
|
|
||||||
|
namespaces_output = run_kubectl_cmd("get namespaces -o json")
|
||||||
|
try:
|
||||||
|
namespaces_data = json.loads(namespaces_output)
|
||||||
|
namespaces = [ns['metadata']['name'] for ns in namespaces_data['items']]
|
||||||
|
except:
|
||||||
|
namespaces = ['default', 'kube-system', 'kube-public', 'kube-node-lease']
|
||||||
|
|
||||||
|
for ns in namespaces:
|
||||||
|
print_subsection(f"Namespace: {ns}")
|
||||||
|
events = run_kubectl_cmd(f"get events -n {ns} --sort-by='.lastTimestamp' | tail -20")
|
||||||
|
if events.strip():
|
||||||
|
print(events)
|
||||||
|
else:
|
||||||
|
print(" (пусто)")
|
||||||
|
|
||||||
|
def get_helm_releases():
|
||||||
|
"""Получает Helm релизы"""
|
||||||
|
print_section("📦 HELM RELEASES")
|
||||||
|
|
||||||
|
helm_output = run_kubectl_cmd("helm list --all-namespaces 2>/dev/null")
|
||||||
|
if helm_output.strip():
|
||||||
|
print(helm_output)
|
||||||
|
else:
|
||||||
|
print(" Helm релизы не найдены")
|
||||||
|
|
||||||
|
def get_resource_usage():
|
||||||
|
"""Получает использование ресурсов"""
|
||||||
|
print_section("📈 ИСПОЛЬЗОВАНИЕ РЕСУРСОВ")
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Проверяем наличие metrics-server
|
||||||
|
top_nodes = run_kubectl_cmd("top nodes 2>/dev/null")
|
||||||
|
if top_nodes.strip():
|
||||||
|
print_subsection("Узлы:")
|
||||||
|
print(top_nodes)
|
||||||
|
except:
|
||||||
|
print(" metrics-server не установлен или недоступен")
|
||||||
|
|
||||||
|
try:
|
||||||
|
top_pods = run_kubectl_cmd("top pods --all-namespaces 2>/dev/null")
|
||||||
|
if top_pods.strip():
|
||||||
|
print_subsection("Pods (топ-20):")
|
||||||
|
# Берем только первые 20 строк
|
||||||
|
lines = top_pods.strip().split('\n')
|
||||||
|
print('\n'.join(lines[:21])) # + заголовок
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""Главная функция"""
|
||||||
|
# Проверяем доступность контейнера
|
||||||
|
result = subprocess.run("docker ps | grep k8s-controller", shell=True, capture_output=True, text=True)
|
||||||
|
if result.returncode != 0:
|
||||||
|
print("❌ Контейнер k8s-controller не запущен")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
print("="*70)
|
||||||
|
print(" ДЕТАЛЬНЫЙ ОТЧЕТ О СОСТОЯНИИ KUBERNETES КЛАСТЕРА")
|
||||||
|
print("="*70)
|
||||||
|
|
||||||
|
get_cluster_info()
|
||||||
|
get_nodes_status()
|
||||||
|
get_namespaces()
|
||||||
|
get_resource_usage()
|
||||||
|
get_pods_by_namespace()
|
||||||
|
get_deployments()
|
||||||
|
get_daemonsets()
|
||||||
|
get_statefulsets()
|
||||||
|
get_services()
|
||||||
|
get_ingress()
|
||||||
|
get_pvcs()
|
||||||
|
get_events()
|
||||||
|
get_helm_releases()
|
||||||
|
|
||||||
|
print("\n" + "="*70)
|
||||||
|
print(" ОТЧЕТ ЗАВЕРШЕН")
|
||||||
|
print("="*70 + "\n")
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
253
scripts/portforward.py
Executable file
253
scripts/portforward.py
Executable file
@@ -0,0 +1,253 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Скрипт для управления port-forward для Kubernetes сервисов
|
||||||
|
Автор: Сергей Антропов
|
||||||
|
Сайт: https://devops.org.ru
|
||||||
|
"""
|
||||||
|
import sys
|
||||||
|
import yaml
|
||||||
|
import subprocess
|
||||||
|
import os
|
||||||
|
import signal
|
||||||
|
import time
|
||||||
|
|
||||||
|
def get_cluster_name():
|
||||||
|
"""Получаем имя кластера из preset файла"""
|
||||||
|
preset_file = "molecule/presets/k8s/kubernetes.yml"
|
||||||
|
with open(preset_file, 'r') as f:
|
||||||
|
preset = yaml.safe_load(f)
|
||||||
|
return preset['kind_clusters'][0]['name']
|
||||||
|
|
||||||
|
def run_cmd(cmd):
|
||||||
|
"""Выполняет команду и возвращает результат"""
|
||||||
|
print(f"[run] {cmd}")
|
||||||
|
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
|
||||||
|
if result.returncode != 0:
|
||||||
|
print(f"[error] {result.stderr}")
|
||||||
|
else:
|
||||||
|
print(result.stdout)
|
||||||
|
return result
|
||||||
|
|
||||||
|
def get_portforward_pids():
|
||||||
|
"""Получает PID процессов port-forward"""
|
||||||
|
result = subprocess.run("ps aux | grep 'kubectl.*port-forward' | grep -v grep", shell=True, capture_output=True, text=True)
|
||||||
|
pids = []
|
||||||
|
for line in result.stdout.split('\n'):
|
||||||
|
if line.strip():
|
||||||
|
pids.append(int(line.split()[1]))
|
||||||
|
return pids
|
||||||
|
|
||||||
|
def list_portforwards():
|
||||||
|
"""Показывает список всех активных port-forward"""
|
||||||
|
pids = get_portforward_pids()
|
||||||
|
if not pids:
|
||||||
|
print("❌ Нет активных port-forward")
|
||||||
|
return
|
||||||
|
|
||||||
|
print("📋 Активные port-forward:")
|
||||||
|
result = subprocess.run("ps aux | grep 'kubectl.*port-forward' | grep -v grep", shell=True, capture_output=True, text=True)
|
||||||
|
for line in result.stdout.split('\n'):
|
||||||
|
if line.strip():
|
||||||
|
print(f" {line}")
|
||||||
|
|
||||||
|
def clear_portforwards():
|
||||||
|
"""Завершает все процессы port-forward"""
|
||||||
|
pids = get_portforward_pids()
|
||||||
|
if not pids:
|
||||||
|
print("❌ Нет активных port-forward")
|
||||||
|
return
|
||||||
|
|
||||||
|
print(f"🗑️ Завершение {len(pids)} процессов port-forward...")
|
||||||
|
for pid in pids:
|
||||||
|
try:
|
||||||
|
os.kill(pid, signal.SIGTERM)
|
||||||
|
print(f"✅ Процесс {pid} завершен")
|
||||||
|
except ProcessLookupError:
|
||||||
|
print(f"⚠️ Процесс {pid} уже не существует")
|
||||||
|
|
||||||
|
# Ждем завершения процессов
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
|
# Принудительно убиваем оставшиеся
|
||||||
|
remaining_pids = get_portforward_pids()
|
||||||
|
if remaining_pids:
|
||||||
|
print("⚠️ Принудительное завершение оставшихся процессов...")
|
||||||
|
for pid in remaining_pids:
|
||||||
|
try:
|
||||||
|
os.kill(pid, signal.SIGKILL)
|
||||||
|
print(f"✅ Процесс {pid} принудительно завершен")
|
||||||
|
except ProcessLookupError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def create_portforwards():
|
||||||
|
"""Создает port-forward для всех сервисов из preset на локальном компьютере"""
|
||||||
|
# Загружаем preset
|
||||||
|
preset_file = "molecule/presets/k8s/kubernetes.yml"
|
||||||
|
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', {})
|
||||||
|
|
||||||
|
# Получаем kubeconfig из контейнера k8s-controller
|
||||||
|
print(f"🔌 Создание port-forward для кластера: {cluster_name}")
|
||||||
|
print("📋 Получение kubeconfig из контейнера k8s-controller...")
|
||||||
|
|
||||||
|
# Копируем kubeconfig из контейнера
|
||||||
|
result = subprocess.run(
|
||||||
|
f"docker exec k8s-controller kind get kubeconfig --name {cluster_name}",
|
||||||
|
shell=True, capture_output=True, text=True
|
||||||
|
)
|
||||||
|
|
||||||
|
if result.returncode != 0:
|
||||||
|
print(f"❌ Ошибка получения kubeconfig: {result.stderr}")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Сохраняем kubeconfig во временный файл
|
||||||
|
kubeconfig_file = "/tmp/kubeconfig-lab.yaml"
|
||||||
|
with open(kubeconfig_file, 'w') as f:
|
||||||
|
f.write(result.stdout)
|
||||||
|
|
||||||
|
# Меняем server с 0.0.0.0 на localhost для локального доступа
|
||||||
|
subprocess.run(f"sed -i.bak 's|server: https://0.0.0.0:6443|server: https://localhost:6443|g' {kubeconfig_file}", shell=True)
|
||||||
|
|
||||||
|
print("✅ Kubeconfig подготовлен")
|
||||||
|
|
||||||
|
# Ingress HTTP (80)
|
||||||
|
if addon_ports.get('ingress_http'):
|
||||||
|
port = addon_ports['ingress_http']
|
||||||
|
print(f" - Ingress HTTP: localhost:{port} -> ingress-nginx-controller:80")
|
||||||
|
subprocess.Popen([
|
||||||
|
"kubectl",
|
||||||
|
f"--kubeconfig={kubeconfig_file}",
|
||||||
|
"port-forward",
|
||||||
|
"-n", "ingress-nginx",
|
||||||
|
"svc/ingress-nginx-controller",
|
||||||
|
f"{port}:80"
|
||||||
|
], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
||||||
|
|
||||||
|
# Ingress HTTPS (443)
|
||||||
|
if addon_ports.get('ingress_https'):
|
||||||
|
port = addon_ports['ingress_https']
|
||||||
|
print(f" - Ingress HTTPS: localhost:{port} -> ingress-nginx-controller:443")
|
||||||
|
subprocess.Popen([
|
||||||
|
"kubectl",
|
||||||
|
f"--kubeconfig={kubeconfig_file}",
|
||||||
|
"port-forward",
|
||||||
|
"-n", "ingress-nginx",
|
||||||
|
"svc/ingress-nginx-controller",
|
||||||
|
f"{port}:443"
|
||||||
|
], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
||||||
|
|
||||||
|
# Prometheus
|
||||||
|
if addon_ports.get('prometheus'):
|
||||||
|
port = addon_ports['prometheus']
|
||||||
|
print(f" - Prometheus: localhost:{port} -> monitoring/monitoring-kube-prometheus-prometheus:9090")
|
||||||
|
subprocess.Popen([
|
||||||
|
"kubectl",
|
||||||
|
f"--kubeconfig={kubeconfig_file}",
|
||||||
|
"port-forward",
|
||||||
|
"-n", "monitoring",
|
||||||
|
"svc/monitoring-kube-prometheus-prometheus",
|
||||||
|
f"{port}:9090"
|
||||||
|
], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
||||||
|
|
||||||
|
# Grafana
|
||||||
|
if addon_ports.get('grafana'):
|
||||||
|
port = addon_ports['grafana']
|
||||||
|
print(f" - Grafana: localhost:{port} -> monitoring/monitoring-grafana:80")
|
||||||
|
subprocess.Popen([
|
||||||
|
"kubectl",
|
||||||
|
f"--kubeconfig={kubeconfig_file}",
|
||||||
|
"port-forward",
|
||||||
|
"-n", "monitoring",
|
||||||
|
"svc/monitoring-grafana",
|
||||||
|
f"{port}:80"
|
||||||
|
], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
||||||
|
|
||||||
|
# Kiali
|
||||||
|
if addon_ports.get('kiali'):
|
||||||
|
port = addon_ports['kiali']
|
||||||
|
print(f" - Kiali: localhost:{port} -> istio-system/kiali:20001")
|
||||||
|
subprocess.Popen([
|
||||||
|
"kubectl",
|
||||||
|
f"--kubeconfig={kubeconfig_file}",
|
||||||
|
"port-forward",
|
||||||
|
"-n", "istio-system",
|
||||||
|
"svc/kiali",
|
||||||
|
f"{port}:20001"
|
||||||
|
], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
||||||
|
|
||||||
|
# Metrics Server
|
||||||
|
if addon_ports.get('metrics_server'):
|
||||||
|
port = addon_ports['metrics_server']
|
||||||
|
print(f" - Metrics Server: localhost:{port} -> kube-system/metrics-server:4443")
|
||||||
|
subprocess.Popen([
|
||||||
|
"kubectl",
|
||||||
|
f"--kubeconfig={kubeconfig_file}",
|
||||||
|
"port-forward",
|
||||||
|
"-n", "kube-system",
|
||||||
|
"svc/metrics-server",
|
||||||
|
f"{port}:4443"
|
||||||
|
], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
||||||
|
|
||||||
|
time.sleep(2)
|
||||||
|
print("✅ Port-forward создан")
|
||||||
|
list_portforwards()
|
||||||
|
|
||||||
|
def delete_portforward(port):
|
||||||
|
"""Удаляет port-forward для конкретного порта"""
|
||||||
|
pids = get_portforward_pids()
|
||||||
|
if not pids:
|
||||||
|
print(f"❌ Нет активных port-forward на порту {port}")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Находим процесс с нужным портом
|
||||||
|
result = subprocess.run(f"ps aux | grep 'kubectl.*port-forward.*:{port}' | grep -v grep", shell=True, capture_output=True, text=True)
|
||||||
|
if not result.stdout.strip():
|
||||||
|
print(f"❌ Не найден port-forward на порту {port}")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Извлекаем PID
|
||||||
|
pid = int(result.stdout.split()[1])
|
||||||
|
print(f"🗑️ Завершение port-forward на порту {port} (PID: {pid})...")
|
||||||
|
try:
|
||||||
|
os.kill(pid, signal.SIGTERM)
|
||||||
|
print(f"✅ Port-forward на порту {port} завершен")
|
||||||
|
except ProcessLookupError:
|
||||||
|
print(f"⚠️ Процесс {pid} уже не существует")
|
||||||
|
|
||||||
|
def recreate_portforwards():
|
||||||
|
"""Пересоздает port-forward: удаляет существующие и создает заново"""
|
||||||
|
print("🔄 Пересоздание port-forward...")
|
||||||
|
clear_portforwards()
|
||||||
|
time.sleep(1)
|
||||||
|
create_portforwards()
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if len(sys.argv) < 2:
|
||||||
|
print("Usage: portforward.py <create|list|delete|clear|recreate> [port]")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
command = sys.argv[1]
|
||||||
|
|
||||||
|
if command == "create":
|
||||||
|
create_portforwards()
|
||||||
|
elif command == "list":
|
||||||
|
list_portforwards()
|
||||||
|
elif command == "clear":
|
||||||
|
clear_portforwards()
|
||||||
|
elif command == "recreate":
|
||||||
|
recreate_portforwards()
|
||||||
|
elif command == "delete":
|
||||||
|
if len(sys.argv) < 3:
|
||||||
|
print("Usage: portforward.py delete <port>")
|
||||||
|
sys.exit(1)
|
||||||
|
port = sys.argv[2]
|
||||||
|
delete_portforward(port)
|
||||||
|
else:
|
||||||
|
print(f"❌ Неизвестная команда: {command}")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Автоматическая настройка CI/CD для AnsibleLab
|
# Автоматическая настройка CI/CD для DevOpsLab
|
||||||
# Автор: Сергей Антропов
|
# Автор: Сергей Антропов
|
||||||
# Сайт: https://devops.org.ru
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
echo "🔧 Настройка CI/CD для AnsibleLab..."
|
echo "🔧 Настройка CI/CD для DevOpsLab..."
|
||||||
|
|
||||||
# Создание директории .github/workflows
|
# Создание директории .github/workflows
|
||||||
mkdir -p .github/workflows
|
mkdir -p .github/workflows
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Скрипт для тестирования собственных образов AnsibleLab
|
# Скрипт для тестирования собственных образов DevOpsLab
|
||||||
# Автор: Сергей Антропов
|
# Автор: Сергей Антропов
|
||||||
# Сайт: https://devops.org.ru
|
# Сайт: https://devops.org.ru
|
||||||
|
|
||||||
@@ -190,7 +190,7 @@ cleanup() {
|
|||||||
|
|
||||||
# Основная функция
|
# Основная функция
|
||||||
main() {
|
main() {
|
||||||
log "🚀 Тестирование собственных образов AnsibleLab"
|
log "🚀 Тестирование собственных образов DevOpsLab"
|
||||||
echo "=========================================="
|
echo "=========================================="
|
||||||
|
|
||||||
# Проверки
|
# Проверки
|
||||||
|
|||||||
@@ -1,80 +1,51 @@
|
|||||||
$ANSIBLE_VAULT;1.1;AES256
|
$ANSIBLE_VAULT;1.1;AES256
|
||||||
35343565303431363831646439663864653034633332396533656362393138666235353365613631
|
34663739653463366234613631353064393733363234323430333465393362666165373562303565
|
||||||
6633313964346463653166333131316161643064626539300a366366383264653236643366343861
|
3037663539383033313563623635393536366438316433320a623361306663373332326165326633
|
||||||
36643265643338346263663332663961613132613662303033386563356235666334613763303232
|
37336136343965616234663462333165363965323362326266373566303238303033663336333331
|
||||||
3332636435353130380a643031343335306330643964363230333363653761376333306232663263
|
3435343232613563630a626639343461613239643532663138303630373739623836326238646236
|
||||||
37613937376662386563366237666630623935653663316235363037613962616663373534633066
|
35346264346231353364363065393266623934323964363163623964643162306461633431616233
|
||||||
36356639656662653339613534373630326164303536633466613238306530326661343065376632
|
62663339353134616130623862383332343037363739366237383638373638366363306231663635
|
||||||
63646330376662643836636539333837313366656237626264336130636139376665346162303834
|
35373638346338386366636235616366323433636164333434313831613465343335366237366131
|
||||||
39366235333833303839646530663963346234316661306663356261316537663333326363326333
|
65626562373532623263373430383531313631613638643466636661613763316465313833643030
|
||||||
34386536343137333736356139636461653737353062613730326665383761356337663264356539
|
66346130393131383037386464353239663232636561666638333937346236613438616265313363
|
||||||
64623962363631356131373735643639333065663861336262346366313163303739306663616635
|
65373766363866386466613035373266663235656537336431643931373131333435383761663937
|
||||||
63386534333936356636623532653339366464346531326562623062353839333563346562383832
|
33626230343833656162623263363230383362393233393166346661303162353762613433376663
|
||||||
38656166626366653930343436633338363530313138323862353563323033306333353130383732
|
61346236666338646534656138363030313562346465346563613266653930623532353765326234
|
||||||
63323931336338663663383532313635373166616631333832666330393933646165336164353634
|
38373562613438653364323465363337363066313638373232643439386137623136313066306362
|
||||||
30666137626131636162333335373961343763383434386166346363626162663538653239633563
|
39386437353233366563613962653837383664343462666537323335373839383334346364306361
|
||||||
64316539626632346133346339616164646336306331393466306333623638366137613866663263
|
64366362396333643830313766373330613832323739306530333664333737343239393964643831
|
||||||
37623663316462376330643866303464366236613965663561383561643162393032663266383661
|
34373736663132383134343334353234633061303335363364333339386331663962363334316231
|
||||||
63643466396433366530613830636666393862383134313165313162663262623536306164313633
|
30663438376632326334383231363737333534633939316363366436633266323665363062343431
|
||||||
65383031646562356535626363326135656366323462383364306138626163363236333036316534
|
37616137393932626433623962636537376238326466326136396532636666643234323639316235
|
||||||
36353364626130633965353036636430393035316434393063373062363362663430633462313631
|
36306137656431626162343231616530663637323835346139323734393066623039396466346264
|
||||||
65373330646531333334623738653537623963663237663137306430656438316665623534313362
|
62656161366663303838383661623966373265393130616431663331636234626231343632333831
|
||||||
36303934306331393365363866393265646263653830666234333234623266353634393239633337
|
62313037336261313939636636626133656136366161346439663530373530383338393764366239
|
||||||
32663938613831656138376266333835613561643534663463373238323532313237336132613239
|
63626634303866636636636366323539326534363461306333663638613261313164373961633866
|
||||||
31383665373964623362623561313161363831316361626432636665343938633437336561363161
|
33656632633465663431643938313035303366376536343434333231353932303065306662393933
|
||||||
30366136383766356261396533356134326532353938326439303334396333363036363563653030
|
37643134306535303036363130356435633039616637653363303164376335393665386334353664
|
||||||
33353538316363353637313835636535653136346234316636626533663331653163643466633164
|
64366562353933633063353166666636333563613562386632616163376166626462393261376438
|
||||||
35633630316162396665626632363036373331343230306665313037336666663066653763653835
|
37306131666232633330656464613133313032303333623735326439616166323765393766393036
|
||||||
34643532386138363665663238393336356431353464613031336334623761613732646565363730
|
63336538336166633534643063353864636131353232393433313961333234386337616139613133
|
||||||
34353866616339616164663934626632663130393563646265343461303533653139653137303661
|
65303666393431623031373966396632333536613664363239616236623338306336313331313062
|
||||||
30663539616162333739313366363861336562346132373861393734323366663863333063396232
|
36346338326161653664646537656538626535613561353739396134323537666563386136343238
|
||||||
34373435306161383462306136333734303339353231386432313637343236356439626537663530
|
66396666323234316237656137306666376439633261376233366234323834383963313138666366
|
||||||
33633331376439643732306365366530636134366431396566376330663162336334353031353834
|
31653238303633353164636263643934326466636664386265383762323138333466323332643732
|
||||||
32636435656131616133643636363965316634626231356630323237613261663665393061616432
|
62313462316431383061663166363834666234386163393030643265336333316232626561353031
|
||||||
35333031306562626234363061316562373964386236636464633939343437396234313036383561
|
61353639333435303237666232643830336530353735656137333338643730343835346264306265
|
||||||
31646463313037323133616561633562323765303361346430313134316337626139663665326436
|
61373662623863323430656166376338306463373835333661353466653261633636383764363366
|
||||||
31616334356663346234663833396635373162346136663062363138373034356638636537353737
|
38323835666531633233326264323330616139313431353763343061393661333038363864383863
|
||||||
62336563333338343731626665323336386632303162383166346338373864613463326466386361
|
62323239316135643231626661663237636466653763636433613039633661386531343161613838
|
||||||
37356135376430363038656439376366646238383736636461613034666163623838393236346464
|
64383834663530636530363133396431383738636638333661636239643264623365353564653964
|
||||||
34356563366234306465366438326265366133663934323663313934313037313663633833343533
|
64376131323239663633303662333438636431313262316639363531323930396238646665343262
|
||||||
38326163323438376336313065313338303239303766326636326433366566643935626530643537
|
38393764643062343531326365393536653862653735393035623465386134633163323635356530
|
||||||
61313738313361353835373430386430343738356461633335396165323337623832663330383834
|
38303365376561666133663639376234323363356264336566666565383933373330356562643063
|
||||||
61666363663939353238623861653962636638303138626435373366336130653565333532616664
|
34663832613339376232663561323261653937333339313862613164656436323239623239613664
|
||||||
61643734393733646364623937356264306262366266396536656338343366306364663339656236
|
66383131613434366133663833663734313437376461663530366166323361643566393835626334
|
||||||
63316635623037616266613739326335353066373463643132393331626232303134346233303833
|
35383437376663326232336630386662386435663933303635616431376463333461316262666663
|
||||||
61303738383961636235616634356435313165613734336438333730353463313366653332626263
|
63393330656665356138613663333565616230366338396361333265396562306438613263363035
|
||||||
61353731323133393735333664366134633434346130646164336665386264376265316266386665
|
63626662396131623431353462376364656265373363383737303034363336313330656663626161
|
||||||
65613431303733376637643536646561636163633065393966333161313930356636353936663239
|
33396161373730303239623338323564386139333838393661323466363035616635663765316238
|
||||||
36326561653132373335616237303764333661303961373139646663653431346338356331373765
|
61636563356665616435653064316334633530643731366239383530346532336366666230613730
|
||||||
37333865333563333338666338633665316238396438333630306663383164383234636237393562
|
38613566346131303863663463656534306530383364383031653964333939353536633262636635
|
||||||
32356130653538383632633462303665333733333365343237626262636563346361363764313663
|
37643662323333356639663363636430626361343830663261623234343161643733633130613534
|
||||||
34306337636665633431353438373661306336396533613936313866623337343538613036353233
|
3039653530613936353962373738396265656264636263656333
|
||||||
66623936343762383033323830333266643463376138643133643434353135656261393733313433
|
|
||||||
38303264303332643361376162303330343666636162396163366365353465623132663831323530
|
|
||||||
33346565353262376131623431343538616533326564383637396538343336626336646633353934
|
|
||||||
61376462656263663965383137376131643536336539613532373536376231626364643866646535
|
|
||||||
38646430326138643339396464366438393263313665636562356631326133313734343562363065
|
|
||||||
61663766616633333262623633396363336536373666316536363931333939383838663131613439
|
|
||||||
66616663383334363330646638393139313330363533306639623437663763623333343038373838
|
|
||||||
63303932663436636361663338346665386531333533633730323735333734376662383835343163
|
|
||||||
38623435333662333634376361303734653130663833376264376336663363623966363939623336
|
|
||||||
66656532663431333132663734386538663066323230356166356238333564336230633030353233
|
|
||||||
61333933333763666564313233333432366231383666333832393035656234326161323332653135
|
|
||||||
34323032613535336666633830373866383832393166636565646132633763616230326530346462
|
|
||||||
63653638383263323532653261353365313433346534323865616336383864363530643237613061
|
|
||||||
32613737353431626366643066663864663866323363396230333335346362373262393332333939
|
|
||||||
34393539363836656539623766346336383834323831346261343635346466383164376135353136
|
|
||||||
33366333323765616330333735383163663736646466653265326335306366663832643162363035
|
|
||||||
39326661313732303830333236653134346534656433366366663539626364663362626135666438
|
|
||||||
32356635386262336635396162666334616139353134323366633165626363336338393165663933
|
|
||||||
62643431616632653838376239326531643733303636323236613561626534343535383130623766
|
|
||||||
66343734396561386661306235393865336236323261356461356264326535316437653131326435
|
|
||||||
38663866383332393033356165663032656433383763656431323836353961633437623662303135
|
|
||||||
61373836626564373331303362313062313235373731646234393532343430363235326630373831
|
|
||||||
35313635643936663438316132623265306531383838633266336563613662386233663937616230
|
|
||||||
33333933353831396534356461653537616536633365323364326666323833346432636536643737
|
|
||||||
31663065303933316438653864313734366464616137333838643839313437623532333766373763
|
|
||||||
35346237383433643032613630396364386464316133343764666431636330333463333037306431
|
|
||||||
35353232633463363732346462663230376631363832363239396262643531393831306633663966
|
|
||||||
64333136343662343564653935306438663233623332626337613931353861396562663334346537
|
|
||||||
353330613139383830303838353838356233
|
|
||||||
|
|||||||
Reference in New Issue
Block a user