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:
89
ci-cd/.gitlab-ci.yml
Normal file
89
ci-cd/.gitlab-ci.yml
Normal file
@@ -0,0 +1,89 @@
|
||||
stages:
|
||||
- lint
|
||||
- test
|
||||
- deploy
|
||||
- notify
|
||||
|
||||
services:
|
||||
- name: docker:dind
|
||||
command: ["--tls=false"]
|
||||
|
||||
variables:
|
||||
DOCKER_IMAGE: "hub.cism-ms.ru/ansible/ansible:latest"
|
||||
DOCKER_TLS_CERTDIR: ""
|
||||
ANSIBLE_FORCE_COLOR: "true"
|
||||
|
||||
before_script:
|
||||
- echo "$CI_REGISTRY_PASSWORD" | docker login hub.cism-ms.ru -u "$CI_REGISTRY_USER" --password-stdin
|
||||
- docker pull $DOCKER_IMAGE
|
||||
- echo "Fixing directory permissions..."
|
||||
- chmod o-w $CI_PROJECT_DIR
|
||||
|
||||
lint:
|
||||
stage: lint
|
||||
script:
|
||||
- echo "Начинаем стейдж Lint"
|
||||
- echo "Распаковываем секреты..."
|
||||
- ansible-vault decrypt vars/secrets.yml --vault-password-file ./vault-password.txt
|
||||
- echo "Запускаем ansible-lint..."
|
||||
- ansible-lint roles/*
|
||||
- echo "Упаковываем секреты..."
|
||||
- ansible-vault encrypt vars/secrets.yml --encrypt-vault-id default --vault-password-file ./vault-password.txt
|
||||
allow_failure: false
|
||||
rules:
|
||||
- if: $CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "master"
|
||||
|
||||
test:
|
||||
stage: test
|
||||
script:
|
||||
- echo "Распаковываем секреты..."
|
||||
- ansible-vault decrypt --vault-password-file ./vault-password.txt vars/secrets.yml
|
||||
- echo "Запускаем тесты через Молекулу..."
|
||||
- molecule test --parallel --destroy=always
|
||||
- echo "Упаковываем секреты..."
|
||||
- ansible-vault encrypt vars/secrets.yml --encrypt-vault-id default --vault-password-file ./vault-password.txt
|
||||
allow_failure: false
|
||||
rules:
|
||||
- if: $CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "master"
|
||||
|
||||
deploy:
|
||||
stage: deploy
|
||||
script:
|
||||
- echo "Настраиваем SSH-ключ для доступа к серверам..."
|
||||
# Создаем директорию .ssh и настраиваем права доступа
|
||||
- mkdir -p ~/.ssh
|
||||
- chmod 700 ~/.ssh
|
||||
# Записываем SSH-ключ в файл ~/.ssh/id_rsa
|
||||
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa
|
||||
- chmod 600 ~/.ssh/id_rsa
|
||||
# Запускаем основной пайплайн
|
||||
- echo "Распаковываем секреты..."
|
||||
- ansible-vault decrypt --vault-password-file ./vault-password.txt vars/secrets.yml
|
||||
- echo "Все ок. Деплоим в прод..."
|
||||
- ansible-playbook roles/deploy.yaml
|
||||
- echo "Упаковываем секреты..."
|
||||
- ansible-vault encrypt vars/secrets.yml --encrypt-vault-id default --vault-password-file ./vault-password.txt
|
||||
# Удаляем ключ
|
||||
- rm -rf ~/.ssh
|
||||
rules:
|
||||
- if: $CI_COMMIT_REF_NAME != "main" && $CI_COMMIT_REF_NAME != "master"
|
||||
when: manual
|
||||
|
||||
notify:
|
||||
stage: notify
|
||||
script:
|
||||
- |
|
||||
if [ "$CI_JOB_STATUS" == "success" ]; then
|
||||
MESSAGE="✅ Пайплайн успешно завершен!%0AПроект: $CI_PROJECT_NAME%0AВетка: $CI_COMMIT_REF_NAME%0AСтатус: $CI_JOB_STATUS"
|
||||
else
|
||||
MESSAGE="❌ Пайплайн завершен с ошибкой!%0AПроект: $CI_PROJECT_NAME%0AВетка: $CI_COMMIT_REF_NAME%0AСтатус: $CI_JOB_STATUS"
|
||||
fi
|
||||
# curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage" \
|
||||
# -d "chat_id=$TELEGRAM_CHAT_ID" \
|
||||
# -d "text=$MESSAGE"
|
||||
rules:
|
||||
- if: $CI_JOB_STATUS # Отправлять уведомление только после завершения пайплайна
|
||||
|
||||
after_script:
|
||||
- echo "Работа пайплайна завершена"
|
||||
|
||||
123
ci-cd/README.md
Normal file
123
ci-cd/README.md
Normal file
@@ -0,0 +1,123 @@
|
||||
# CI/CD для Ansible ролей
|
||||
|
||||
Этот раздел содержит примеры настройки CI/CD для Ansible ролей с использованием GitLab CI/CD.
|
||||
|
||||
## Структура
|
||||
|
||||
```
|
||||
ci-cd/
|
||||
├── README.md # Эта документация
|
||||
├── .gitlab-ci.yml # GitLab CI/CD конфигурация
|
||||
├── gitlab/ # GitLab Runner конфигурация
|
||||
│ ├── config.json # Docker registry конфигурация
|
||||
│ ├── docker-compose.yaml # GitLab Runner в Docker
|
||||
│ └── runner/
|
||||
│ └── config.toml # Runner конфигурация
|
||||
└── dockerfiles/ # Dockerfile'ы для разных ОС
|
||||
├── Dockerfile # Базовый Dockerfile
|
||||
├── Dockerfile-CentOS # Dockerfile для CentOS
|
||||
└── Dockerfile-Ubuntu # Dockerfile для Ubuntu
|
||||
```
|
||||
|
||||
## GitLab CI/CD
|
||||
|
||||
### Основные этапы
|
||||
|
||||
1. **Lint** - проверка синтаксиса Ansible
|
||||
2. **Test** - запуск тестов через Molecule
|
||||
3. **Deploy** - развертывание в продакшн
|
||||
4. **Notify** - уведомления о результатах
|
||||
|
||||
### Настройка
|
||||
|
||||
1. **Переменные окружения:**
|
||||
- `CI_REGISTRY_USER` - пользователь Docker registry
|
||||
- `CI_REGISTRY_PASSWORD` - пароль Docker registry
|
||||
- `SSH_PRIVATE_KEY` - SSH ключ для доступа к серверам
|
||||
- `TELEGRAM_BOT_TOKEN` - токен Telegram бота
|
||||
- `TELEGRAM_CHAT_ID` - ID чата для уведомлений
|
||||
|
||||
2. **Docker Registry:**
|
||||
- Настроен доступ к `hub.cism-ms.ru`
|
||||
- Используется образ `hub.cism-ms.ru/ansible/ansible:latest`
|
||||
|
||||
3. **Vault:**
|
||||
- Автоматическое расшифрование/шифрование секретов
|
||||
- Используется `vault-password.txt` для доступа
|
||||
|
||||
## GitLab Runner
|
||||
|
||||
### Конфигурация
|
||||
|
||||
- **Executor:** Docker
|
||||
- **Image:** `hub.cism-ms.ru/ansible/ansible:latest`
|
||||
- **Privileged:** true
|
||||
- **Volumes:** Docker socket для DinD
|
||||
|
||||
### Настройка Runner
|
||||
|
||||
1. Зарегистрировать Runner:
|
||||
```bash
|
||||
docker-compose -f ci-cd/gitlab/docker-compose.yaml up -d
|
||||
```
|
||||
|
||||
2. Настроить переменные в `ci-cd/gitlab/runner/config.toml`
|
||||
|
||||
## Dockerfile'ы
|
||||
|
||||
### Базовый Dockerfile
|
||||
- Основан на Ubuntu
|
||||
- Установлены Ansible, Molecule, Docker
|
||||
- Настроен systemd для тестирования
|
||||
|
||||
### Dockerfile-CentOS
|
||||
- Основан на CentOS
|
||||
- Адаптирован для RHEL-семейства
|
||||
- Установлены необходимые пакеты
|
||||
|
||||
### Dockerfile-Ubuntu
|
||||
- Основан на Ubuntu
|
||||
- Оптимизирован для Debian-семейства
|
||||
- Включены дополнительные инструменты
|
||||
|
||||
## Использование
|
||||
|
||||
### Локальная разработка
|
||||
|
||||
```bash
|
||||
# Создать роль
|
||||
make role create NAME=my-role
|
||||
|
||||
# Тестировать роль
|
||||
make role test NAME=my-role
|
||||
|
||||
# Проверить синтаксис
|
||||
make role lint
|
||||
```
|
||||
|
||||
### CI/CD Pipeline
|
||||
|
||||
1. **Автоматический запуск** при push в ветки
|
||||
2. **Lint проверка** всех ролей
|
||||
3. **Molecule тесты** для каждой роли
|
||||
4. **Deploy** в продакшн (ручной запуск)
|
||||
5. **Уведомления** в Telegram
|
||||
|
||||
### Настройка для своего проекта
|
||||
|
||||
1. Скопировать `.gitlab-ci.yml` в корень проекта
|
||||
2. Настроить переменные в GitLab
|
||||
3. Обновить Docker registry URL
|
||||
4. Настроить SSH ключи для деплоя
|
||||
|
||||
## Безопасность
|
||||
|
||||
- Все секреты хранятся в Ansible Vault
|
||||
- SSH ключи используются только для деплоя
|
||||
- Docker registry требует аутентификации
|
||||
- Vault файлы автоматически шифруются после использования
|
||||
|
||||
## Автор
|
||||
|
||||
Сергей Антропов
|
||||
Сайт: https://devops.org.ru
|
||||
40
ci-cd/dockerfiles/Dockerfile
Normal file
40
ci-cd/dockerfiles/Dockerfile
Normal file
@@ -0,0 +1,40 @@
|
||||
# Используем готовый образ с Ansible
|
||||
FROM geerlingguy/docker-ubuntu2204-ansible:latest
|
||||
|
||||
# Добавляем метаданные
|
||||
LABEL maintainer="Сергей Антропов <sergey@antropoff.ru>"
|
||||
LABEL description="Этот Dockerfile создан для внедрения подхода IaC в Ansible."
|
||||
LABEL version="0.1"
|
||||
LABEL contact.website="https://devops.org.ru"
|
||||
|
||||
# Устанавливаем переменные окружения
|
||||
ENV PYTHONUNBUFFERED=1
|
||||
ENV EDITOR=nano
|
||||
|
||||
# Устанавливаем дополнительные зависимости Python для Molecule
|
||||
RUN pip install --upgrade pip && \
|
||||
pip install \
|
||||
molecule \
|
||||
molecule-docker \
|
||||
ansible-lint \
|
||||
yamllint \
|
||||
docker \
|
||||
&& rm -rf /root/.cache/pip
|
||||
|
||||
# Создаем рабочую директорию
|
||||
WORKDIR /ansible
|
||||
|
||||
# Копируем файлы проекта
|
||||
COPY . /ansible/
|
||||
|
||||
# Устанавливаем права на выполнение (если папка scripts существует)
|
||||
RUN if [ -d /ansible/scripts ]; then chmod +x /ansible/scripts/*.sh; fi
|
||||
|
||||
# Устанавливаем пользователя
|
||||
USER root
|
||||
|
||||
# Открываем порт для SSH
|
||||
EXPOSE 22
|
||||
|
||||
# Команда по умолчанию
|
||||
CMD ["/bin/bash"]
|
||||
54
ci-cd/dockerfiles/Dockerfile-CentOS
Normal file
54
ci-cd/dockerfiles/Dockerfile-CentOS
Normal file
@@ -0,0 +1,54 @@
|
||||
# Сборка контейнера с systemd для удобного тестирования ролей Ansible через Molecule
|
||||
|
||||
# Используем официальный образ Fedora
|
||||
FROM quay.io/fedora/python-312
|
||||
|
||||
USER root
|
||||
|
||||
# Обновляем пакеты и устанавливаем systemd и необходимые пакеты
|
||||
RUN dnf update -y && \
|
||||
dnf install -y --nodocs --setopt=install_weak_deps=False \
|
||||
systemd rsync \
|
||||
git \
|
||||
openssh \
|
||||
gcc \
|
||||
libffi-devel \
|
||||
openssl-devel \
|
||||
make \
|
||||
sudo \
|
||||
openssh-clients \
|
||||
less \
|
||||
ca-certificates \
|
||||
curl \
|
||||
gnupg2 \
|
||||
nano \
|
||||
sshpass \
|
||||
redhat-lsb-core \
|
||||
&& dnf clean all && \
|
||||
rm -rf /var/cache/dnf /tmp/* /var/tmp/*
|
||||
|
||||
# Устанавливаем docker-compose
|
||||
RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
|
||||
chmod +x /usr/local/bin/docker-compose
|
||||
|
||||
# Устанавливаем Python пакеты для Ansible
|
||||
RUN pip install --upgrade pip && \
|
||||
pip install \
|
||||
ansible \
|
||||
ansible-vault \
|
||||
molecule \
|
||||
molecule-docker \
|
||||
ansible-lint \
|
||||
yamllint \
|
||||
docker \
|
||||
&& rm -rf /root/.cache/pip
|
||||
|
||||
# Настраиваем окружение для systemd
|
||||
ENV container=docker
|
||||
STOPSIGNAL SIGRTMIN+3
|
||||
|
||||
# Создаем необходимые директории для systemd
|
||||
VOLUME [ "/sys/fs/cgroup" ]
|
||||
|
||||
# Запускаем systemd при старте контейнера
|
||||
CMD ["/sbin/init"]
|
||||
62
ci-cd/dockerfiles/Dockerfile-Ubuntu
Normal file
62
ci-cd/dockerfiles/Dockerfile-Ubuntu
Normal file
@@ -0,0 +1,62 @@
|
||||
# Сборка контейнера с systemd для удобного тестирования ролей Ansible через Molecule
|
||||
|
||||
# Используем готовый образ с Ansible (более старый, но стабильный)
|
||||
FROM geerlingguy/docker-ubuntu2004-ansible:latest
|
||||
|
||||
# Устанавливаем переменные окружения
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
ENV container=docker
|
||||
|
||||
# Устанавливаем дополнительные пакеты для тестирования
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --no-install-recommends \
|
||||
systemd \
|
||||
systemd-sysv \
|
||||
rsync \
|
||||
git \
|
||||
ssh \
|
||||
gcc \
|
||||
libffi-dev \
|
||||
libssl-dev \
|
||||
make \
|
||||
sudo \
|
||||
sshpass \
|
||||
openssh-client \
|
||||
nano \
|
||||
less \
|
||||
ca-certificates \
|
||||
curl \
|
||||
gnupg \
|
||||
lsb-release \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Устанавливаем Python пакеты для Ansible с обновлением зависимостей
|
||||
RUN pip install --upgrade pip && \
|
||||
pip install --upgrade \
|
||||
requests \
|
||||
PyYAML \
|
||||
ansible-core \
|
||||
&& pip install \
|
||||
ansible \
|
||||
"ansible-vault<4.0.0" \
|
||||
molecule \
|
||||
molecule-docker \
|
||||
ansible-lint \
|
||||
yamllint \
|
||||
docker \
|
||||
&& rm -rf /root/.cache/pip
|
||||
|
||||
# Устанавливаем docker-compose
|
||||
RUN curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
|
||||
chmod +x /usr/local/bin/docker-compose
|
||||
|
||||
|
||||
# Указываем, что контейнер использует systemd в качестве init-системы
|
||||
ENV container=docker
|
||||
STOPSIGNAL SIGRTMIN+3
|
||||
|
||||
# Создаем необходимые директории для systemd
|
||||
VOLUME [ "/sys/fs/cgroup" ]
|
||||
|
||||
# Запускаем systemd при старте контейнера
|
||||
CMD ["/sbin/init"]
|
||||
8
ci-cd/gitlab/config.json
Normal file
8
ci-cd/gitlab/config.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"auths": {
|
||||
"hub.cism-ms.ru": {
|
||||
"username": "your-username",
|
||||
"password": "your-password"
|
||||
}
|
||||
}
|
||||
}
|
||||
33
ci-cd/gitlab/docker-compose.yaml
Normal file
33
ci-cd/gitlab/docker-compose.yaml
Normal 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}
|
||||
31
ci-cd/gitlab/runner/config.toml
Normal file
31
ci-cd/gitlab/runner/config.toml
Normal 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
|
||||
Reference in New Issue
Block a user