Це стара версія документу!


Гаразд, це чудова ідея. Зберегти фінальну, робочу конфігурацію як “шпаргалку” — це найкращий спосіб закріпити знання.

Оскільки ви будете використовувати DokuWiki, я підготую статтю, використовуючи її синтаксис (він дуже схожий на Markdown, але з деякими відмінностями, особливо у заголовках та кодових блоках).

Ось готова стаття-шпаргалка, яка описує тільки наш фінальний, професійний сетап.


## (Скопіюйте цей текст і вставте його на вашу сторінку DokuWiki)

`====== Автоматизація деплою стеку моніторингу за допомогою 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-бібліотек ====`

\

# Встановлення 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 \

`==== Створення робочої папки та файлів Ansible ====`

Ми зберігаємо всі конфігурації Ansible у `/home/osvex/ansible/`.

1. Файл `inventory` (де виконувати):

Це наш список серверів. Оскільки Ansible керує сам собою, ми використовуємо `localhost`.

\

# /home/osvex/ansible/inventory

[monitoring] localhost ansible\_connection=local \

2. Файл `deploy_monitoring.yml` (що робити):

Це “плейбук”, або інструкція для Ansible. Він оновлює Git-репозиторій та перезапускає Docker Compose.

\

# /home/osvex/ansible/deploy\_monitoring.yml


  1. hosts: monitoring

become: no \# Не отримувати sudo, працювати від імені osvex

''''''  tasks:

''''''

  1. name: 1. Оновити код моніторингу з Git
''''''      # Використовуємо вбудований git модуль

''''''

''''''      git:
      repo: '[email protected]:osvex/monitoring.git'
      dest: '/home/osvex/docker/monitoring' \# Шлях до проєкту на хості
      version: 'main'
      accept\_hostkey: yes
      force: yes

''''''

  1. name: 2. Перезапустити стек моніторингу (Docker Compose v2)
''''''      # Використовуємо звичайну команду, оскільки модуль v1 не підтримує v2

''''''

''''''      ansible.builtin.command:
      cmd: docker compose up -d --build --remove-orphans
      chdir: '/home/osvex/docker/monitoring' \# Папка, з якої запускати

''''''


`===== Крок 2: Налаштування Jenkins (Оркестратор) в Docker =====`

Jenkins запускається у власному ізольованому Docker-контейнері.

` ==== `docker-compose.yml` для Jenkins ==== `

Це безпечна конфігурація. Ми НЕ використовуємо `user: root` і НЕ прокидаємо `docker.sock`. Єдиний зв'язок зі світом — це “домашня” папка Jenkins.

\

# /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:

  1. “traefik.enable=true”
  2. “traefik.http.routers.jenkins.rule=Host(`jenkins.osvex.com`)”
  3. “traefik.http.routers.jenkins.entrypoints=websecure”
  4. “traefik.http.routers.jenkins.tls.certresolver=lets-encrypt”
  5. “traefik.http.services.jenkins.loadbalancer.server.port=8080” # Внутрішній порт Jenkins
  6. “traefik.http.services.jenkins.loadbalancer.server.scheme=http”
  7. “traefik.docker.network=shared_traefik”

volumes:

''''''''# Залишаємо ТІЛЬКИ цей один 'bind mount' для даних Jenkins
- /srv/docker/jenkins:/var/jenkins_home

# Всі інші volumes (docker.sock, /usr/bin/docker і т.д.) видалені

''''''''

networks:

  1. shared_traefik

```

networks: shared\_traefik: external: true \

`==== Встановлення прав на папку Jenkins ====`

Оскільки Jenkins тепер працює від імені користувача `jenkins` (UID 1000), ми повинні надати йому права на “домашню” папку:

\ sudo chown -R 1000:1000 /srv/docker/jenkins/ \

`==== Необхідні плагіни 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`:

''''''''''  \''
  cat /srv/docker/jenkins/.ssh/id\_rsa\_ansible.pub \>\> /home/osvex/.ssh/authorized\_keys
  chmod 600 /home/osvex/.ssh/authorized\_keys
  \

''''''''''''

` ==== Налаштування `known\_hosts` (у Jenkins) ==== `

Jenkins повинен “довіряти” серверам, до яких він підключається.

\

# На хост-сервері виконайте:

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 \

`==== Налаштування GitHub Webhook ====`

У Репозиторій -\> Settings -\> Webhooks додайте новий Webhook:

—-

` ===== Крок 4: Фінальний `Jenkinsfile` (Мозок) ===== `

Цей файл лежить у корені вашого Git-репозиторію моніторингу. Він описує всю логіку пайплайну.

\

# /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 [email protected] \ “cd /home/osvex/ansible && ansible-playbook -i inventory deploy_monitoring.yml” ' } } } } Блок post-дій post { success { echo 'ЧУДОВО: Пайплайн Ansible успішно виконано.' } failure { echo 'ПОМИЛКА: Пайплайн впав. Перевірте логи.' } } ``` } \ —– `===== Фінальний потік роботи (Workflow) =====` 1. Ви робите `git push` зі змінами у `docker-compose.yml` або `prometheus.yml`. 2. GitHub “ловить” цей push і надсилає Webhook на `https://jenkins.osvex.com`. 3. Jenkins “прокидається”, запускає пайплайн, завантажує `Jenkinsfile`. 4. Етап “Deploy” підключається по SSH до `[email protected]` (до вашого хост-сервера). 5. Jenkins виконує команду: `ansible-playbook …` 6. Ansible (на хості) виконує плейбук: * Заходить у `/home/osvex/docker/monitoring` і робить `git pull`. * Запускає `docker compose up -d …` 7. Jenkins отримує “успішний” статус від Ansible і завершує пайплайн з зеленим кольором.

  • devops/jenkins.1763161057.txt.gz
  • Востаннє змінено: 14/11/2025 22:57
  • повз osvex