
Сегодня, когда 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 runner с готовым решением Docker, добавив ключ нашей машины с Ansible в авторизованные:

После чего в директории 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 вы можете в нашем чате.