coursework/README.md
2024-11-25 18:45:26 +03:00

222 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Ansible Jenkins Deployment Pipeline
## Обзор
Этот репозиторий содержит проект Ansible, интегрированный с Jenkins, для автоматизации развёртывания двух веб-сайтов (`SiteA` и `SiteB`) и прокси-сервера (`Proxy`). Настройка обеспечивает балансировку нагрузки, автоматические проверки состояния (health checks) и динамическое обновление контента без ручного вмешательства. Дополнительно внедрены обработчики для перезапуска служб при изменении конфигурации и централизованное управление основным конфигурационным файлом Nginx через `group_vars`.
## Описание Компонентов
- **group_vars/**: Содержит файлы с переменными групп хостов. В `all.yml` определены общие переменные для всех ролей и хостов, включая параметры для Nginx и контент для сайтов.
- **roles/**: Основная директория с ролями Ansible.
- **firewall/**:
- **handlers/**: Содержит обработчики для перезапуска `firewalld`.
- **tasks/**: Задачи для установки и настройки `firewalld`, открытия необходимых портов.
- **vars/**: Переменные, используемые в роли `firewall`.
- **nginx_proxy/**:
- **handlers/**: Содержит обработчики для перезапуска Nginx.
- **tasks/**: Задачи для установки Nginx, создания директорий, деплоя конфигураций и тестирования конфигурации.
- **templates/**: Шаблоны конфигурационных файлов Nginx для прокси-сервера и страниц ошибок.
- **nginx_site/**:
- **handlers/**: Содержит обработчики для перезапуска Nginx.
- **tasks/**: Задачи для установки Nginx, создания корневых директорий сайтов, деплоя конфигураций и HTML файлов, а также тестирования конфигурации.
- **templates/**: Шаблоны конфигурационных файлов Nginx и HTML страниц для сайтов.
- **ssl_certificate/**:
- **handlers/**: Содержит обработчики для перезапуска Nginx после генерации SSL сертификатов.
- **tasks/**: Задачи для установки OpenSSL, создания директории для сертификатов и генерации самоподписанных сертификатов.
- **templates/**: Шаблоны или скрипты для генерации SSL сертификатов.
- **playbook.yml**: Основной Ansible playbook, который связывает все роли и определяет порядок их выполнения на соответствующих хостах.
- **inventory.yml**: Файл инвентаризации, содержащий информацию о целевых хостах и группах (`SiteA`, `SiteB`, `proxy`).
- **ansible.cfg**: Конфигурационный файл Ansible, определяющий пути к ролям и другие настройки.
- **jenkinsfile**: Скрипт для Jenkins Pipeline, который управляет процессом деплоя, включая расшифровку SSH ключей, передачу переменных и запуск Ansible playbook.
## Параметры и Их Назначение
### В `group_vars/all.yml`
```yaml
# group_vars/all.yml
ansible_python_interpreter: /usr/bin/python3.6
# Общие переменные для Nginx
nginx_worker_processes: auto
nginx_error_log: /var/log/nginx/error.log
nginx_error_log_level: warn
nginx_worker_connections: 1024
nginx_access_log: /var/log/nginx/access.log
nginx_keepalive_timeout: 65
nginx_types_hash_max_size: 2048
# Переменные для сайтов SiteA и SiteB
siteA:
site_title: "SiteA - Добро пожаловать"
site_h1: "Добро пожаловать на SiteA"
site_h2: "Дефолтный заголовок H2 для SiteA"
site_p: "Дефолтный параграф для SiteA"
site_domain: "siteA.example.com"
site_ip: "192.168.0.61"
siteB:
site_title: "SiteB - Добро пожаловать"
site_h1: "Добро пожаловать на SiteB"
site_h2: "Дефолтный заголовок H2 для SiteB"
site_p: "Дефолтный параграф для SiteB"
site_domain: "siteB.example.com"
site_ip: "192.168.0.62"
proxy:
proxy_domain: "proxy.example.com"
proxy_ip: "192.168.0.63"
# SSL переменные
ssl_cert_path: "/etc/nginx/ssl"
ssl_cert_file: "proxy.crt"
ssl_key_file: "proxy.key"
ssl_subject: "/C=RU/ST=Some-State/L=Some-City/O=Your Company/CN={{ proxy.proxy_domain }}"
```
### В `Jenkinsfile`
- **DEPLOY_TARGET**: Выбор цели развертывания (`SiteA`, `SiteB`, `All`).
- **ADDITIONAL_CONTENT_SITEA_H2**: Дополнительный контент для заголовка `<h2>` на SiteA.
- **ADDITIONAL_CONTENT_SITEA_P**: Дополнительный параграф `<p>` для SiteA.
- **ADDITIONAL_CONTENT_SITEB_H2**: Дополнительный контент для заголовка `<h2>` на SiteB.
- **ADDITIONAL_CONTENT_SITEB_P**: Дополнительный параграф `<p>` для SiteB.
### В Ролях
- **firewall/vars/main.yml**:
- `firewall_ports`: Список портов и протоколов, которые необходимо открыть в файрволе (например, SSH, HTTP, HTTPS).
- **nginx_proxy/vars/main.yml**:
- `ssl_cert_path`: Путь к директории, где будут храниться SSL сертификаты.
- `ssl_cert_file`: Имя SSL сертификата.
- `ssl_key_file`: Имя ключа SSL сертификата.
- `ssl_subject`: Параметры для генерации самоподписанного SSL сертификата.
## Как Использовать
### Настройка Инвентаря
Отредактируйте `inventory.yml`, указав правильные IP-адреса и пользователя для каждого хоста:
```yaml
all:
children:
SiteA:
hosts:
192.168.0.61:
ansible_user: ansible
ansible_python_interpreter: /usr/bin/python3.6
SiteB:
hosts:
192.168.0.62:
ansible_user: ansible
ansible_python_interpreter: /usr/bin/python3.6
proxy:
hosts:
192.168.0.63:
ansible_user: ansible
ansible_python_interpreter: /usr/bin/python3.6
```
### Настройка Переменных
Все переменные, используемые в проектах, определены в `group_vars/all.yml`. При необходимости, вы можете переопределить их через Jenkins параметры или добавить дополнительные переменные.
### Запуск Jenkins Pipeline
1. **Дешифровка SSH ключей**: Jenkins автоматически расшифровывает SSH ключи для доступа к серверам.
2. **Выбор Цели Развертывания**: Выберите, какой сайт (`SiteA`, `SiteB`) или все (`All`) нужно развернуть.
3. **Передача Дополнительных Переменных**: Введите дополнительные параметры контента для выбранных сайтов.
4. **Запуск Ansible Playbook**: Jenkins запускает Ansible playbook с переданными параметрами, развертывая конфигурации и контент на целевых хостах.
## Проверка и Отладка
Если при развертывании возникают ошибки:
1. **Просмотрите Логи Jenkins**: Получите подробную информацию об ошибках.
2. **Подключитесь к Целевым Серверам**: Проверьте статус служб и конфигурационных файлов.
```bash
systemctl status nginx
systemctl status firewalld
```
3. **Проверьте Конфигурацию Nginx**: Убедитесь, что конфигурационные файлы корректны.
```bash
nginx -t
```
4. **Просмотрите Логи Nginx**:
```bash
sudo journalctl -xeu nginx.service
sudo tail -n 100 /var/log/nginx/error.log
```
### Пример Запуска Playbook Локально
Для локального тестирования или отладки вы можете запустить playbook вручную:
```bash
ansible-playbook playbook.yml
```
## Дополнительные Возможности
- **Автоматическое Тестирование Конфигураций**: Playbook включает задачи для тестирования конфигурации Nginx перед запуском службы, предотвращая запуск с ошибками.
- **Обработчики (Handlers)**: Автоматический перезапуск служб `nginx` и `firewalld` при изменении конфигурационных файлов.
- **Централизованное Управление Конфигурацией**: Основной конфигурационный файл Nginx управляется через шаблоны и переменные в `group_vars/all.yml`.
## Рекомендации и Лучшие Практики
1. **Безопасность**:
- Используйте Ansible Vault для защиты чувствительных данных.
- Убедитесь, что SSH ключи и другие секреты не попадают в систему контроля версий.
2. **Документация**:
- Поддерживайте актуальную документацию, описывающую структуру проекта и инструкции по развертыванию.
3. **Тестирование**:
- Используйте инструменты вроде [Molecule](https://molecule.readthedocs.io/en/latest/) для тестирования Ansible ролей.
- Внедрите проверку конфигураций перед применением изменений.
4. **Управление Конфигурациями**:
- Централизуйте общие конфигурационные файлы для облегчения управления и уменьшения дублирования.
- Используйте обработчики для автоматического применения изменений.
5. **Мониторинг и Логирование**:
- Внедрите системы мониторинга для отслеживания состояния сервисов.
- Анализируйте логи для своевременного обнаружения и устранения проблем.
## Заключение
Этот проект демонстрирует эффективное использование Ansible и Jenkins для автоматизации развёртывания веб-сайтов и прокси-сервера с учётом безопасности, надёжности и удобства управления. Следуя приведённым инструкциям и рекомендациям, вы сможете быстро адаптировать и расширять данное решение под свои нужды.
Если у вас возникнут дополнительные вопросы или потребуется помощь с настройкой, не стесняйтесь обращаться!
---
**Примечания:**
- Убедитесь, что все переменные правильно определены и соответствуют вашим требованиям.
- При необходимости, обновите пути и имена файлов в соответствии с вашей инфраструктурой.
- Для улучшения безопасности рассмотрите использование Ansible Vault для хранения чувствительных данных, таких как SSH ключи и пароли.
Если возникнут дополнительные вопросы или потребуется помощь с настройкой, не стесняйтесь обращаться!