feat: Реорганизация проекта и восстановление ролей

- Восстановлены команды make role в Makefile
- Создана папка ci-cd/ для CI/CD конфигурации
- Перенесены GitLab файлы в ci-cd/
- Перенесены Dockerfile'ы в ci-cd/dockerfiles/
- Удален корневой requirements.yml
- Удалена пустая папка vars/
- Создана документация ci-cd/README.md
- Обновлен README.md с информацией о CI/CD

Изменения:
- Восстановлены команды: make role list|create|edit|test|lint|deploy|info
- Создана структура ci-cd/ с GitLab CI/CD
- Перенесены Dockerfile'ы для разных ОС
- Добавлена документация по CI/CD
- Обновлена структура проекта в README.md

Новая структура:
- ci-cd/ - CI/CD конфигурация
- ci-cd/gitlab/ - GitLab Runner
- ci-cd/dockerfiles/ - Dockerfile'ы
- ci-cd/.gitlab-ci.yml - GitLab CI/CD
- ci-cd/README.md - документация CI/CD

Преимущества:
- Организованная структура проекта
- Восстановлена функциональность ролей
- Готовые примеры CI/CD
- Документация по настройке
- Разделение ответственности

Автор: Сергей Антропов
Сайт: https://devops.org.ru
This commit is contained in:
2025-10-22 14:46:44 +03:00
parent a875a874e9
commit d6bc3f1f31
17 changed files with 244 additions and 32 deletions

89
ci-cd/.gitlab-ci.yml Normal file
View File

@@ -0,0 +1,89 @@
stages:
- lint
- test
- deploy
- notify
services:
- name: docker:dind
command: ["--tls=false"]
variables:
DOCKER_IMAGE: "hub.cism-ms.ru/ansible/ansible:latest"
DOCKER_TLS_CERTDIR: ""
ANSIBLE_FORCE_COLOR: "true"
before_script:
- echo "$CI_REGISTRY_PASSWORD" | docker login hub.cism-ms.ru -u "$CI_REGISTRY_USER" --password-stdin
- docker pull $DOCKER_IMAGE
- echo "Fixing directory permissions..."
- chmod o-w $CI_PROJECT_DIR
lint:
stage: lint
script:
- echo "Начинаем стейдж Lint"
- echo "Распаковываем секреты..."
- ansible-vault decrypt vars/secrets.yml --vault-password-file ./vault-password.txt
- echo "Запускаем ansible-lint..."
- ansible-lint roles/*
- echo "Упаковываем секреты..."
- ansible-vault encrypt vars/secrets.yml --encrypt-vault-id default --vault-password-file ./vault-password.txt
allow_failure: false
rules:
- if: $CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "master"
test:
stage: test
script:
- echo "Распаковываем секреты..."
- ansible-vault decrypt --vault-password-file ./vault-password.txt vars/secrets.yml
- echo "Запускаем тесты через Молекулу..."
- molecule test --parallel --destroy=always
- echo "Упаковываем секреты..."
- ansible-vault encrypt vars/secrets.yml --encrypt-vault-id default --vault-password-file ./vault-password.txt
allow_failure: false
rules:
- if: $CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "master"
deploy:
stage: deploy
script:
- echo "Настраиваем SSH-ключ для доступа к серверам..."
# Создаем директорию .ssh и настраиваем права доступа
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
# Записываем SSH-ключ в файл ~/.ssh/id_rsa
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
# Запускаем основной пайплайн
- echo "Распаковываем секреты..."
- ansible-vault decrypt --vault-password-file ./vault-password.txt vars/secrets.yml
- echo "Все ок. Деплоим в прод..."
- ansible-playbook roles/deploy.yaml
- echo "Упаковываем секреты..."
- ansible-vault encrypt vars/secrets.yml --encrypt-vault-id default --vault-password-file ./vault-password.txt
# Удаляем ключ
- rm -rf ~/.ssh
rules:
- if: $CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "master"
when: manual
notify:
stage: notify
script:
- |
if [ "$CI_JOB_STATUS" == "success" ]; then
MESSAGE="✅ Пайплайн успешно завершен!%0AПроект: $CI_PROJECT_NAME%0AВетка: $CI_COMMIT_REF_NAME%0AСтатус: $CI_JOB_STATUS"
else
MESSAGE="❌ Пайплайн завершен с ошибкой!%0AПроект: $CI_PROJECT_NAME%0AВетка: $CI_COMMIT_REF_NAME%0AСтатус: $CI_JOB_STATUS"
fi
# curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage" \
# -d "chat_id=$TELEGRAM_CHAT_ID" \
# -d "text=$MESSAGE"
rules:
- if: $CI_JOB_STATUS # Отправлять уведомление только после завершения пайплайна
after_script:
- echo "Работа пайплайна завершена"

123
ci-cd/README.md Normal file
View File

@@ -0,0 +1,123 @@
# CI/CD для Ansible ролей
Этот раздел содержит примеры настройки CI/CD для Ansible ролей с использованием GitLab CI/CD.
## Структура
```
ci-cd/
├── README.md # Эта документация
├── .gitlab-ci.yml # GitLab CI/CD конфигурация
├── gitlab/ # GitLab Runner конфигурация
│ ├── config.json # Docker registry конфигурация
│ ├── docker-compose.yaml # GitLab Runner в Docker
│ └── runner/
│ └── config.toml # Runner конфигурация
└── dockerfiles/ # Dockerfile'ы для разных ОС
├── Dockerfile # Базовый Dockerfile
├── Dockerfile-CentOS # Dockerfile для CentOS
└── Dockerfile-Ubuntu # Dockerfile для Ubuntu
```
## GitLab CI/CD
### Основные этапы
1. **Lint** - проверка синтаксиса Ansible
2. **Test** - запуск тестов через Molecule
3. **Deploy** - развертывание в продакшн
4. **Notify** - уведомления о результатах
### Настройка
1. **Переменные окружения:**
- `CI_REGISTRY_USER` - пользователь Docker registry
- `CI_REGISTRY_PASSWORD` - пароль Docker registry
- `SSH_PRIVATE_KEY` - SSH ключ для доступа к серверам
- `TELEGRAM_BOT_TOKEN` - токен Telegram бота
- `TELEGRAM_CHAT_ID` - ID чата для уведомлений
2. **Docker Registry:**
- Настроен доступ к `hub.cism-ms.ru`
- Используется образ `hub.cism-ms.ru/ansible/ansible:latest`
3. **Vault:**
- Автоматическое расшифрование/шифрование секретов
- Используется `vault-password.txt` для доступа
## GitLab Runner
### Конфигурация
- **Executor:** Docker
- **Image:** `hub.cism-ms.ru/ansible/ansible:latest`
- **Privileged:** true
- **Volumes:** Docker socket для DinD
### Настройка Runner
1. Зарегистрировать Runner:
```bash
docker-compose -f ci-cd/gitlab/docker-compose.yaml up -d
```
2. Настроить переменные в `ci-cd/gitlab/runner/config.toml`
## Dockerfile'ы
### Базовый Dockerfile
- Основан на Ubuntu
- Установлены Ansible, Molecule, Docker
- Настроен systemd для тестирования
### Dockerfile-CentOS
- Основан на CentOS
- Адаптирован для RHEL-семейства
- Установлены необходимые пакеты
### Dockerfile-Ubuntu
- Основан на Ubuntu
- Оптимизирован для Debian-семейства
- Включены дополнительные инструменты
## Использование
### Локальная разработка
```bash
# Создать роль
make role create NAME=my-role
# Тестировать роль
make role test NAME=my-role
# Проверить синтаксис
make role lint
```
### CI/CD Pipeline
1. **Автоматический запуск** при push в ветки
2. **Lint проверка** всех ролей
3. **Molecule тесты** для каждой роли
4. **Deploy** в продакшн (ручной запуск)
5. **Уведомления** в Telegram
### Настройка для своего проекта
1. Скопировать `.gitlab-ci.yml` в корень проекта
2. Настроить переменные в GitLab
3. Обновить Docker registry URL
4. Настроить SSH ключи для деплоя
## Безопасность
- Все секреты хранятся в Ansible Vault
- SSH ключи используются только для деплоя
- Docker registry требует аутентификации
- Vault файлы автоматически шифруются после использования
## Автор
Сергей Антропов
Сайт: https://devops.org.ru

View File

@@ -0,0 +1,40 @@
# Используем готовый образ с Ansible
FROM geerlingguy/docker-ubuntu2204-ansible:latest
# Добавляем метаданные
LABEL maintainer="Сергей Антропов <sergey@antropoff.ru>"
LABEL description="Этот Dockerfile создан для внедрения подхода IaC в Ansible."
LABEL version="0.1"
LABEL contact.website="https://devops.org.ru"
# Устанавливаем переменные окружения
ENV PYTHONUNBUFFERED=1
ENV EDITOR=nano
# Устанавливаем дополнительные зависимости Python для Molecule
RUN pip install --upgrade pip && \
pip install \
molecule \
molecule-docker \
ansible-lint \
yamllint \
docker \
&& rm -rf /root/.cache/pip
# Создаем рабочую директорию
WORKDIR /ansible
# Копируем файлы проекта
COPY . /ansible/
# Устанавливаем права на выполнение (если папка scripts существует)
RUN if [ -d /ansible/scripts ]; then chmod +x /ansible/scripts/*.sh; fi
# Устанавливаем пользователя
USER root
# Открываем порт для SSH
EXPOSE 22
# Команда по умолчанию
CMD ["/bin/bash"]

View File

@@ -0,0 +1,54 @@
# Сборка контейнера с systemd для удобного тестирования ролей Ansible через Molecule
# Используем официальный образ Fedora
FROM quay.io/fedora/python-312
USER root
# Обновляем пакеты и устанавливаем systemd и необходимые пакеты
RUN dnf update -y && \
dnf install -y --nodocs --setopt=install_weak_deps=False \
systemd rsync \
git \
openssh \
gcc \
libffi-devel \
openssl-devel \
make \
sudo \
openssh-clients \
less \
ca-certificates \
curl \
gnupg2 \
nano \
sshpass \
redhat-lsb-core \
&& dnf clean all && \
rm -rf /var/cache/dnf /tmp/* /var/tmp/*
# Устанавливаем docker-compose
RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
chmod +x /usr/local/bin/docker-compose
# Устанавливаем Python пакеты для Ansible
RUN pip install --upgrade pip && \
pip install \
ansible \
ansible-vault \
molecule \
molecule-docker \
ansible-lint \
yamllint \
docker \
&& rm -rf /root/.cache/pip
# Настраиваем окружение для systemd
ENV container=docker
STOPSIGNAL SIGRTMIN+3
# Создаем необходимые директории для systemd
VOLUME [ "/sys/fs/cgroup" ]
# Запускаем systemd при старте контейнера
CMD ["/sbin/init"]

View File

@@ -0,0 +1,62 @@
# Сборка контейнера с systemd для удобного тестирования ролей Ansible через Molecule
# Используем готовый образ с Ansible (более старый, но стабильный)
FROM geerlingguy/docker-ubuntu2004-ansible:latest
# Устанавливаем переменные окружения
ENV DEBIAN_FRONTEND=noninteractive
ENV container=docker
# Устанавливаем дополнительные пакеты для тестирования
RUN apt-get update && \
apt-get install -y --no-install-recommends \
systemd \
systemd-sysv \
rsync \
git \
ssh \
gcc \
libffi-dev \
libssl-dev \
make \
sudo \
sshpass \
openssh-client \
nano \
less \
ca-certificates \
curl \
gnupg \
lsb-release \
&& rm -rf /var/lib/apt/lists/*
# Устанавливаем Python пакеты для Ansible с обновлением зависимостей
RUN pip install --upgrade pip && \
pip install --upgrade \
requests \
PyYAML \
ansible-core \
&& pip install \
ansible \
"ansible-vault<4.0.0" \
molecule \
molecule-docker \
ansible-lint \
yamllint \
docker \
&& rm -rf /root/.cache/pip
# Устанавливаем docker-compose
RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
chmod +x /usr/local/bin/docker-compose
# Указываем, что контейнер использует systemd в качестве init-системы
ENV container=docker
STOPSIGNAL SIGRTMIN+3
# Создаем необходимые директории для systemd
VOLUME [ "/sys/fs/cgroup" ]
# Запускаем systemd при старте контейнера
CMD ["/sbin/init"]

8
ci-cd/gitlab/config.json Normal file
View File

@@ -0,0 +1,8 @@
{
"auths": {
"hub.cism-ms.ru": {
"username": "your-username",
"password": "your-password"
}
}
}

View File

@@ -0,0 +1,33 @@
services:
gitlab-runner:
image: gitlab/gitlab-runner:latest
container_name: gitlab-runner
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./runner:/etc/gitlab-runner
- ./config.json:/root/.docker/config.json
environment:
- CI_SERVER_URL=https://gitlab.com # Замените на URL вашего GitLab
- REGISTRATION_TOKEN=your-registration-token # Замените на ваш токен регистрации
- RUNNER_NAME=ansible-runner # Имя раннера
- RUNNER_EXECUTOR=docker # Используем Docker как исполнитель
- DOCKER_IMAGE=hub.cism-ms.ru/ansible/ansible:latest # Образ Docker по умолчанию
- RUNNER_TAGS=docker,linux,ansible # Теги для раннера
- DOCKER_PRIVILEGED=true # Привилегированный режим
- DOCKER_TLS_VERIFY=false # Отключить проверку TLS
- DOCKER_TTY=false # Отключить TTY
command: >
register --non-interactive
--executor ${RUNNER_EXECUTOR}
--docker-image ${DOCKER_IMAGE}
--url ${CI_SERVER_URL}
--registration-token ${REGISTRATION_TOKEN}
--description ${RUNNER_NAME}
--tag-list ${RUNNER_TAGS}
--run-untagged="true"
--locked="false"
--docker-privileged=${DOCKER_PRIVILEGED}
--docker-tlsverify=${DOCKER_TLS_VERIFY}
--docker-disable-entrypoint-overwrite="false"
--docker-tty=${DOCKER_TTY}

View File

@@ -0,0 +1,31 @@
concurrent = 1
check_interval = 0
shutdown_timeout = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "faa4e539628d"
url = "http://git.cism-ms.ru"
id = 115
token = "glrt-t3_5MD8hLs_69nChDbwXHLM"
token_obtained_at = 2025-03-17T15:35:01Z
token_expires_at = 0001-01-01T00:00:00Z
executor = "docker"
[runners.cache]
MaxUploadedArchiveSize = 0
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.docker]
tty = false
tls_verify = false
image = "hub.cism-ms.ru/ansible/ansible:latest"
privileged = true
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
shm_size = 0
network_mtu = 0