Эта статья логическое продолжение цикла публикаций про настройку и управление инфраструктурой. Мы уже погрузились в историю контейнеризации, познакомились с Docker, изучили язык текстовой разметки YAML и поработали с Docker-compose.
Настало время прикоснуться к «инфраструктуре как коду» — infrastructure as a code (IaC), познакомиться с Ansible и овладеть практическими навыками по работе с ним. Вы научитесь:
- устанавливать Ansible и подключаться к серверам;
- работать с конфигурациями Ansible и инвентаризационными файлами hosts;
- писать Playbooks и исполнять их.
После прочтения обеих статей у вас получится полноценный проект по автоматизированному развертыванию LEMP-стека на удаленных серверах с помощью Ansible.
Отлично, задача поставлена — действуем! Сначала немного теории, потом разберёмся с тем, что такое Ansible и какие задачи он решает.
Что такое инфраструктура как код?
Инфраструктура как код (IaC) — это подход к созданию и настройке инфраструктуры аналогичный процессу разработки ПО. То есть продумывается архитектура, прописываются процессы, устанавливается взаимодействие инфраструктурных элементов между собой. Всё это описывается в специальных форматах, предназначенных для описания иерархических систем: yaml, json, xml и аналогичные им форматы.
Философия IaC основывается на принципах «единого источника правды», согласно которому — исполнение одного и тот же кода формирует одну и ту же исполняемую среду. Благодаря такому подходу достигается единообразие элементов инфраструктуры и их ожидаемое поведение, а также идемпотентность, как свойство системы принимать одно и то же состояние при одинаковых условиях вызова.
Ключевое в IaC — это то, что все взаимодействия с инфраструктурой осуществляются через конфигурационные файлы системой, а не системными администраторами или девопсами в ручном режиме. Человеческий фактор максимально исключается из условий взаимодействий с системой.
Из главных преимуществ использования IaC можно отметить следующие:
- нет уникальных конфигураций серверов, они не превращаются в «серверы снежинки», а значит нет проблем с их поддержкой и обслуживанием;
- тестовые и продакшн среды теперь одинаковы, приложения себя ведут идентично везде;
- быстрая доставка и масштабирование приложений из тестовых сред в продакшн.
Сейчас IaC — это одна из доминирующих концепций в DevOps. Она стала так популярна в первую очередь благодаря повышению скорости разработки, тестирования и возможности внедрения непрерывного развертывания (CI/CD). Сама концепция IaC проста и прозрачна, а многие инструменты работы с ней имеют невысокий порог вхождения, например — Ansible.
Что такое Ansible и какие задачи он решает?
Ansible — это средство управления конфигурациями серверов (виртуальных и выделенных), сохранения их состояний, доставки и развертывания на них ПО. Так примерно звучит официальное описание Ansible, если перефразировать проще, то можно сказать так: Ansible — это инструмент автоматизации работы с серверами и ПО на них.
С помощью Ansible вы можете создавать, удалять, изменять облачные серверы (например, AWS), устанавливать и изменять на них ПО, управлять сетями и сетевыми настройками, и всё это делает Ansible самостоятельно, следуя заранее подготовленным сценариям — плейбукам (Playbook).
Ansible строго следует философии IaC — вся работа с инфраструктурой осуществляется только через код. Поэтому мы можем поддерживать единообразие систем на всех серверах или группах серверов и быть уверенными в том, что наши приложения будут работать корректно на всех серверах.
Ansible реализует 4 главных правила подхода “Инфраструктура как код” (IaC):
- Все элементы в инфраструктуре должны быть воспроизводимы;
- Должна быть возможность выкинуть любой из элементов;
- Инфраструктура должна быть консистентной;
- У инфраструктуры не должно быть финального состояния.
Обобщим перечисленные 4 концепции в одну мысль: инфраструктура меняется, ее сегодняшнее состояние — это лишь один из этапов её развития, и уже сегодня нужно подумать над завтрашними изменениями. Ansible позволяет сделать этот процесс максимально безболезненным.
Не будем долго засиживаться на теории и перейдем к аспектам работы Ansible.
Как работает Ansible
Ansible не единственная система управления конфигурациями серверов, есть ещё Pulumi, Chef, Otter, Puppet, SaltStack, CFEngine, DSC и, конечно же, Terraform. Что отличает Ansible и Terraform от многих других инструментов — это их безагентная модель работы, то есть, Ansible умеет подключаться к удаленным серверам и работать на них прямо по SSH, в случае с Windows — это WinRM.
Всё что нужно для работы Ansible на удалённом сервере — это Python 3+, открытый порт SSH для Linux и Python 3+, Ansible Windows User и WinRM для Windows. Сам Ansible устанавливается только на компьютер администратора под управлением Linux. Для тех, кто предпочитает работать под Windows — есть замечательный WSL2.
Если вы ещё не знакомы с WSL2 — рекомендуем прочесть наш краткий мануал, из которого вы узнаете как установить и настроить Linux внутри Windows, и пользоваться преимуществами обоих ОС одновременно.
Погрузимся немного в терминологию (здесь без неё, к сожалению, никуда — нужно быть в теме):
- Компьютер, на который установлен Ansible называется управляющей нодой (Control node);
- Все действия на удаленных серверах Ansible делает через модули;
- Удалённые серверы, к которым подключается Ansible называются хостами.
Графически схему работы Ansible можно представить так:
Итого, концепция работы Ansible очень проста: контрольная нода с Ansible управляет хостами по SSH. Все! Никаких агентов или дополнительного ПО на удалённых серверах. Всё работает прямо из коробки, в случае с Linux, конечно.
С концепцией — понятно, здесь всё просто. Перейдем к тому, как устроен Ansible.
Как устроен Ansible
Ansible имеет изящную и простую архитектуру. Состоит он из 4 базовых элементов:
- Inventory — файл с данными серверов, над которыми нужно совершить какие-то действия.
- Modules — это скрипты или программы, которые загружаются на удаленные машины и там исполняются.
- API — интерфейс взаимодействия с Ansible.
- Plugins — это сопрограммы, расширяющие возможности Ansible.
Графически устройство Ansible можно представить так:
Как мы говорили ранее, Ansible — это программа, чтобы она заработала, ее нужно вызвать. Сделать это может пользователь, обратившись к Ansible через терминал или другая программа, например планировщик заданий CronTab.
Промежуточный итог
Итак, мы познакомились с концепцией инфраструктуры как кода и системой управления конфигурациями серверов Ansible. Подведем промежуточный итог и двинемся дальше — к практике работы с Ansible. Что нового мы узнали:
- IaC — это подход взаимодействия с инфраструктурой через систему управления, которая исполняет заранее созданные сценарии;
- Философия IaC основывается на принципах «единого источника правды»;
- Преимущества IaC: идентичность систем на всех заданных серверах, ожидаемое поведение приложений в независимости от среды исполнения, экономия времени и человеческих ресурсов, простая и понятная концепция, относительно невысокий порог вхождения;
- Ansible — это инструмент автоматизации работы с серверами и ПО на них. Он использует безагентную модель работы по принципу push.
- Ansible состоит из 4 базовых элементов: файла с данными серверов — Inventory, программ, загружаемых на серверы, API, сопрограмм, расширяющих возможности Ansible.
- Принцип работы Ansible заключается в загрузке на удаленные серверы модулей (скриптов или программ), исполнения их и фиксации изменений состояния системы.
В следующей статье мы непосредственно поработаем с Ansible — реализуем проект по развертке LEMP стека на виртуальных серверах 1cloud. Для последующей работы нам понадобится Linux и знания yaml. Если вы пользователь Windows и у вас нет под рукой машины с Linux или вы не знакомы с yaml — наша подборка статей поможет разобраться с тем и с другим.
YAML для начинающих
Разбираемся в синтаксисе YAML, сравним его с XML, смотрим как его интерпретирует Python и попрактикуемся.
Linux внутри Windows 10
Краткий обзор технологии, гайд по установке и работе в WSL.
Статьи по Linux для начинающих
Подборка из 3 статей, раскрывающие тонкости работы в терминале Linux.