Блог компании 3v-Hosting

Настройка веб-сервера на VPS с помощью Ansible

Администрирование

8 мин.


Автоматизация инфраструктуры - одна из ключевых практик в современных рабочих процессах DevOps. Ansible, инструмент управления конфигурацией и автоматизации, значительно упрощает настройку серверов, сервисов и приложений. Ansible используется для настройки веб-серверов на виртуальных частных серверах (VPS), обеспечивая воспроизводимое и масштабируемое развертывание.

 

 

 

Введение в Ansible и VPS

 

VPS предоставляет пользователям изолированные виртуальные среды на физическом сервере. Это оптимальный выбор для веб-хостинга, сред разработки и производственных развертываний. VPS дает вам полный контроль над установленным программным обеспечением, конфигурацией сети и обновлениями системы, поскольку предоставляет вам root-доступ, чего вы не получите при виртуальном хостинге. Однако такая свобода влечет за собой ответственность, и пользователи должны быть готовы к настройке и обслуживанию своего серверного окружения.

Ansible, разработанный компанией Red Hat, - лучший инструмент автоматизации без агентов на рынке. Он взаимодействует по протоколу SSH. Его плейбуки на основе YAML определяют задачи, что делает его доступным и легко читаемым. Независимо от того, управляете ли вы одним сервером или тысячами, Ansible обеспечивает последовательный и эффективный подход к автоматизации.

 

 

 

 

Подготовка VPS к развертыванию Ansible

 

Прежде чем настраивать веб-сервер, VPS должен быть готов к автоматизации на основе Ansible. Эта подготовка включает в себя обеспечение безопасного доступа по SSH и установку необходимых зависимостей.

Для начала на удаленном VPS должен быть создан пользователь, не являющийся root, с привилегиями sudo. Этот пользователь будет использоваться Ansible для безопасного выполнения задач.

 

Создайте нового пользователя:

    adduser deployer
    usermod -aG sudo deployer


Включите аутентификацию с помощью ключа SSH: Скопируйте свой открытый ключ на сервер:

    ssh-copy-id deployer@your-vps-ip


На узле управления (ваша локальная машина или хост Ansible) убедитесь, что Ansible установлен. Это можно сделать с помощью pip или вашего менеджера пакетов:

    pip install ansible


Создайте файл инвентаризации (hosts.ini), описывающий VPS:

    [web]
    your-vps-ip ansible_user=deployer

 

 

 

 

Написание Ansible Playbook

 

Сборник сценариев Ansible - это набор инструкций по настройке целевой машины. Для настройки веб-сервера этот сборник обычно включает такие задачи, как установка веб-сервера (например, Nginx или Apache), настройка брандмауэра и развертывание базового HTML-сайта или динамического приложения.

Вот базовый пример установки Nginx:

    ---
    - name: Configure web server on VPS
      hosts: web
      become: yes
      tasks:
        - name: Update apt cache
          apt:
            update_cache: yes

        - name: Install Nginx
          apt:
            name: nginx
            state: present

        - name: Start and enable Nginx
          service:
            name: nginx
            state: started
            enabled: yes

        - name: Copy custom index.html
          copy:
            src: files/index.html
            dest: /var/www/html/index.html
            mode: '0644'

 

Этот плейбук гарантирует, что последняя версия Nginx установлена, запущена и включена при загрузке системы. Он также демонстрирует, как скопировать статическое содержимое веб-сайта на сервер.
Структурирование каталога проекта


Хорошо организованная директория проекта упрощает обслуживание и совместную работу команды. Стандартная структура может выглядеть следующим образом:

    webserver-ansible/
    ├──── hosts.ini
    ├──── site.yml
    ├──── files/
    │ └──── index.html
    ├──── roles/
    │ └──── nginx/
    │ ├──── tasks/
    │ │ └──── main.yml
    │ └──── templates/
    └──── vars/
        └──── main.yml

 

Использование ролей способствует многократному использованию и модульному дизайну. Например, роль nginx может быть использована для настройки других серверов.

 

 

 

 

Добавление TLS/SSL с помощью Let's Encrypt

 

Защита веб-сервера с помощью SSL необходима для современных веб-сайтов. В Ansible этот процесс можно автоматизировать с помощью ролей сообщества, таких как geerlingguy.certbot.

Чтобы использовать ее, включите роль в ваш файл requirements.yml:

    - src: geerlingguy.certbot


Установите роль:

    ansible-galaxy install -r requirements.yml


Затем определите задачи для автоматического получения и настройки SSL-сертификата:

    - name: Install and configure Let's Encrypt SSL
      hosts: web
      become: yes
      roles:
        - geerlingguy.certbot
      vars:
        certbot_email: "[email protected]"
        certbot_certs:
          - domains:
              - yourdomain.com

 

Этот шаг гарантирует, что ваш веб-сервер VPS защищен HTTPS, что улучшает SEO и доверие пользователей.

 


 

Другие статьи на тему DevOps в нашем Блоге:


    - Шпаргалка по Docker: Основные команды для начала работы

    - Как переименовать локальную и удаленную ветку в Git

    - Как создать собственный Docker образ

    - Проблемы с производительностью VPS или Почему тормозит мой сервер?

 


 

 

Настройка брандмауэра

 

Большинство VPS-провайдеров устанавливают свои экземпляры с минимальными настройками брандмауэра. Рекомендуется явно определить правила брандмауэра, чтобы ограничить доступ к службам.

Использование ufw (Uncomplicated Firewall) через Ansible:

    - name: Configure UFW
      hosts: web
      become: yes
      tasks:
        - name: Allow HTTP
          ufw:
            rule: allow
            name: "Nginx Full"
            port: 80
            proto: tcp

        - name: Allow HTTPS
          ufw:
            rule: allow
            name: "Nginx Full"
            port: 443
            proto: tcp

        - name: Enable UFW
          ufw:
            state: enabled
            policy: deny

 

Это разрешит HTTP/HTTPS трафик и заблокирует все остальные порты по умолчанию.

 

 

 

 

Развертывание динамического веб-приложения

 

Помимо обслуживания статического контента, на веб-серверах часто размещаются динамические приложения, написанные на PHP, Python (например, Django, Flask) или Node.js. Ansible может автоматизировать и эти развертывания.

Например, чтобы развернуть приложение Flask:

    - name: Install Python and dependencies
      apt:
        name:
          - python3
          - python3-pip
        state: present

    - name: Install Flask
      pip:
        name: flask

    - name: Copy Flask app
      copy:
        src: files/app.py
        dest: /home/deployer/app.py

    - name: Run Flask app with systemd
      template:
        src: templates/flask.service.j2
        dest: /etc/systemd/system/flask.service
      notify: Restart Flask

 

С помощью этой конфигурации Ansible автоматизирует установку всех необходимых компонентов, скопирует приложение и настроит его как системный сервис.

 

 

 

 

Обработка ошибок и идемпотентность

 

Одной из самых мощных возможностей Ansible является идемпотентность. Это означает, что многократное применение одного и того же плейбука не приведет к непредвиденным изменениям. Задачи выполняются только при необходимости, что позволяет избежать сбоев в работе сервисов.

Для большего контроля можно использовать обработчики, которые выполняют действия только при получении уведомления. Например, перезапуск службы только при изменении конфигурационного файла:

    handlers:
      - name: Restart Nginx
        service:
          name: nginx
          state: restarted

 

Такой подход обеспечивает минимальное время простоя и более эффективные циклы развертывания.

 

 

 

 

Тестирование и контроль версий

 

Управление плейбуками Ansible с помощью систем контроля версий, таких как Git, является лучшей практикой. Это обеспечивает совместную работу, отслеживание истории и интеграцию CI/CD. Для команд также рекомендуется использовать тестовые среды перед развертыванием изменений в производстве.

Тестирование можно проводить с помощью таких инструментов, как Molecule, которые имитируют развертывание с помощью контейнеров для проверки ролей и игровых сценариев.

 

 

 

 

Масштабирование на несколько серверов

 

По мере роста проектов может потребоваться масштабирование веб-серверов. С помощью Ansible вы можете расширить инвентаризацию, включив в нее несколько хостов, и использовать группы для разграничения сред (например, staging, production).

Пример инвентаризации:

    [staging]
    staging-vps-ip

    [production]
    prod-vps-ip1
    prod-vps-ip2


После этого можно выполнять игровые книги для выбранных групп:

    ansible-playbook -i hosts.ini site.yml --limit production

Такая гибкость делает Ansible надежным инструментом для создания инфраструктуры как кода, подходящим как для простых, так и для сложных сред.

 

 

 

 

Заключение

Ansible упрощает процесс настройки веб-сервера на VPS, обеспечивая воспроизводимое и безопасное развертывание. Декларативный синтаксис, идемпотентное поведение и масштабируемость делают его фаворитом в наборе инструментов DevOps. Независимо от того, запускаете ли вы персональный сайт или управляете корпоративными приложениями, Ansible - это оптимальный выбор для автоматизации настройки сервера, сокращения ручного труда и минимизации ошибок.

Интеграция Ansible в рабочий процесс вашего VPS-хостинга экономит время и соответствует современным практикам управления инфраструктурой. По мере роста ваших проектов преимущества автоматизации возрастают, делая Ansible не просто удобством, а необходимостью.