Автоматизация настройки VPS с помощью Ansible: инвентарь и первый playbook
Введение
Ansible - это инструмент автоматизации с открытым исходным кодом, который используется для управления серверами, развертывания приложений и поддержки инфраструктуры. Он подключается к серверам по SSH и не требует установки агентов на удаленных машинах, что делает его простым и безопасным в использовании. Типичные сценарии применения включают автоматизацию настройки серверов, поддержка согласованности конфигураций и развертывание приложений на нескольких системах одновременно.
В этом руководстве вы установите Ansible на локальную машину и используете его для автоматизации настройки нескольких VPS. Вместо ручной настройки каждого сервера вы определите задачи один раз и примените их ко всем 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
- ans0:
- Доступ:
- 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 - это файл, в котором описываются задачи, выполняемые на серверах.
Создайте файл:
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
Ожидаемый результат: задачи выполняются на всех узлах без ошибок.
Первый запуск может занять несколько минут в зависимости от скорости сети.
Проверка
Проверьте веб-сервер:
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