Делегируем рутину. Как автоматизировать развертывание ПО через Ansible: готовый сценарий

Ansible

Сегодня, когда 94% компаний выполняют повторяющиеся и отнимающие много времени задачи, автоматизация – почти как глоток свежего воздуха, ведь она помогает сэкономить до 77% времени, затрачиваемого на рутинные действия. Одним из популярных инструментов, который может в этом помочь, является Ansible – автоматизация с его помощью уже в 2025 году стала востребована среди более 21 тысячи компаний в мире.

В этой статье мы разберем, для чего можно использовать Ansible, какую пользу он может принести, а также поделимся пошаговой инструкцией о том, как настроить CI/CD с помощью Ansible и Gitea Runner. Наш материал пригодится всем, кто хочет оптимизировать процессы настройки и развертывания инфраструктуры.

Ansible – что это: главные преимущества

Итак, Ansible – это инструмент для автоматизации настройки серверов и управления IT-инфраструктурой с помощью простых YAML-скриптов, именуемых плейбуками (Playbooks).

С ним не нужно по кругу запускать на серверах одни и те же скрипты и команды – вместо этого можно прописать все действия, которые необходимо выполнить, в одном файле, а автоматически разошлет их на каждый сервер Ansible. При этом автоматизировать можно практически всё – от создания учетных записей пользователей до крупных многоуровневых развертываний приложений.

Инструмент поддерживает управление большинством ОС (Linux, Windows, macOS, BSD) – например, на Ubuntu установка Ansible выполняется одной командой: sudo apt install ansible.

Ключевые преимущества Ansible:

  • Простота
    Благодаря плейбукам можно автоматизировать задачи без глубоких знаний программирования. Например, вот код, который установит последнюю версию Nginx на Ubuntu/Debian:
- name: Установка Nginx
  ansible.builtin.apt:
	name: nginx
	state: present
  • Безагентная система
    Ansible не нуждается в установке каких-либо агентов, а работает через SSH. Главное – чтобы клиент Ansible был установлен на управляющем хосте. При этом установка Ansible возможна даже на обычном ПК.
  • Кроссплатформенность
    Одни и те же плейбуки могут помочь управлять разнородной инфраструктурой (Linux, Windows, сетевое оборудование, облака) с единого центра.
  • Модульность
    У Ansible множество модулей для самых разных задач по автоматизации инфраструктуры, а комьюнити регулярно дополняет и поддерживает модули. К примеру, для создания пользователя на Linux-сервере в Ansible можно использовать вот такой код:
- name: Создаем пользователя 'ivan' с шеллом bash и добавляем в группы admins и developers
  ansible.builtin.user:
    name: ivan
    shell: /bin/bash
    groups: admins,developers
    append: yes
  • Идемпотентность
    Повторный запуск одного и того же плейбука не ломает систему, даже если задача выполняется многократно. К примеру, если в плейбуке указано state: started для сервиса Nginx, то при первом запуске Ansible включит Nginx, а при повторных – просто проверит, что он работает, и не станет перезапускать.

Для чего используют Ansible

Ansible подходит для таких задач, как:

  • управление конфигурацией – можно проводить установку и настройку ПО, обеспечивать выполнение политик безопасности, управлять пользователями, правами и группами;
  • оркестрация – Ansible обеспечивает воспроизводимость (можно быстро поднять привычную рабочую среду на новой машине, если, к примеру, внезапно отказал диск или возникла необходимость поработать на другом железе) и предсказуемость (всегда полезно знать, что в системе установлено и как настроено, а когда конфиг перед глазами, можно быстро понять, почему ОС так работает или не работает);
  • развертывание – Ansible позволяет автоматизировать весь процесс развертывания приложений, включая установку необходимых зависимостей, копирование файлов, настройку серверов и запуск сервисов, а также управление контейнерами (благодаря поддержке Docker и Kubernetes).

Вот лишь несколько примеров, как Ansible приносит пользу разным компаниям:

  • Автоматизация развертывания в NASA – благодаря Ansible агентство сократило время развертывания с нескольких часов до нескольких минут.
  • Внедрение маршрутизатора широкополосного удаленного доступа в VAS Experts – российский разработчик ПО внедрил Ansible для автоматизации настройки BRAS (Broadband Remote Access Server), что позволило повысить эффективность, сократить количество ошибок и ускорить развертывание. 
  • Автоматизация глобальной инфраструктуры Hootsuite – Ansible помог платформе для управления социальными сетями сократить время развертывания новых сред на 90%.
  • Автоматизация подготовки серверов к добавлению в кластеры X5 Group – розничная торговая компания выбрала Ansible в том числе из-за возможности управлять инфраструктурой, не ставя на ноды дополнительные сервисы.
  • Безопасная автоматизация Capital One – с помощью Ansible в конвейер развертывания банковской холдинговой компании были интегрированы проверки безопасности, гарантирующие, что каждое развернутое приложение соответствует нормативным требованиям.
  • Автоматизация процессов в ITQ Group – использование модулей Ansible помогло российскому разработчику ПО добиться более прозрачной реализации задач. 
  • Миграция Atlassian в облако – разработчик таких популярных инструментов, как Jira и Confluence, смог автоматизировать миграцию в облако, управление конфигурациями и непрерывную доставку в своих средах.
  • Управление инфраструктурой в X5 Tech – благодаря Ansible цифровой партнер X5 Group управляет инфраструктурой на более 1000 серверов, а делегирование всей нагрузки на хосты помогло освободить больше половины терабайта ресурсов из Kubernetes.IaC в BMW – безагентный дизайн Ansible позволил внедрить модель “инфраструктура как код” и определить всю инфраструктуру в плейбуках.

Мы тоже используем Ansible для IaC и разворачивания софта на VPS/VDS – с его помощью мы подготавливаем серверы и обновляем пакеты. Весь софт из панели Cloud, кроме образов операционных систем, ставится у нас с помощью Ansible. Это удобно, ведь Ansible работает поверх SSH и, в отличие от Chef и Puppet, построен не на клиент-серверной архитектуре – то есть не нужно что-то иметь на сервере, кроме SSH и поддержки Python.

Если для ваших задач тоже может быть полезен Ansible и вы уже готовы автоматизировать процессы сборки, тестирования и развертывания приложений в собственной инфраструктуре, то мы подготовили пример, как можно настроить CI/CD с помощью Ansible и Gitea Runner – делимся этим гайдом ниже.

Как настроить CI/CD с помощью Ansible и Gitea Runner

Что ж, давайте взглянем, что может Ansible на практике.

Предположим, вы установили наше готовое решение Gitea и хотите настроить CI/CD, используя Gitea Runner, при этом имея возможность быстро создавать серверы для выполнения пайплайнов без большого количества ручного вмешательства.

Тут нам и поможет Ansible.

Для разворачивания нашего runner будет использоваться роль от ednz-cloud, Gitea Runner будет запускаться на готовом решении Docker, чтобы агент имел возможность запускать контейнеры, а для запуска самого плейбука подойдет любая машина с UNIX-подобной ОС и установленным Python.

Прежде всего, создадим директорию под Ansible в домашней директории и перейдем в нее:

mkdir ~/ansible-playground
cd ~/ansible-playground

После этого создадим виртуальное окружение, активируем и установим Ansible на машине, с которой будем запускать плейбук.

python3 -m venv venv_ansible
source venv_ansible/bin/activate
pip install ansible

Создадим файл gitea-runner-play.yml со следующим содержимым:

- name: Deploy gitea act runner
  hosts: gitea_runners
  roles:
    - role: ednz_cloud.deploy_gitea_runner
      vars:
        deploy_gitea_runner_deploy_method: host
        deploy_gitea_runner_server_url: https://git.betutorial.ru
        deploy_gitea_runner_server_token: "REDACTED"
        deploy_gitea_runner_name: ansible-betutorial-runner
        deploy_gitea_runner_register: true
        deploy_gitea_runner_start_service: true

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

Далее откроем Gitea и скопируем токен для runner в разделе /admin/actions/runners/:

токен регистрации раннера

После чего добавим полученный ключ в переменную deploy_gitea_runner_server_token.

Обратите внимание!
Токен используется для авторизации в вашем инстансе Gitea, не стоит ни в коем случае коммитить его в репозиторий. Для хранения секретов лучше использовать Ansible vault, здесь он добавляется в сам плейбук исключительно для упрощения.

Перейдем в панель управления и создадим сервер под Gitea runner с готовым решением Docker, добавив ключ нашей машины с Ansible в авторизованные:

готовое решение Docker

После чего в директории ansible-playground создадим файл инвентаря runners.yml, в котором укажем ip сервера и имя пользователя root:

gitea_runners:
  hosts:
    test_runner:
      ansible_host: ip_сервера
      ansible_user: root

Также нам потребуется загрузить используемую роль – для этого создадим директорию roles:

mkdir roles

После чего установим роль:

ansible-galaxy install -p roles ednz_cloud.deploy_gitea_runner

Теперь запустим наш плейбук, выполнив следующую команду:

ansible-playbook -i runners.yml gitea-runner-play.yml

Если всё настроено корректно, мы увидим успешное выполнение всех этапов:

ansible-playbook -i runners.yml gitea-runner-play.yml

PLAY [Deploy gitea act runner] *************************************************************************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************************************************************************************
[WARNING]: Platform linux on host test_runner is using the discovered Python interpreter at /usr/bin/python3.10, but future installation of another Python interpreter could change the meaning of that
path. See https://docs.ansible.com/ansible-core/2.18/reference_appendices/interpreter_discovery.html for more information.
ok: [test_runner]

TASK [ednz_cloud.deploy_gitea_runner : Import prerequisites.yml] ***************************************************************************************************************************************
included: /home/pinklife/dev/ansible_quickstart/roles/ednz_cloud.deploy_gitea_runner/tasks/prerequisites.yml for test_runner

TASK [ednz_cloud.deploy_gitea_runner : Create group act_runner] ****************************************************************************************************************************************
changed: [test_runner]

TASK [ednz_cloud.deploy_gitea_runner : Create user act_runner] *****************************************************************************************************************************************
changed: [test_runner]

TASK [ednz_cloud.deploy_gitea_runner : Add act_runner user to docker group] ****************************************************************************************************************************
changed: [test_runner]

TASK [ednz_cloud.deploy_gitea_runner : Create runner configuration directory] **************************************************************************************************************************
changed: [test_runner]

TASK [ednz_cloud.deploy_gitea_runner : Create gitea_actions directory] *********************************************************************************************************************************
skipping: [test_runner]

TASK [ednz_cloud.deploy_gitea_runner : Create gitea_actions/data directory] ****************************************************************************************************************************
skipping: [test_runner]

TASK [ednz_cloud.deploy_gitea_runner : Create gitea_actions/cache directory] ***************************************************************************************************************************
skipping: [test_runner]

TASK [ednz_cloud.deploy_gitea_runner : Import configure.yml] *******************************************************************************************************************************************
included: /home/pinklife/dev/ansible_quickstart/roles/ednz_cloud.deploy_gitea_runner/tasks/configure.yml for test_runner

TASK [ednz_cloud.deploy_gitea_runner : Copy gitea-runnner.service file] ********************************************************************************************************************************
changed: [test_runner]

TASK [ednz_cloud.deploy_gitea_runner : Copy config.yaml] ***********************************************************************************************************************************************
changed: [test_runner]

TASK [ednz_cloud.deploy_gitea_runner : Copy config.yaml] ***********************************************************************************************************************************************
skipping: [test_runner]

TASK [ednz_cloud.deploy_gitea_runner : Import install.yml] *********************************************************************************************************************************************
included: /home/pinklife/dev/ansible_quickstart/roles/ednz_cloud.deploy_gitea_runner/tasks/install_host.yml for test_runner

TASK [ednz_cloud.deploy_gitea_runner : Get release for gitea_runner:latest] ****************************************************************************************************************************
ok: [test_runner]

TASK [ednz_cloud.deploy_gitea_runner : Check if gitea_runner is already installed] *********************************************************************************************************************
ok: [test_runner]

TASK [ednz_cloud.deploy_gitea_runner : Check current gitea_runner version] *****************************************************************************************************************************
skipping: [test_runner]

TASK [ednz_cloud.deploy_gitea_runner : Set facts for wanted gitea_runner release] **********************************************************************************************************************
ok: [test_runner]

TASK [ednz_cloud.deploy_gitea_runner : Set facts for current gitea_runner release] *********************************************************************************************************************
skipping: [test_runner]

TASK [ednz_cloud.deploy_gitea_runner : Download and install gitea_runner version:latest] ***************************************************************************************************************
changed: [test_runner]

TASK [ednz_cloud.deploy_gitea_runner : Update version file] ********************************************************************************************************************************************
changed: [test_runner]

TASK [ednz_cloud.deploy_gitea_runner : Import register.yml] ********************************************************************************************************************************************
included: /home/pinklife/dev/ansible_quickstart/roles/ednz_cloud.deploy_gitea_runner/tasks/register.yml for test_runner

TASK [ednz_cloud.deploy_gitea_runner : Verify runner isnt already register] ****************************************************************************************************************************
ok: [test_runner]

TASK [ednz_cloud.deploy_gitea_runner : Register gitea-runner] ******************************************************************************************************************************************
ok: [test_runner]

TASK [ednz_cloud.deploy_gitea_runner : Ensure registration is successful] ******************************************************************************************************************************
ok: [test_runner] => {
    "changed": false,
    "msg": "Runner ansible-betutorial-runner registered correctly !"
}

RUNNING HANDLER [ednz_cloud.deploy_gitea_runner : Reload systemd file] *********************************************************************************************************************************
ok: [test_runner]

RUNNING HANDLER [ednz_cloud.deploy_gitea_runner : Enable gitea-runner service] *************************************************************************************************************************
changed: [test_runner]

RUNNING HANDLER [ednz_cloud.deploy_gitea_runner : Start gitea-runner service] **************************************************************************************************************************
changed: [test_runner]

PLAY RECAP *********************************************************************************************************************************************************************************************
test_runner                : ok=22   changed=10   unreachable=0    failed=0    skipped=6    rescued=0    ignored=0

Теперь проверим раздел runners в gitea – задеплоенный runner должен отобразиться в списке:

Раннер зарегистрирован

На этом всё. Ну а если вы чувствуете дух приключений, можно попробовать настроить хранение токена в Ansible vault – в этом вам поможет официальная документация. Будем рады узнать ваши результаты – делитесь ими в нашем сообществе в Telegram.

Заключение

Сегодня аналитики фиксируют спрос на автоматизацию повторяющихся ручных процессов и задач. По статистике, автоматизация рабочих процессов позволяет сократить количество повторяющихся задач на 60–95%.

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

Если у вас возникли вопросы, свяжитесь с нами удобным для вас способом – и мы обязательно ответим. Также ждем вас в нашем официальном Telegram-канале, а обсудить настройку Ansible или просто пообщаться на любую тему с коллегами по цеху и сотрудниками Beget вы можете в нашем чате.

2
904