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