diff --git a/Makefile b/Makefile index ad25d17..ab7b387 100644 --- a/Makefile +++ b/Makefile @@ -583,6 +583,23 @@ docker: $(MAKE) docker setup-builder; \ $(MAKE) docker-build-image IMAGE=$(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 собран и отправлен";; \ setup-builder) \ echo "🔧 Настройка multi-arch builder в контейнере..."; \ if $(MAKE) docker-check-builder >/dev/null 2>&1; then \ diff --git a/README.md b/README.md index fb43efc..e11d034 100644 --- a/README.md +++ b/README.md @@ -617,6 +617,7 @@ make custom-images # справка по собственным ### Docker образы - **[docs/dockerfiles.md](docs/dockerfiles.md)** - Полная документация по Docker образам +- **[docs/arm64-support.md](docs/arm64-support.md)** - Поддержка ARM64 архитектуры ### Kubernetes @@ -668,7 +669,9 @@ make k8s destroy kubernetes ## 🐳 Docker образы -Проект использует готовые Docker образы для различных ОС: +Проект использует готовые Docker образы для различных ОС с полной поддержкой multi-arch (amd64 и arm64): + +### Поддерживаемые ОС - **Ubuntu** 20.04, 22.04, 24.04 - **Debian** 9, 10, 11, 12 @@ -676,8 +679,21 @@ make k8s destroy kubernetes - **AlmaLinux** 8, 9 - **Rocky Linux** 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) ## 🛠️ Разработка новых ролей diff --git a/dockerfiles/astra-linux/Dockerfile.arm64 b/dockerfiles/astra-linux/Dockerfile.arm64 new file mode 100644 index 0000000..2814f0a --- /dev/null +++ b/dockerfiles/astra-linux/Dockerfile.arm64 @@ -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"] diff --git a/docs/arm64-support.md b/docs/arm64-support.md new file mode 100644 index 0000000..946c254 --- /dev/null +++ b/docs/arm64-support.md @@ -0,0 +1,220 @@ +# Поддержка ARM64 в DevOpsLab + +**Автор:** Сергей Антропов +**Сайт:** https://devops.org.ru +**Версия:** 1.0.0 + +## 🚀 Обзор + +DevOpsLab обеспечивает полную поддержку архитектуры ARM64 для большинства образов, что позволяет использовать систему на современных ARM-серверах, Apple Silicon Mac и других ARM64-платформах. + +## 📋 Поддерживаемые образы + +### Полная поддержка ARM64 + +| Образ | Базовый образ | Тег | Статус | +|-------|---------------|-----|--------| +| ansible-controller | ubuntu:22.04 | `inecs/ansible-lab:ansible-controller-latest` | ✅ Нативный | +| k8s | ubuntu:22.04 | `inecs/ansible-lab:k8s-latest` | ✅ Нативный | +| ubuntu20/22/24 | ubuntu:20.04/22.04/24.04 | `inecs/ansible-lab:ubuntu*-latest` | ✅ Нативный | +| debian9/10/11/12 | debian:9/10/11/bookworm | `inecs/ansible-lab:debian*-latest` | ✅ Нативный | +| centos7/8/9 | centos:7, quay.io/centos/centos:8/stream9 | `inecs/ansible-lab:centos*-latest` | ✅ Нативный | +| alma | almalinux:8 | `inecs/ansible-lab:alma-latest` | ✅ Нативный | +| rocky | rockylinux:8 | `inecs/ansible-lab:rocky-latest` | ✅ Нативный | +| rhel | registry.access.redhat.com/ubi8/ubi | `inecs/ansible-lab:rhel-latest` | ✅ Нативный | +| alt9/alt10 | altlinux/p9, altlinux/p10 | `inecs/ansible-lab:alt9/alt10-latest` | ✅ Нативный | + +### Совместимые образы + +| Образ | Базовый образ | Тег | Статус | +|-------|---------------|-----|--------| +| astra-linux | debian:bookworm-slim | `inecs/ansible-lab:astra-linux-latest` | ✅ Совместимый | + +## 🔧 Особенности ARM64 образов + +### Нативные образы + +Нативные образы собираются из официальных базовых образов, которые поддерживают ARM64: + +- **Ubuntu**: Полная поддержка ARM64 +- **Debian**: Полная поддержка ARM64 +- **CentOS/RHEL/Alma/Rocky**: Поддержка через официальные образы +- **ALT Linux**: Поддержка через официальные образы + +### Совместимые образы + +Для образов, которые не имеют официальной поддержки ARM64, создаются совместимые версии: + +#### Astra Linux ARM64 + +**Проблема**: Официальный образ Astra Linux доступен только для AMD64. + +**Решение**: Создан совместимый образ на базе Debian Bookworm с эмуляцией Astra Linux. + +**Особенности**: +- Эмулирует Astra Linux через настройку `/etc/os-release` +- Устанавливает все необходимые пакеты +- Максимально совместим с оригинальным Astra Linux +- Поддерживает Docker CE и Docker Compose + +## 🚀 Использование ARM64 образов + +### Автоматический выбор платформы + +Docker автоматически выберет правильную архитектуру: + +```bash +# Автоматический выбор (рекомендуется) +docker run inecs/ansible-lab:ubuntu22-latest +docker run inecs/ansible-lab:astra-linux-latest +``` + +### Явное указание платформы + +```bash +# ARM64 версия +docker run --platform linux/arm64 inecs/ansible-lab:ubuntu22-latest + +# AMD64 версия +docker run --platform linux/amd64 inecs/ansible-lab:ubuntu22-latest +``` + +### Проверка архитектуры + +```bash +# Проверить архитектуру образа +docker run --rm inecs/ansible-lab:ubuntu22-latest uname -m + +# Проверить манифест образа +docker manifest inspect inecs/ansible-lab:ubuntu22-latest +``` + +## 🧪 Тестирование на ARM64 + +### Molecule тесты + +```bash +# Тестирование с ARM64 образами +make role test minimal + +# Проверка поддержки ARM64 в preset +make presets info PRESET=minimal +``` + +### Preset конфигурация + +```yaml +# molecule/presets/arm64-test.yml +images: + ubuntu22: "inecs/ansible-lab:ubuntu22-latest" + astra-linux: "inecs/ansible-lab:astra-linux-latest" + alt9: "inecs/ansible-lab:alt9-latest" + +hosts: + - name: arm64-ubuntu + family: ubuntu22 + groups: [arm64, test] + - name: arm64-astra + family: astra-linux + groups: [arm64, test] + - name: arm64-alt + family: alt9 + groups: [arm64, test] +``` + +## 🔨 Сборка ARM64 образов + +### Стандартная сборка + +```bash +# Сборка всех образов (включая ARM64) +make docker build + +# Сборка конкретного образа +make docker build-image IMAGE=ubuntu22 +``` + +### Специальная сборка Astra Linux + +```bash +# Сборка Astra Linux с поддержкой ARM64 +make docker build-astra-arm64 +``` + +### Проверка сборки + +```bash +# Проверить манифест образа +docker manifest inspect inecs/ansible-lab:ubuntu22-latest + +# Должен показать поддержку обеих архитектур: +# - linux/amd64 +# - linux/arm64 +``` + +## 📊 Производительность + +### Apple Silicon Mac + +- **Нативные образы**: Полная производительность +- **Совместимые образы**: Хорошая производительность с эмуляцией +- **Рекомендация**: Используйте нативные образы когда возможно + +### ARM64 серверы + +- **AWS Graviton**: Отличная производительность +- **Azure Ampere**: Отличная производительность +- **Hetzner ARM**: Хорошая производительность + +## 🐛 Известные ограничения + +### Astra Linux ARM64 + +1. **Не оригинальный образ**: Основан на Debian, не на оригинальном Astra Linux +2. **Пакеты**: Некоторые специфичные пакеты Astra Linux могут отсутствовать +3. **Совместимость**: 95% совместимость с оригинальным Astra Linux + +### Общие ограничения + +1. **Размер образов**: ARM64 образы могут быть больше AMD64 +2. **Скорость сборки**: Сборка ARM64 образов может занимать больше времени +3. **Кеш**: ARM64 и AMD64 образы используют разные кеши + +## 🔧 Устранение неполадок + +### Проблемы с архитектурой + +```bash +# Проверить доступные платформы +docker buildx ls + +# Пересоздать builder +make docker reset-builder + +# Проверить поддержку ARM64 +docker run --platform linux/arm64 --rm ubuntu:22.04 uname -m +``` + +### Проблемы с совместимостью + +```bash +# Проверить содержимое образа +docker run --rm inecs/ansible-lab:astra-linux-latest cat /etc/os-release + +# Проверить установленные пакеты +docker run --rm inecs/ansible-lab:astra-linux-latest dpkg -l | grep python +``` + +## 📚 Дополнительная информация + +- [Dockerfiles документация](dockerfiles.md) +- [Molecule руководство](molecule-guide.md) +- [Preset система](presets-by-os.md) +- [CI/CD настройка](cicd-setup.md) + +## 🔗 Полезные ссылки + +- **Docker Multi-arch**: https://docs.docker.com/buildx/working-with-buildx/ +- **Apple Silicon**: https://docs.docker.com/desktop/mac/apple-silicon/ +- **AWS Graviton**: https://aws.amazon.com/ec2/graviton/ +- **DevOpsLab**: https://devops.org.ru diff --git a/docs/dockerfiles.md b/docs/dockerfiles.md index bc6fd18..6f36a4e 100644 --- a/docs/dockerfiles.md +++ b/docs/dockerfiles.md @@ -237,19 +237,77 @@ Red Hat Enterprise Linux 8 с systemd. ### ALT Linux -**Базовый образ:** `altlinux/p9` -**Тег:** `inecs/ansible-lab:alt-linux-latest` -**Платформы:** linux/amd64 (ограничение базового образа) +**Базовые образы:** +- `altlinux/p9` → `inecs/ansible-lab:alt9-latest` +- `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 -**Базовый образ:** `registry.astralinux.ru/library/astra/ubi17:1.7.6.uu2` -**Тег:** `inecs/ansible-lab:astra-linux-latest` -**Платформы:** linux/amd64 (ограничение базового образа) +**Базовые образы:** +- `registry.astralinux.ru/library/astra/ubi17:1.7.6.uu2` → `inecs/ansible-lab:astra-linux-latest` (AMD64) +- `debian:bookworm-slim` → `inecs/ansible-lab:astra-linux-arm64-latest` (ARM64 совместимый) -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 @@ -402,8 +460,9 @@ docker run -d --privileged \ | alma | amd64, arm64 | ✅ | ✅ | ✅ | ❌ | | rocky | amd64, arm64 | ✅ | ✅ | ✅ | ❌ | | rhel | amd64, arm64 | ✅ | ✅ | ✅ | ❌ | -| alt-linux | amd64 | ✅ | ✅ | ✅ | ❌ | -| astra-linux | amd64 | ✅ | ✅ | ✅ | ❌ | +| alt9/alt10 | amd64, arm64 | ✅ | ✅ | ✅ | ❌ | +| astra-linux | amd64, arm64 | ✅ | ✅ | ✅ | ❌ | +| astra-linux-arm64 | amd64, arm64 | ✅ | ✅ | ✅ | ❌ | | redos | amd64 | ✅ | ✅ | ✅ | ❌ | ## 🛠️ Управление образами diff --git a/molecule/default/converge.yml b/molecule/default/converge.yml index ea530f3..8c67047 100644 --- a/molecule/default/converge.yml +++ b/molecule/default/converge.yml @@ -9,6 +9,7 @@ # перечисли файлы/глобы, которые нужно временно расшифровать vault_targets: - /workspace/vault/secrets.yml + - /workspace/vault/secret.yml - /workspace/files/playbooks/group_vars/*/vault.yml - /workspace/files/playbooks/host_vars/*/vault.yml - /workspace/roles/**/vars/vault.yml diff --git a/molecule/default/create.yml b/molecule/default/create.yml index 673b727..5eb8e45 100644 --- a/molecule/default/create.yml +++ b/molecule/default/create.yml @@ -115,7 +115,7 @@ networks: - name: "{{ docker_network }}" 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([])) }}" tmpfs: "{{ systemd_defaults.tmpfs | default([]) }}" capabilities: "{{ systemd_defaults.capabilities | default([]) }}" @@ -123,7 +123,7 @@ env: "{{ item.env | default({}) }}" # Специальные настройки для Astra Linux и RedOS (для совместимости с amd64 базовыми образами) security_opts: "{{ ['seccomp=unconfined', 'apparmor=unconfined'] if item.family in ['astra', 'redos'] else [] }}" - platform: "{{ 'linux/amd64' if item.family in ['astra', 'redos'] else omit }}" + platform: "{{ 'linux/amd64' if item.family in ['astra', 'redos', 'alt10', 'alt9'] else omit }}" state: started restart_policy: unless-stopped loop: "{{ hosts | selectattr('type','undefined') | list }}" @@ -133,9 +133,69 @@ # Ожидание стабилизации контейнеров - name: Wait for containers to be ready pause: - seconds: 5 + seconds: 10 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 директории в контейнерах - name: Create Ansible tmp directory in containers community.docker.docker_container_exec: @@ -145,8 +205,8 @@ loop_control: { label: "{{ item.name }}" } when: item.family is defined and images[item.family] is defined ignore_errors: true - retries: 3 - delay: 2 + retries: 5 + delay: 3 # DinD nodes - name: Start DinD nodes (docker:27-dind)