Автоматизація налаштування VPS за допомогою Ansible: Inventory і перший Playbook | INTROSERV
EUR
european

EUR

usa

USD

Ukraine Ua
Ex. VAT Ex. VAT 0%

Автоматизація налаштування VPS за допомогою Ansible: Inventory і перший Playbook

Вступ

Ansible - це інструмент автоматизації з відкритим кодом, який використовується для керування конфігураціями, розгортання застосунків та керування інфраструктурою. Він підключається до серверів через SSH і не потребує встановлення агентів на віддалених машинах, що робить його простим і безпечним у використанні. Типові сценарії використання включають автоматизацію налаштування серверів, збереження узгодженості конфігурацій та розгортання застосунків на кількох системах одночасно.

У цьому туторіалі ви налаштуєте Ansible на локальній машині та використаєте його для автоматизації конфігурації кількох VPS. Замість ручного налаштування кожного сервера ви один раз описуєте задачі і застосовуєте їх всюди. Ви створите inventory, напишете свій перший playbook і розгорнете робочий веб-застосунок на тестових VPS.

Розуміння основних концепцій Ansible

Ви не пишете скрипт, який виконує команди по черзі. Ви описуєте, яким має бути стан серверів після завершення виконання Playbook.

У цьому туторіалі використовуються лише кілька базових компонентів Ansible. В Inventory ви перелічуєте ваші VPS сервери та спосіб підключення до них. У Playbook ви описуєте бажаний стан серверів. Розділи Playbook визначають окремі частини стану: встановлені пакети, запущені сервіси або конфігураційні файли.

Найважливіша концепція тут - декларативність. Замість того щоб писати команди, як у shell-скрипті, ви описуєте бажаний стан сервера. Наприклад, ви не вказуєте Ansible виконати команду встановлення Nginx. Ви задаєте, що Nginx має бути встановлений. Ви не запускаєте сервіс вручну. Ви задаєте, що сервіс має бути запущений і увімкнений. Ansible сам визначає, які дії необхідні для досягнення цього стану.

На відміну від традиційного підходу, де ви "вручну" виконуєте команди, вам не потрібно самостійно контролювати виконання скрипта. В Ansible логіка вже вбудована в використовувані модулі, такі як керування пакетами, керування сервісами, робота з файлами та HTTP перевірки.

Ще одна ключова концепція - ідемпотентність. Під час повторного запуску одного й того ж Playbook Ansible виконує лише необхідні зміни. Ansible нічого не змінює, якщо система вже відповідає заданому стану. Наприклад, якщо Nginx уже встановлений, він не буде встановлений повторно. Якщо конфігураційний файл уже відповідає заданому стану, він не буде перезаписаний.

Завдяки декларативності та ідемпотентності ви можете безпечно запускати playbook кілька разів. Під час першого запуску Ansible встановлює і налаштовує все необхідне. Під час наступних запусків він лише перевіряє стан системи. Зміни вносяться за потреби.

Передумови

  • Цільова аудиторія: системні адміністратори початківці
  • Орієнтовний час: ~40–60 хвилин
  • Операційна система: Debian 13 на локальному ПК і всіх VPS
  • VPS вузли:
    • ans0: 192.168.10.10
    • ans1: 192.168.10.11
    • ans2: 192.168.10.12
  • Доступ:
    • SSH доступ до всіх VPS
    • Користувач з правами sudo на кожному VPS
  • Мережа:
    • Відкритий порт 22 для SSH
    • Відкритий порт 80 для HTTP
  • Локальна машина:
    • Встановлений Python 3
    • Доступ до інтернету
  • Кінцева мета: автоматично налаштувати кілька VPS серверів, встановити Nginx, розгорнути PocketBase і зробити його доступним через веб сервер.

Крок 1: Встановлення Ansible на локальній машині

Ansible працює на локальній машині і підключається до віддалених серверів. Його потрібно встановити один раз локально.

Оновіть список пакетів:

sudo apt update

Встановіть Ansible:

sudo apt install ansible -y

Перевірте встановлення:

ansible --version

Очікуваний результат: відображається інформація про версію. Це означає, що Ansible встановлений і готовий до роботи.

Крок 2: Підготовка SSH доступу

Ansible використовує SSH для підключення до серверів. Щоб не вводити пароль кожнен разу, використовуйте SSH ключі.

Згенеруйте SSH ключ:

ssh-keygen

Натисніть Enter, щоб прийняти значення за замовчуванням. Це створить пару ключів:

  • Приватний ключ залишається на вашому ПК
  • Публічний ключ копіюється на сервери

Скопіюйте ключ на VPS:

ssh-copy-id <YOUR_USERNAME>@192.168.10.10

ssh-copy-id <YOUR_USERNAME>@192.168.10.11

ssh-copy-id <YOUR_USERNAME>@192.168.10.12

Перевірте доступ:

ssh <YOUR_USERNAME>@192.168.10.10

Очікуваний результат: ви входите без введення пароля.

Крок 3: Створення проекту і Ansible inventory

У inventory файлі Ansible перераховуються сервери, керовані playbook-ом.

Створіть директорію проекту:

mkdir ~/ansible-vps

cd ~/ansible-vps

Створіть inventory файл:

nano inventory.ini

Вставте вміст inventory файлу:

[vps] ans0 ansible_host=192.168.10.10 ans1 ansible_host=192.168.10.11 ans2 ansible_host=192.168.10.12 [vps:vars] ansible_user=<YOUR_USERNAME> ansible_python_interpreter=/usr/bin/python3

Пояснення:

  • [vps] - це назва групи
  • ans0, ans1, ans2 - логічні імена
  • ansible_host визначає реальні IP адреси
  • ansible_user вказує, під яким користувачем підключатися

Перевірте з'єднання:

ansible -i inventory.ini vps -m ping

Очікуваний результат: кожен сервер повертає "pong".

Крок 4: Створення першого playbook

Playbook - це файл, у якому описуються задачі, які потрібно виконати на серверах.

Створіть файл playbook-а:

nano playbook.yml

Вставте вміст playbook файлу:

- name: Configure VPS nodes hosts: vps become: true tasks: - name: Test connectivity ping: - name: Update apt cache apt: update_cache: yes - name: Upgrade packages apt: upgrade: dist - name: Install Nginx apt: name: nginx state: present - name: Ensure Nginx is running service: name: nginx state: started enabled: true - name: Test HTTP connectivity uri: url: http://127.0.0.1/ return_content: no - name: Create directory for PocketBase file: path: /opt/pocketbase/pb_public state: directory - name: Install unzip apt: name: unzip state: present - name: Download PocketBase get_url: url: https://github.com/pocketbase/pocketbase/releases/download/v0.36.7/pocketbase_0.36.7_linux_amd64.zip dest: /opt/pocketbase/pocketbase.zip - name: Unpack PocketBase unarchive: src: /opt/pocketbase/pocketbase.zip dest: /opt/pocketbase/ remote_src: yes - name: Create Pocketbase index.html copy: dest: /opt/pocketbase/pb_public/index.html content: | <h1>Pocketbase</h1> - name: Create systemd service copy: dest: /etc/systemd/system/pocketbase.service content: | [Unit] Description=PocketBase Service After=network.target [Service] Type=simple ExecStart=/opt/pocketbase/pocketbase serve --http=127.0.0.1:8090 Restart=always [Install] WantedBy=multi-user.target - name: Reload systemd command: systemctl daemon-reexec - name: Enable and start PocketBase service: name: pocketbase enabled: true state: started - name: Configure Nginx site copy: dest: /etc/nginx/sites-available/pocketbase content: | server { listen 80; server_name _; location / { proxy_pass http://127.0.0.1:8090; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } - name: Enable Nginx site file: src: /etc/nginx/sites-available/pocketbase dest: /etc/nginx/sites-enabled/pocketbase state: link - name: Remove default site file: path: /etc/nginx/sites-enabled/default state: absent - name: Restart Nginx service: name: nginx state: restarted - name: Check PocketBase availability uri: url: http://127.0.0.1:8090/_/ return_content: no

Пояснення:

  • hosts: vps означає всі сервери у групі
  • become: true виконує задачі з підвищеними правами
  • Кожна задача описує одну дію
  • Модулі apt, service, file є вбудованими в Ansible

Крок 5: Запуск playbook

ansible-playbook -i inventory.ini playbook.yml

Очікуваний результат: задачі виконуються на всіх вузлах без помилок.

Info

перший запуск може зайняти кілька хвилин залежно від швидкості мережі.

Перевірка

Перевірте веб сервер:

curl http://192.168.10.10/

Очікуваний результат: отримано HTTP відповідь.

Відкрийте в браузері: http://192.168.10.10/_/

Очікуваний результат: завантажується інтерфейс PocketBase.

Повторіть для інших вузлів.

Відкат змін

sudo systemctl stop pocketbase

sudo systemctl disable pocketbase

sudo rm /etc/systemd/system/pocketbase.service

sudo rm -rf /opt/pocketbase

sudo apt remove nginx unzip -y

Перезавантажте systemd:

sudo systemctl daemon-reload

Усунення проблем

  • SSH не працює: перевірте ключі та користувача
  • Ansible ping не працює: перевірте мережеве з'єднання між хостами
  • Проблеми з Nginx: systemctl status nginx
  • Проблеми з PocketBase: journalctl -u pocketbase

Висновок

Ви встановили інструмент автоматизації Ansible, створили inventory та написали перший playbook. Ви автоматизували розгортання Nginx і PocketBase на кількох серверах.

Наступні кроки:

  • Використання ролей для кращої структури
  • Додавання змінних і шаблонів
  • Налаштування HTTPS

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA