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:
111
Makefile
111
Makefile
@@ -346,10 +346,115 @@ preset: ## Управление пресетами (list|create|edit|test|copy)
|
||||
esac
|
||||
|
||||
# =============================================================================
|
||||
# УПРАВЛЕНИЕ РОЛЯМИ (УДАЛЕНО)
|
||||
# УПРАВЛЕНИЕ РОЛЯМИ
|
||||
# =============================================================================
|
||||
# Роли Ansible удалены из проекта
|
||||
# Используйте playbooks для развертывания
|
||||
|
||||
.PHONY: role
|
||||
role: ## Управление ролями (list|create|edit|test|lint|deploy)
|
||||
@case "$(word 2, $(MAKECMDGOALS))" in \
|
||||
list) \
|
||||
echo "$(CYAN)📋 Доступные роли:$(RESET)"; \
|
||||
if [ -d "$(ROLES_DIR)" ]; then \
|
||||
ls -la $(ROLES_DIR)/ | grep "^d" | awk '{print " " $$9}' | grep -v "^\.$\|^\.\.$"; \
|
||||
else \
|
||||
echo " $(YELLOW)Директория ролей не найдена$(RESET)"; \
|
||||
fi;; \
|
||||
create) \
|
||||
if [ -z "$(NAME)" ]; then \
|
||||
echo "$(RED)❌ Использование: make role create NAME=my-role$(RESET)"; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
echo "$(YELLOW)📝 Создаем роль: $(NAME)$(RESET)"; \
|
||||
mkdir -p $(ROLES_DIR)/$(NAME)/{tasks,handlers,templates,files,vars,defaults,meta,tests}; \
|
||||
echo "---" > $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
|
||||
echo "# Основные задачи роли $(NAME)" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
|
||||
echo "" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
|
||||
echo "- name: $(NAME) placeholder" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
|
||||
echo " debug:" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
|
||||
echo " msg: \"Роль $(NAME) готова для настройки\"" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
|
||||
echo "" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
|
||||
echo "- name: Install $(NAME) package" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
|
||||
echo " package:" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
|
||||
echo " name: \"{{ $(NAME)_package | default('$(NAME)') }}\"" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
|
||||
echo " state: present" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
|
||||
echo "" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
|
||||
echo "- name: Start $(NAME) service" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
|
||||
echo " systemd:" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
|
||||
echo " name: \"{{ $(NAME)_service | default('$(NAME)') }}\"" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
|
||||
echo " state: started" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
|
||||
echo " enabled: true" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
|
||||
echo " when: $(NAME)_service is defined" >> $(ROLES_DIR)/$(NAME)/tasks/main.yml; \
|
||||
echo "---" > $(ROLES_DIR)/$(NAME)/defaults/main.yml; \
|
||||
echo "# Переменные по умолчанию для роли $(NAME)" >> $(ROLES_DIR)/$(NAME)/defaults/main.yml; \
|
||||
echo "$(NAME)_enabled: true" >> $(ROLES_DIR)/$(NAME)/defaults/main.yml; \
|
||||
echo "$(NAME)_package: $(NAME)" >> $(ROLES_DIR)/$(NAME)/defaults/main.yml; \
|
||||
echo "$(NAME)_service: $(NAME)" >> $(ROLES_DIR)/$(NAME)/defaults/main.yml; \
|
||||
echo "---" > $(ROLES_DIR)/$(NAME)/meta/main.yml; \
|
||||
echo "galaxy_info:" >> $(ROLES_DIR)/$(NAME)/meta/main.yml; \
|
||||
echo " author: $(AUTHOR)" >> $(ROLES_DIR)/$(NAME)/meta/main.yml; \
|
||||
echo " description: Роль $(NAME)" >> $(ROLES_DIR)/$(NAME)/meta/main.yml; \
|
||||
echo " company: $(SITE)" >> $(ROLES_DIR)/$(NAME)/meta/main.yml; \
|
||||
echo " license: MIT" >> $(ROLES_DIR)/$(NAME)/meta/main.yml; \
|
||||
echo " min_ansible_version: 2.9" >> $(ROLES_DIR)/$(NAME)/meta/main.yml; \
|
||||
echo "dependencies: []" >> $(ROLES_DIR)/$(NAME)/meta/main.yml; \
|
||||
echo "---" > $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo "# Роль $(NAME)" >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo "" >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo "Описание роли $(NAME)." >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo "" >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo "## Переменные" >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo "" >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo "| Переменная | По умолчанию | Описание |" >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo "|------------|--------------|----------|" >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo "| \`$(NAME)_enabled\` | \`true\` | Включить роль |" >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo "| \`$(NAME)_package\` | \`$(NAME)\` | Имя пакета |" >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo "| \`$(NAME)_service\` | \`$(NAME)\` | Имя сервиса |" >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo "" >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo "## Использование" >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo "" >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo "\`\`\`yaml" >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo "- hosts: all" >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo " roles:" >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo " - role: $(NAME)" >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo "\`\`\`" >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo "" >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo "## Автор" >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo "" >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo "$(AUTHOR)" >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo "Сайт: $(SITE)" >> $(ROLES_DIR)/$(NAME)/README.md; \
|
||||
echo "$(GREEN)✅ Роль $(NAME) создана$(RESET)";; \
|
||||
edit) \
|
||||
if [ -z "$(NAME)" ]; then \
|
||||
echo "$(RED)❌ Использование: make role edit NAME=my-role$(RESET)"; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
echo "$(BLUE)✏️ Редактируем роль: $(NAME)$(RESET)"; \
|
||||
$${EDITOR:-vim} $(ROLES_DIR)/$(NAME)/tasks/main.yml;; \
|
||||
test) \
|
||||
if [ -z "$(NAME)" ]; then \
|
||||
echo "$(RED)❌ Использование: make role test NAME=my-role$(RESET)"; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
echo "$(PURPLE)🧪 Тестируем роль: $(NAME)$(RESET)"; \
|
||||
$(MAKE) lab test LAB_SPEC=molecule/presets/minimal.yml;; \
|
||||
lint) \
|
||||
echo "$(YELLOW)🔍 Проверяем роли...$(RESET)"; \
|
||||
docker exec ansible-controller bash -lc 'ansible-lint --config-file /ansible/.ansible-lint $(ROLES_DIR)/*'; \
|
||||
echo "$(GREEN)✅ Проверка завершена$(RESET)";; \
|
||||
deploy) \
|
||||
echo "$(PURPLE)🚀 Развертываем роли...$(RESET)"; \
|
||||
docker exec ansible-controller bash -lc 'ansible-playbook -i /tmp/molecule/inventory/hosts.yml files/playbooks/site.yml'; \
|
||||
echo "$(GREEN)✅ Развертывание завершено$(RESET)";; \
|
||||
info) \
|
||||
if [ -z "$(NAME)" ]; then \
|
||||
echo "$(RED)❌ Использование: make role info NAME=my-role$(RESET)"; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
echo "$(BLUE)📋 Информация о роли: $(NAME)$(RESET)"; \
|
||||
docker exec ansible-controller bash -lc 'cat /ansible/roles/$(NAME)/README.md';; \
|
||||
*) \
|
||||
echo "$(RED)❌ Неизвестная команда. Доступные: list, create, edit, test, lint, deploy, info$(RESET)";; \
|
||||
esac
|
||||
|
||||
# =============================================================================
|
||||
# УПРАВЛЕНИЕ VAULT
|
||||
|
||||
16
README.md
16
README.md
@@ -94,9 +94,13 @@ make preset create NAME=my-preset
|
||||
make preset test NAME=my-preset
|
||||
make preset edit NAME=my-preset
|
||||
|
||||
# Управление ролями (УДАЛЕНО)
|
||||
# Роли Ansible удалены из проекта
|
||||
# Используйте playbooks для развертывания
|
||||
# Управление ролями
|
||||
make role list # Список ролей
|
||||
make role create NAME=my-role
|
||||
make role test NAME=my-role
|
||||
make role lint # Проверка ролей
|
||||
make role deploy # Развертывание ролей
|
||||
make role info NAME=my-role # Информация о роли
|
||||
|
||||
# Проверка всего проекта
|
||||
make lint # Проверить весь проект на ошибки
|
||||
@@ -132,6 +136,7 @@ make cleanup # Очистить лабораторию
|
||||
- **[Универсальная лаборатория](docs/universal-lab.md)** - полное руководство по работе с лабораторией
|
||||
- **[Пресеты](docs/presets.md)** - описание всех 21 готового пресета
|
||||
- **[Роли](docs/roles.md)** - структура и создание Ansible ролей
|
||||
- **[CI/CD](ci-cd/README.md)** - настройка CI/CD для Ansible ролей
|
||||
|
||||
### Дополнительные материалы
|
||||
|
||||
@@ -397,6 +402,11 @@ ansible-template/
|
||||
│ ├── examples.md # Примеры использования
|
||||
│ ├── troubleshooting.md # Решение проблем
|
||||
│ └── api.md # API Reference
|
||||
├── ci-cd/ # CI/CD конфигурация
|
||||
│ ├── README.md # Документация CI/CD
|
||||
│ ├── .gitlab-ci.yml # GitLab CI/CD
|
||||
│ ├── gitlab/ # GitLab Runner
|
||||
│ └── dockerfiles/ # Dockerfile'ы для разных ОС
|
||||
├── molecule/ # Molecule конфигурация
|
||||
│ ├── universal/ # Универсальный сценарий
|
||||
│ │ ├── molecule.yml # Конфигурация Molecule
|
||||
|
||||
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
|
||||
@@ -1,22 +0,0 @@
|
||||
---
|
||||
# Тестовый playbook для проверки работы с vault
|
||||
# Автор: Сергей Антропов
|
||||
# Сайт: https://devops.org.ru
|
||||
|
||||
- name: Test Vault Integration
|
||||
hosts: localhost
|
||||
gather_facts: no
|
||||
vars_files:
|
||||
- ../../vault/secrets.yml
|
||||
tasks:
|
||||
- name: Display vault variables
|
||||
debug:
|
||||
msg: "Database password: {{ db_password }}"
|
||||
|
||||
- name: Display API key
|
||||
debug:
|
||||
msg: "API key: {{ api_key }}"
|
||||
|
||||
- name: Display GitHub token
|
||||
debug:
|
||||
msg: "GitHub token: {{ github_token }}"
|
||||
0
reports/.gitkeep
Normal file
0
reports/.gitkeep
Normal file
@@ -1,4 +0,0 @@
|
||||
---
|
||||
collections:
|
||||
- name: maxhoesel.proxmox
|
||||
version: 5.0.1
|
||||
0
scripts/.gitkeep
Normal file
0
scripts/.gitkeep
Normal file
0
snapshots/.gitkeep
Normal file
0
snapshots/.gitkeep
Normal file
0
vault/.gitkeep
Normal file
0
vault/.gitkeep
Normal file
Reference in New Issue
Block a user