diff --git a/Makefile b/Makefile index d96db26..6d54717 100644 --- a/Makefile +++ b/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 diff --git a/README.md b/README.md index cbe83f3..6bca317 100644 --- a/README.md +++ b/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 diff --git a/.gitlab-ci.yml b/ci-cd/.gitlab-ci.yml similarity index 100% rename from .gitlab-ci.yml rename to ci-cd/.gitlab-ci.yml diff --git a/ci-cd/README.md b/ci-cd/README.md new file mode 100644 index 0000000..7f87d6f --- /dev/null +++ b/ci-cd/README.md @@ -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 diff --git a/Dockerfile b/ci-cd/dockerfiles/Dockerfile similarity index 100% rename from Dockerfile rename to ci-cd/dockerfiles/Dockerfile diff --git a/Dockerfile-CentOS b/ci-cd/dockerfiles/Dockerfile-CentOS similarity index 100% rename from Dockerfile-CentOS rename to ci-cd/dockerfiles/Dockerfile-CentOS diff --git a/Dockerfile-Ubuntu b/ci-cd/dockerfiles/Dockerfile-Ubuntu similarity index 100% rename from Dockerfile-Ubuntu rename to ci-cd/dockerfiles/Dockerfile-Ubuntu diff --git a/gitlab/config.json b/ci-cd/gitlab/config.json similarity index 100% rename from gitlab/config.json rename to ci-cd/gitlab/config.json diff --git a/gitlab/docker-compose.yaml b/ci-cd/gitlab/docker-compose.yaml similarity index 100% rename from gitlab/docker-compose.yaml rename to ci-cd/gitlab/docker-compose.yaml diff --git a/gitlab/runner/config.toml b/ci-cd/gitlab/runner/config.toml similarity index 100% rename from gitlab/runner/config.toml rename to ci-cd/gitlab/runner/config.toml diff --git a/files/playbooks/test-vault.yml b/files/playbooks/test-vault.yml deleted file mode 100644 index 9c0c7d6..0000000 --- a/files/playbooks/test-vault.yml +++ /dev/null @@ -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 }}" diff --git a/vars/.gitkeep b/molecule/.gitkeep similarity index 100% rename from vars/.gitkeep rename to molecule/.gitkeep diff --git a/reports/.gitkeep b/reports/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/requirements.yml b/requirements.yml deleted file mode 100644 index cf12a33..0000000 --- a/requirements.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -collections: - - name: maxhoesel.proxmox - version: 5.0.1 diff --git a/scripts/.gitkeep b/scripts/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/snapshots/.gitkeep b/snapshots/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/vault/.gitkeep b/vault/.gitkeep new file mode 100644 index 0000000..e69de29