Розбіжності
Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.
| Порівняння попередніх версій Попередня ревізія Наступна ревізія | Попередня ревізія | ||
| devops:jenkins [14/11/2025 22:55] – osvex | devops:jenkins [14/11/2025 23:00] (поточний) – osvex | ||
|---|---|---|---|
| Рядок 1: | Рядок 1: | ||
| - | ====== | ||
| - | |||
| - | ====== Jenkins | ||
| - | |||
| ====== Автоматизація деплою стеку моніторингу за допомогою Jenkins + Ansible + Git ====== | ====== Автоматизація деплою стеку моніторингу за допомогою Jenkins + Ansible + Git ====== | ||
| Ця стаття — шпаргалка з налаштування безпечного CI/CD пайплайну " | Ця стаття — шпаргалка з налаштування безпечного CI/CD пайплайну " | ||
| - | **Мета: | + | **Мета: |
| - | ---- | + | ----- |
| ===== Архітектура рішення ===== | ===== Архітектура рішення ===== | ||
| Рядок 15: | Рядок 11: | ||
| Ми використовуємо модель із **поділом обов' | Ми використовуємо модель із **поділом обов' | ||
| - | * | + | * **Git (GitHub):** Єдине " |
| - | **Git (GitHub):** Єдине "джерело правди" | + | * **Ansible |
| - | * | + | |
| - | **Ansible | + | * **Jenkins |
| - | * | + | |
| - | **Jenkins (в Docker):** " | + | ----- |
| - | ---- | + | |
| ===== Крок 1: Налаштування Ansible (Виконавець) на хост-сервері ===== | ===== Крок 1: Налаштування Ansible (Виконавець) на хост-сервері ===== | ||
| - | Все це виконується на сервері | + | Все це виконується на сервері sim-serv (наприклад, |
| ==== Встановлення Ansible та Docker-бібліотек ==== | ==== Встановлення Ansible та Docker-бібліотек ==== | ||
| - | ====== | + | \<code bash\> |
| + | |||
| + | # Встановлення PPA та самого Ansible | ||
| - | <code bash> | ||
| sudo apt update | sudo apt update | ||
| Рядок 43: | Рядок 37: | ||
| sudo apt install -y ansible | sudo apt install -y ansible | ||
| - | </ | + | # Встановлення Python-бібліотеки для Docker (потрібно для модуля Ansible) |
| - | ====== Встановлення Python-бібліотеки для Docker (потрібно для модуля Ansible) ====== | ||
| - | |||
| - | <code bash> | ||
| sudo apt install python3-docker | sudo apt install python3-docker | ||
| - | </code> | + | \</code\> |
| - | + | ||
| - | </code> | + | |
| ==== Створення робочої папки та файлів Ansible ==== | ==== Створення робочої папки та файлів Ansible ==== | ||
| - | Ми зберігаємо всі конфігурації Ansible у '' | + | Ми зберігаємо всі конфігурації Ansible у / |
| - | **1. Файл | + | **1. Файл inventory (де виконувати): |
| - | Це наш список серверів. Оскільки Ansible керує сам собою, ми використовуємо | + | Це наш список серверів. Оскільки Ansible керує сам собою, ми використовуємо localhost. |
| - | <code ini> | + | \<code ini\> |
| - | ====== | + | # / |
| [monitoring] | [monitoring] | ||
| - | localhost | + | localhost |
| - | </ | + | \</code\> |
| - | **2. Файл | + | **2. Файл deploy_monitoring.yml (що робити): |
| Це " | Це " | ||
| - | <code yaml> | + | \<code yaml\> |
| - | ====== | + | # / |
| - | ---- | + | ----- |
| - | * | + | - hosts: monitoring |
| - | hosts: monitoring | + | become: no \# Не отримувати sudo, працювати від імені osvex |
| - | + | ||
| - | become: no # Не отримувати sudo, працювати від імені osvex | + | |
| tasks: | tasks: | ||
| - | * | + | - name: 1. Оновити код моніторингу з Git |
| - | name: 1. Оновити код моніторингу з Git | + | # Використовуємо вбудований git модуль |
| - | + | ||
| - | ====== | + | |
| git: | git: | ||
| Рядок 101: | Рядок 85: | ||
| repo: ' | repo: ' | ||
| - | dest: '/ | + | dest: '/ |
| version: ' | version: ' | ||
| - | accept_hostkey: yes | + | accept\_hostkey: yes |
| force: yes | force: yes | ||
| - | * | + | - name: 2. Перезапустити стек моніторингу (Docker Compose v2) |
| - | + | ||
| - | name: 2. Перезапустити стек моніторингу (Docker Compose v2) | + | |
| - | ====== | + | # Використовуємо звичайну команду, |
| ansible.builtin.command: | ansible.builtin.command: | ||
| Рядок 119: | Рядок 101: | ||
| cmd: docker compose up -d --build --remove-orphans | cmd: docker compose up -d --build --remove-orphans | ||
| - | chdir: '/ | + | chdir: '/ |
| + | \</ | ||
| - | </ | + | ----- |
| - | + | ||
| - | ---- | + | |
| ===== Крок 2: Налаштування Jenkins (Оркестратор) в Docker ===== | ===== Крок 2: Налаштування Jenkins (Оркестратор) в Docker ===== | ||
| Рядок 132: | Рядок 113: | ||
| ==== docker-compose.yml для Jenkins ==== | ==== docker-compose.yml для Jenkins ==== | ||
| - | Це **безпечна** конфігурація. Ми **НЕ** використовуємо | + | Це **безпечна** конфігурація. Ми **НЕ** використовуємо user: root і **НЕ** прокидаємо docker.sock. Єдиний зв' |
| - | <code yaml> | + | \<code yaml\> |
| - | ====== | + | # / |
| version: ' | version: ' | ||
| Рядок 146: | Рядок 127: | ||
| image: jenkins/ | image: jenkins/ | ||
| - | container_name: jenkins | + | container\_name: jenkins |
| restart: unless-stopped | restart: unless-stopped | ||
| - | < | + | \\ |
| + | # Секція 'user: root' видалена для безпеки | ||
| # Порти прокидаються через реверс-проксі (Traefik) | # Порти прокидаються через реверс-проксі (Traefik) | ||
| + | |||
| # ports: | # ports: | ||
| - | # | + | |
| + | # - " | ||
| labels: | labels: | ||
| - | | + | |
| - | - " | + | - " |
| - | - " | + | |
| - | - " | + | - " |
| - | - " | + | |
| - | - " | + | - " |
| - | - " | + | |
| + | - " | ||
| + | |||
| + | - " | ||
| + | |||
| + | - " | ||
| + | |||
| + | - " | ||
| volumes: | volumes: | ||
| - | # Залишаємо ТІЛЬКИ цей один 'bind mount' для даних Jenkins | ||
| - | - / | ||
| - | | + | # Залишаємо ТІЛЬКИ цей один 'bind mount' для даних Jenkins |
| + | |||
| + | - / | ||
| + | |||
| + | # Всі інші volumes (docker.sock, | ||
| networks: | networks: | ||
| - | - shared_traefik | ||
| - | '' | ||
| - | </ | + | - shared_traefik |
| + | \\ | ||
| networks: | networks: | ||
| - | shared_traefik: | + | shared\_traefik: |
| external: true | external: true | ||
| - | + | \</code\> | |
| - | </ | + | |
| ==== Встановлення прав на папку Jenkins ==== | ==== Встановлення прав на папку Jenkins ==== | ||
| - | Оскільки Jenkins тепер працює від імені користувача | + | Оскільки Jenkins тепер працює від імені користувача jenkins (UID 1000), ми повинні надати йому права на " |
| - | <code bash> | + | \<code bash\> |
| sudo chown -R 1000:1000 / | sudo chown -R 1000:1000 / | ||
| - | + | \</code\> | |
| - | </ | + | |
| ==== Необхідні плагіни Jenkins ==== | ==== Необхідні плагіни Jenkins ==== | ||
| - | У Jenkins (через **Manage Jenkins -> Plugins**) мають бути встановлені: | + | У Jenkins (через **Manage Jenkins -\> Plugins**) мають бути встановлені: |
| - | | + | * **GitHub Integration** (для тригерів та вебхуків) |
| - | **GitHub Integration** (для | + | * **SSH Agent** (для |
| - | * | + | |
| - | **SSH Agent** (для використання SSH-ключів у пайплайнах) | + | ----- |
| - | ---- | + | |
| ===== Крок 3: Налаштування " | ===== Крок 3: Налаштування " | ||
| - | Ми створюємо два окремих SSH-ключа для двох різних завдань. Вони зберігаються у '' | + | Ми створюємо два окремих SSH-ключа для двох різних завдань. Вони зберігаються у / |
| - | ==== Ключ 1: Для підключення до GitHub (id_rsa'' | + | ==== Ключ 1: Для підключення до GitHub (id\_rsa) ==== |
| - | | + | 1. **Налаштування Jenkins:** Перейдіть у **Manage Jenkins |
| - | **Налаштування Jenkins:** Перейдіть у **Manage Jenkins | + | * **ID:** github-ssh-key |
| - | * | + | |
| - | **ID:** '' | + | * **Username:** git |
| - | | + | |
| - | **Username:** '' | + | * **Private Key:** (Вміст id_rsa) |
| - | | + | |
| - | **Private Key:** (Вміст | + | 2. **Налаштування GitHub:** Перейдіть у **Репозиторій -\> Settings -\> Deploy keys** та додайте публічний ключ |
| - | - | + | |
| - | **Налаштування GitHub:** Перейдіть у **Репозиторій -> Settings -> Deploy keys** та додайте публічний ключ (вміст '' | + | ==== Ключ 2: Для підключення до хоста (Ansible) (id\_rsa\_ansible) ==== |
| - | ==== Ключ 2: Для підключення до хоста (Ansible) (id_rsa_ansible'' | + | |
| - | | + | 1. **Налаштування Jenkins:** Перейдіть у **Manage Jenkins |
| - | **Налаштування Jenkins:** Перейдіть у **Manage Jenkins | + | * **ID:** ansible-ssh-key |
| - | * | + | |
| - | **ID:** '' | + | * **Username:** osvex (ваш логін на хост-сервері) |
| - | * | + | |
| - | **Username:** '' | + | * **Private Key:** (Вміст |
| - | * | + | |
| - | **Private Key:** (Вміст | + | 2. **Налаштування хост-сервера:** Додайте публічний ключ |
| - | - | + | |
| - | Налаштування хост-сервера: | + | \<code bash\> |
| - | <code bash> | + | cat / |
| - | cat / | + | chmod 600 / |
| - | chmod 600 /home/ | + | \</code\> |
| - | + | ==== Налаштування | |
| - | </ | + | |
| - | + | ||
| - | ==== Налаштування | + | |
| Jenkins повинен " | Jenkins повинен " | ||
| - | <code bash> | + | \<code bash\> |
| - | + | ||
| - | ====== На хост-сервері виконайте: | + | |
| - | ssh-keyscan -t rsa github.com >> / | + | # На хост-сервері виконайте: |
| - | ssh-keyscan -t ed25519 | + | ssh-keyscan -t rsa github.com |
| - | ssh-keyscan -t rsa 172.17.0.1 | + | ssh-keyscan -t ed25519 github.com \>\> / |
| + | ssh-keyscan -t rsa 172.17.0.1 \>\> / | ||
| - | </ | + | \</code\> |
| ==== Налаштування GitHub Webhook ==== | ==== Налаштування GitHub Webhook ==== | ||
| - | У **Репозиторій -> Settings -> Webhooks** додайте новий Webhook: | + | У **Репозиторій -\> Settings -\> Webhooks** додайте новий Webhook: |
| - | | + | * **Payload URL:** https:// |
| - | **Payload URL:** '' | + | * **Content type:** application/json |
| - | * | + | |
| - | **Content type:** '' | + | ----- |
| - | ---- | + | |
| ===== Крок 4: Фінальний Jenkinsfile (Мозок) ===== | ===== Крок 4: Фінальний Jenkinsfile (Мозок) ===== | ||
| Рядок 290: | Рядок 263: | ||
| Цей файл лежить у корені вашого Git-репозиторію моніторингу. Він описує всю логіку пайплайну. | Цей файл лежить у корені вашого Git-репозиторію моніторингу. Він описує всю логіку пайплайну. | ||
| - | <code groovy> | + | \<code groovy\> |
| - | ====== | + | # / |
| pipeline { | pipeline { | ||
| Рядок 298: | Рядок 271: | ||
| agent any // Запускати на будь-якому агенті | agent any // Запускати на будь-якому агенті | ||
| - | < | + | \\ |
| + | stages { | ||
| - | | + | // Етап 1: Отримання коду з Git (Jenkins робить це автоматично) |
| - | stage(' | + | |
| - | steps { | + | |
| - | echo ' | + | |
| - | checkout scm | + | |
| - | } | + | |
| - | } | + | |
| - | // Етап 2: Запуск розгортання через Ansible | + | stage(' |
| - | | + | |
| - | steps { | + | |
| - | echo ' | + | |
| - | // "Обгортаємо" | + | steps { |
| - | // щоб | + | |
| - | | + | echo 'Отримання коду з репозиторію...' |
| + | |||
| + | checkout scm | ||
| - | // Виконуємо SSH-команду | ||
| - | // Ми підключаємось до 172.17.0.1 (IP хост-сервера зсередини Docker) | ||
| - | // і запускаємо наш плейбук | ||
| - | sh ''' | ||
| - | ssh -o StrictHostKeyChecking=no [email protected] \ | ||
| - | "cd / | ||
| - | ''' | ||
| - | } | ||
| - | } | ||
| - | } | ||
| } | } | ||
| - | // Блок post-дій | ||
| - | post { | ||
| - | success { | ||
| - | echo ' | ||
| - | } | ||
| - | failure { | ||
| - | echo ' | ||
| - | } | ||
| } | } | ||
| - | '' | ||
| - | </code> | + | // Етап 2: Запуск розгортання через Ansible |
| + | |||
| + | stage(' | ||
| + | |||
| + | steps { | ||
| + | |||
| + | echo ' | ||
| + | |||
| + | // " | ||
| + | |||
| + | // щоб надати їй ключ ' | ||
| + | |||
| + | sshagent(credentials: | ||
| + | |||
| + | // Виконуємо SSH-команду | ||
| + | |||
| + | // Ми підключаємось до 172.17.0.1 (IP хост-сервера зсередини Docker) | ||
| + | |||
| + | // і запускаємо наш плейбук | ||
| + | |||
| + | sh ''' | ||
| + | |||
| + | ssh -o StrictHostKeyChecking=no [email protected] \ | ||
| + | |||
| + | "cd / | ||
| + | |||
| + | ''' | ||
| } | } | ||
| - | </ | + | } |
| - | ---- | + | } |
| - | ===== Фінальний потік роботи (Workflow) ===== | + | } |
| - | | + | // Блок post-дій |
| - | Ви робите '' | + | post { |
| - | - | + | success { |
| - | GitHub "ловить" цей push і надсилає Webhook | + | echo ' |
| - | - | + | } |
| - | Jenkins " | + | failure { |
| - | | + | echo ' |
| + | |||
| + | } | ||
| + | |||
| + | } | ||
| + | |||
| + | \\ | ||
| + | } | ||
| + | |||
| + | \</ | ||
| + | |||
| + | ----- | ||
| + | |||
| + | ===== Фінальний потік роботи (Workflow) ===== | ||
| - | Етап " | + | 1. Ви робите git push зі змінами у docker-compose.yml або prometheus.yml. |
| - | - | + | 2. GitHub " |
| - | Jenkins | + | 3. Jenkins |
| - | - | + | |
| - | Ansible | + | 4. Етап " |
| - | * | + | 5. Jenkins виконує команду: |
| - | Заходить у ''/ | + | 6. Ansible (на хості) виконує плейбук: |
| - | | + | * Заходить у / |
| - | Запускає | + | * Запускає docker compose up -d ... |
| - | - | + | |
| - | Jenkins отримує " | + | 7. Jenkins отримує " |