Показати сторінкуСтарі ревізіїПосилання сюдиПовернутися наверх Ця сторінка доступна тільки для перегляду. Ви можете продивитися вихідний текст, але не можете змінювати його. Якщо ви вважаєте, що це не вірно, зверніться до адміністратора. ====== Автоматизація деплою стеку моніторингу за допомогою Jenkins + Ansible + Git ====== Ця стаття — шпаргалка з налаштування безпечного CI/CD пайплайну "Push-to-Deploy". **Мета:** Автоматично оновлювати та перезапускати Docker Compose стек моніторингу на сервері щоразу, коли відбувається git push у main гілку. ----- ===== Архітектура рішення ===== Ми використовуємо модель із **поділом обов'язків** для максимальної безпеки та гнучкості: * **Git (GitHub):** Єдине "джерело правди" для всіх конфігурацій. * **Ansible (на хост-сервері):** "Виконавець" (CD). Він встановлений на самому сервері sim-serv і єдиний, хто має доступ до Docker та файлів проєкту. Він виконує інструкції (плейбуки). * **Jenkins (в Docker):** "Оркестратор" (CI). Він ізольований у своєму контейнері **без** доступу до docker.sock і **без** root прав. Його єдина задача — "слухати" GitHub і, у разі змін, "дзвонити" по SSH на хост-сервер, наказуючи Ansible виконати плейбук. ----- ===== Крок 1: Налаштування Ansible (Виконавець) на хост-сервері ===== Все це виконується на сервері sim-serv (наприклад, з-під користувача osvex). ==== Встановлення Ansible та Docker-бібліотек ==== \<code bash\> # Встановлення PPA та самого Ansible sudo apt update sudo apt install -y software-properties-common sudo add-apt-repository --yes --update ppa:ansible/ansible sudo apt install -y ansible # Встановлення Python-бібліотеки для Docker (потрібно для модуля Ansible) sudo apt install python3-docker \</code\> ==== Створення робочої папки та файлів Ansible ==== Ми зберігаємо всі конфігурації Ansible у /home/osvex/ansible/. **1. Файл inventory (де виконувати):** Це наш список серверів. Оскільки Ansible керує сам собою, ми використовуємо localhost. \<code ini\> # /home/osvex/ansible/inventory [monitoring] localhost ansible\_connection=local \</code\> **2. Файл deploy_monitoring.yml (що робити):** Це "плейбук", або інструкція для Ansible. Він оновлює Git-репозиторій та перезапускає Docker Compose. \<code yaml\> # /home/osvex/ansible/deploy\_monitoring.yml ----- - hosts: monitoring become: no \# Не отримувати sudo, працювати від імені osvex tasks: - name: 1. Оновити код моніторингу з Git # Використовуємо вбудований git модуль git: repo: 'git@github.com:osvex/monitoring.git' dest: '/home/osvex/docker/monitoring' \# Шлях до проєкту на хості version: 'main' accept\_hostkey: yes force: yes - name: 2. Перезапустити стек моніторингу (Docker Compose v2) # Використовуємо звичайну команду, оскільки модуль v1 не підтримує v2 ansible.builtin.command: cmd: docker compose up -d --build --remove-orphans chdir: '/home/osvex/docker/monitoring' \# Папка, з якої запускати \</code\> ----- ===== Крок 2: Налаштування Jenkins (Оркестратор) в Docker ===== Jenkins запускається у власному ізольованому Docker-контейнері. ==== docker-compose.yml для Jenkins ==== Це **безпечна** конфігурація. Ми **НЕ** використовуємо user: root і **НЕ** прокидаємо docker.sock. Єдиний зв'язок зі світом — це "домашня" папка Jenkins. \<code yaml\> # /home/osvex/docker/jenkins/docker-compose.yml version: '3.8' services: jenkins: image: jenkins/jenkins:lts-jdk17 container\_name: jenkins restart: unless-stopped \\ # Секція 'user: root' видалена для безпеки # Порти прокидаються через реверс-проксі (Traefik) # ports: # - "8090:8080" labels: - "traefik.enable=true" - "traefik.http.routers.jenkins.rule=Host(jenkins.osvex.com)" - "traefik.http.routers.jenkins.entrypoints=websecure" - "traefik.http.routers.jenkins.tls.certresolver=lets-encrypt" - "traefik.http.services.jenkins.loadbalancer.server.port=8080" # Внутрішній порт Jenkins - "traefik.http.services.jenkins.loadbalancer.server.scheme=http" - "traefik.docker.network=shared_traefik" volumes: # Залишаємо ТІЛЬКИ цей один 'bind mount' для даних Jenkins - /srv/docker/jenkins:/var/jenkins_home # Всі інші volumes (docker.sock, /usr/bin/docker і т.д.) видалені networks: - shared_traefik \\ networks: shared\_traefik: external: true \</code\> ==== Встановлення прав на папку Jenkins ==== Оскільки Jenkins тепер працює від імені користувача jenkins (UID 1000), ми повинні надати йому права на "домашню" папку: \<code bash\> sudo chown -R 1000:1000 /srv/docker/jenkins/ \</code\> ==== Необхідні плагіни Jenkins ==== У Jenkins (через **Manage Jenkins -\> Plugins**) мають бути встановлені: * **GitHub Integration** (для тригерів та вебхуків) * **SSH Agent** (для використання SSH-ключів у пайплайнах) ----- ===== Крок 3: Налаштування "Мосту" (SSH-ключі та Webhook) ===== Ми створюємо два окремих SSH-ключа для двох різних завдань. Вони зберігаються у /srv/docker/jenkins/.ssh/ (що відповідає /var/jenkins_home/.ssh/ всередині контейнера). ==== Ключ 1: Для підключення до GitHub (id\_rsa) ==== 1. **Налаштування Jenkins:** Перейдіть у **Manage Jenkins -\> Credentials -\> Global** та додайте SSH Username with private key: * **ID:** github-ssh-key * **Username:** git * **Private Key:** (Вміст id_rsa) 2. **Налаштування GitHub:** Перейдіть у **Репозиторій -\> Settings -\> Deploy keys** та додайте публічний ключ (вміст id_rsa.pub). ==== Ключ 2: Для підключення до хоста (Ansible) (id\_rsa\_ansible) ==== 1. **Налаштування Jenkins:** Перейдіть у **Manage Jenkins -\> Credentials -\> Global** та додайте SSH Username with private key: * **ID:** ansible-ssh-key * **Username:** osvex (ваш логін на хост-сервері) * **Private Key:** (Вміст id_rsa_ansible) 2. **Налаштування хост-сервера:** Додайте публічний ключ (вміст id_rsa_ansible.pub) до списку довірених для користувача osvex: \<code bash\> cat /srv/docker/jenkins/.ssh/id\_rsa\_ansible.pub \>\> /home/osvex/.ssh/authorized\_keys chmod 600 /home/osvex/.ssh/authorized\_keys \</code\> ==== Налаштування known\_hosts (у Jenkins) ==== Jenkins повинен "довіряти" серверам, до яких він підключається. \<code bash\> # На хост-сервері виконайте: ssh-keyscan -t rsa github.com \>\> /srv/docker/jenkins/.ssh/known\_hosts ssh-keyscan -t ed25519 github.com \>\> /srv/docker/jenkins/.ssh/known\_hosts ssh-keyscan -t rsa 172.17.0.1 \>\> /srv/docker/jenkins/.ssh/known\_hosts \# IP хоста зсередини Docker \</code\> ==== Налаштування GitHub Webhook ==== У **Репозиторій -\> Settings -\> Webhooks** додайте новий Webhook: * **Payload URL:** https://jenkins.osvex.com/github-webhook/ * **Content type:** application/json ----- ===== Крок 4: Фінальний Jenkinsfile (Мозок) ===== Цей файл лежить у корені вашого Git-репозиторію моніторингу. Він описує всю логіку пайплайну. \<code groovy\> # /home/osvex/docker/monitoring/Jenkinsfile pipeline { agent any // Запускати на будь-якому агенті \\ stages { // Етап 1: Отримання коду з Git (Jenkins робить це автоматично) stage('Checkout') { steps { echo 'Отримання коду з репозиторію...' checkout scm } } // Етап 2: Запуск розгортання через Ansible stage('Deploy via Ansible') { steps { echo 'Запуск плейбука Ansible на хост-сервері...' // "Обгортаємо" команду в sshagent, // щоб надати їй ключ 'ansible-ssh-key' (де вказано логін 'osvex') sshagent(credentials: ['ansible-ssh-key']) { // Виконуємо SSH-команду // Ми підключаємось до 172.17.0.1 (IP хост-сервера зсередини Docker) // і запускаємо наш плейбук sh ''' ssh -o StrictHostKeyChecking=no osvex@172.17.0.1 \ "cd /home/osvex/ansible && ansible-playbook -i inventory deploy_monitoring.yml" ''' } } } } // Блок post-дій post { success { echo 'ЧУДОВО: Пайплайн Ansible успішно виконано.' } failure { echo 'ПОМИЛКА: Пайплайн впав. Перевірте логи.' } } \\ } \</code\> ----- ===== Фінальний потік роботи (Workflow) ===== 1. Ви робите git push зі змінами у docker-compose.yml або prometheus.yml. 2. GitHub "ловить" цей push і надсилає Webhook на https://jenkins.osvex.com. 3. Jenkins "прокидається", запускає пайплайн, завантажує Jenkinsfile. 4. Етап "Deploy" підключається по SSH до osvex@172.17.0.1 (до вашого хост-сервера). 5. Jenkins виконує команду: ansible-playbook ... 6. Ansible (на хості) виконує плейбук: * Заходить у /home/osvex/docker/monitoring і робить git pull. * Запускає docker compose up -d ... 7. Jenkins отримує "успішний" статус від Ansible і завершує пайплайн з зеленим кольором. CKG Edit devops/jenkins.txt Востаннє змінено: 14/11/2025 23:00повз osvex