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


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

Оскільки ви будете використовувати 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-бібліотек ====`

\<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


  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' \# Папка, з якої запускати

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

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


` ===== Крок 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 [email protected] \
                  "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 до `[email protected]` (до вашого хост-сервера). 5. Jenkins виконує команду: `ansible-playbook …` 6. Ansible (на хості) виконує плейбук: * Заходить у `/home/osvex/docker/monitoring` і робить `git pull`. * Запускає `docker compose up -d …` 7. Jenkins отримує “успішний” статус від Ansible і завершує пайплайн з зеленим кольором.

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