# 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**: Дополнительный контент для заголовка `

` на SiteA. - **ADDITIONAL_CONTENT_SITEA_P**: Дополнительный параграф `

` для SiteA. - **ADDITIONAL_CONTENT_SITEB_H2**: Дополнительный контент для заголовка `

` на SiteB. - **ADDITIONAL_CONTENT_SITEB_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 ключи и пароли. https://cyeta12.online/nextcloud/s/5fnYWrw5qN8RdaY