Ansible — это система, которая помогает автоматически управлять серверами в компьютерной сети. Она облегчает доставку и развертывание, то есть перенос и запуск программных продуктов на серверах.
С помощью Ansible разработчики, сисадмины и сетевые инженеры могут быстро настраивать серверы, чтобы на тех можно было запустить программный продукт. Это проще и удобнее, чем ручная настройка, особенно если серверов много или сеть очень разветвленная.
Название «ансибл» взято из фантастических книг писательницы Урсулы Ле Гуин: там так назывались устройства для связи в космосе.
Система опенсорсная и бесплатная, любой разработчик может посмотреть ее исходный код и адаптировать под свои нужды.
Что такое Ansible и зачем он нужен
Ansible — система, которая работает по принципу infrastructure as a code, или «инфраструктура как код». Это подход, при котором инфраструктуру серверов описывают с помощью кода и конфигурационных файлов. Информация о настройках, разрешениях, установленных программных средствах сервера хранится в специальных файлах.
- Разработчик может написать конфигурационные файлы сам и настроить сервер вручную. Но если серверов много, процесс получится довольно долгим и трудоемким.
- Можно написать скрипты, которые настраивают серверы, но это тоже не лучшее решение — придется писать много разных скриптов, ведь на серверах разные системы и мощности.
Поэтому разработчики придумали системы автоматического управления конфигурациями, и Ansible — одна из них. В таких системах достаточно описать нужное состояние и способ его достичь. А система автоматически сделает все, что нужно, и сама проведет настройку сервера. В итоге сложное конфигурирование становится намного проще и быстрее.
Особенности Ansible
Систем для автоматического управления конфигурациями много, у всех свои особенности. Ansible работает немного по иному принципу, нежели другие популярные решения.
Push вместо pull. Сеть из нескольких серверов часто выглядит так: есть главные управляющие машины, а есть зависимые. Стандартный подход систем управления конфигурациями называется pull: зависимые сервера «тянут» информацию с главного. В Ansible все наоборот, по умолчанию используется push-подход: главный сервер сам «проталкивает» информацию в зависимые. На практике разница в том, что открытым для доступа должен быть не главный сервер, а зависимые. Но при необходимости Ansible тоже можно настроить на работу в режиме pull.
Использование SSH-инфраструктуры. Обычно системы управления конфигурациями требуют установки специального окружения, в котором они смогут работать. Ansible, в отличие от них, работает с существующим SSH-окружением: стандартным безопасным протоколом для удаленного управления сервером. Поэтому Ansible универсальнее: не нужно устанавливать дополнительное ПО, чтобы система могла работать. Нужен только Python.
Декларативность. Ansible использует декларативный подход к написанию кода. Это значит, что разработчику надо описать не действия программы напрямую, а результат, которого она должна достичь. Как именно он будет достигнут — обдумывать уже не нужно, и это опять же сокращает время настройки.
Сбор информации. Вещь, которую важно помнить при начале работы с Ansible, — он будет собирать информацию о серверах всегда, если не указано обратное. Это не плохо само по себе, но иногда бывает излишне.
Как устроен Ansible
Архитектура Ansible сама по себе довольно простая. Система состоит:
- из главного управляющего сервера — там установлен Ansible, и оттуда отдаются команды. К серверу подключаются пользователи, база данных и облачные системы, ему можно отдавать команды с помощью плейбуков — о них поговорим ниже;
- зависимых серверов, или хостов — их можно настраивать и конфигурировать с главного.
Внутри управляющего сервера — API, модули и плагины для работы с разными программными решениями, а еще инвентарь, из которого он черпает информацию о хостах. Про инвентарь мы тоже расскажем чуть позже.
Набор модулей для работы с серверным ПО
У Ansible довольно обширный набор модулей для взаимодействия с разными программными компонентами. То есть, он «из коробки» умеет работать с огромным количеством ПО, которое обычно используется на серверах. Например:
- с базами данных и СУБД;
- облачными системами и хранилищами;
- шаблонизаторами и популярными форматами файлов;
- пакетными менеджерами вроде apt, pip или npm;
- программами для оповещений и мониторинга;
- ядром и другими компонентами Linux.
Для всего этого у Ansible есть свои наборы модулей, доступные сразу после установки. Поэтому, чтобы работать с каким-то популярным серверным ПО с помощью Ansible, обычно не нужно скачивать дополнительные библиотеки и инструменты. Он умеет работать с компонентами сразу.
Hosts: хранение списка серверов
Один из компонентов Ansible — инвентарь. Так называется особое хранилище, в котором Ansible держит информацию о хостах. По умолчанию это хранилище находится по адресу /etc/ansible/hosts в системе Linux: в файле hosts находится перечень зависимых серверов. Их можно объединить в группы и дать группам имена: серверы базы данных, DNS-серверы и так далее. А еще можно назначать «родительские» и «дочерние» группы.
Для каждого хоста можно указать свои параметры и переменные. Но описывать их в hosts считается не очень хорошей практикой, потому что так файл станет слишком большим и непонятным для разработчиков. Поэтому в Ansible есть еще несколько хранилищ для переменных:
- group_vars хранит переменные, специфичные для каких-то групп;
- hosts_vars содержит переменные хостов;
- <роль>/vars описывает переменные для какой-то роли. Про роли расскажем чуть позже.
Ansible Playbook: hosts, tasks и другое
Плейбуки в Ansible — это файлы сценариев. Они создаются в человекопонятном формате YAML и содержат информацию о том, какого результата и на каких машинах нужно достичь. Для решения простых задач можно обойтись и без них, но вообще-то плейбуки считаются основой работы с Ansible. Примеры playbook-скриптов в самом простом виде выглядят приблизительно так:
— (начало документа)
— hosts: <имя сервера, к которому надо применить изменения>
— tasks: <состояние, к которому нужно привести сервер>
Это базовые параметры Ansible playbook, но есть и другие — их указывают перед выполнением задач, чтобы уточнить команды или дать инструкции по работе. Например:
- vars: <переменные, которые нужно использовать при выполнении скрипта>;
- user / remote_user: <имя пользователя для авторизации в системе на сервере; в новых версиях используется параметр remote_user, в старых — просто user>;
- sudo: <выполнение команды от лица другого пользователя, как правило суперпользователя root, параметр принимает значения yes и no>;
- gather_facts: <сбор или отказ от сбора информации о хостах, значение по умолчанию — yes: Ansible собирает данные о серверах, если не указать обратное>.
Роли: автоматизация рутины
Роли — инструмент Ansible, чтобы быстрее решать типовые задачи. Вместо блока tasks в плейбуке можно указать роль: шаблонный набор задач и переменных. Полезно, если нужно, например, отдать одну и ту же задачу разным серверам и не хочется писать несколько блоков tasks.
Возможности работы с Ansible
Благодаря удобной структуре с Ansible довольно легко работать. Процесс выглядит примерно так:
- Заполнить файл hosts, указать там список зависимых серверов, их доменные имена или IP-адреса.
- Указать переменные, которые нужны для подключения. Например, какому-то серверу может понадобиться имя пользователя. По умолчанию связь между серверами идет через SSH по ключу.
- Написать плейбук, в нем указать, с какими хостами сейчас нужно работать и что сделать. Сохранить плейбук в файл.
- Отдать Ansible команду на запуск плейбука.
А для некоторых действий плейбуки и вовсе не нужны. Например, узнать информацию о каком-то хосте можно просто командой в консоли. Ну а если в разных плейбуках нужно выполнять одни и те же действия — помогут роли.
Получается удобная и простая, но вместе с тем функциональная система. Разработчик может:
- отдать команду одному хосту, группе хостов или всем узлам одновременно;
- задать типовой набор переменных, чтобы применять их повторно;
- писать роли и переиспользовать наборы команд;
- использовать плейбуки, чтобы отдавать сложные команды и уточнять их.
При этом не нужно устанавливать на зависимые сервера специальное ПО, а из коробки можно работать с популярными серверными программами. Мы не будем глубоко уходить в принцип работы, но порой для настройки нескольких серверов достаточно пары строчек кода.
Преимущества Ansible
Простота освоения. Ansible довольно легко освоить, у него относительно низкий порог входа, а еще активное доброжелательное комьюнити и подробная документация. При этом система популярна, ее часто используют при управлении серверами, и у нее довольно простой код — это тоже помогает освоению.
Понятные языки. Сам Ansible написан на языке программирования Python, а еще использует формат YAML. Оба этих языка с понятным для человека синтаксисом, в них легко сориентироваться, а поддержка Python по умолчанию есть во многих Linux-системах. А еще Python — один из самых популярных языков в мире, то есть, его многие знают. Дополнительные модули для Ansible можно писать на любом языке.
Широкий набор компонентов. Благодаря большому количеству модулей и плагинов Ansible умеет работать с популярным серверным ПО сразу — не нужно скачивать множество сложных вспомогательных программ.
Работа по SSH. Если обычно системам конфигурирования нужно специальное окружение, то Ansible может работать по стандартному протоколу SSH, и на вспомогательные сервера не нужно устанавливать какое-то отдельное ПО для связи с ним. Хватает стандартных средств связи между компьютерами.
Гибкие настройки. Возможность работать в режимах pull и push, поддержка параллельных обращений, многообразные настройки команд и переменных — в Ansible много возможностей. Так что работать с ним комфортно, для многих часто встречающихся задач в системе уже есть решения.
Недостатки Ansible
Отсутствие контроля состояний. Во многих системах управления есть контроль состояний: отслеживание, что сейчас происходит на зависимых серверах. Например, контроль состояний помогает следить, какие зависимости установлены на разных хостах, чтобы избежать конфликтов. В Ansible такого нет: он просто выполняет задачи, которые ему дали, и не смотрит на состояние хоста. Некоторым это неудобно.
Отсутствие понятного GUI. Изначально Ansible был чисто консольным ПО. Позже появилась версия с графическим интерфейсом, но он до сих пор довольно сырой и недоработанный, и в нем реализована не вся функциональность и порой возникают ошибки. Так что по возможности лучше пользоваться Ansible с помощью консоли.
Плохая совместимость с Windows. Ansible сначала поддерживал только Unix-подобные ОС, в том числе Linux. Начиная с версии 1.7 в него добавили поддержку WIndows, но она до сих пор неполная. Работать приходится с оболочкой PowerShell, и в Windows все равно понадобится установить Linux-модуль.
Как начать работать с Ansible
Чтобы установить Ansible, на компьютере должен быть Python. Во многих дистрибутивах Linux Python вшит по умолчанию, но если в вашей системе его нет — понадобится сначала установить этот язык. Начинать работать с Ansible в Windows не рекомендуем: это сложнее и не так удобно.
Потом можно скачать и установить Ansible одной командой в консоли:
sudo apt install ansible
Затем можно начать описывать файл hosts и осваивать плейбуки. Чтобы успешно работать с Ansible, понадобится изучить YAML — впрочем, это довольно простой формат, который можно базово освоить за день. А синтаксис команд и возможности Ansible подробно описаны в его документации.
0 комментариев