Введение в IaC и знакомство с Ansible

Эта статья логическое продолжение цикла публикаций про настройку и управление инфраструктурой. Мы уже погрузились в историю контейнеризации, познакомились с Docker, изучили язык текстовой разметки YAML и поработали с Docker-compose.

Настало время прикоснуться к «инфраструктуре как коду» — infrastructure as a code (IaC), познакомиться с Ansible и овладеть практическими навыками по работе с ним. Вы научитесь:

  1. устанавливать Ansible и подключаться к серверам;
  2. работать с конфигурациями Ansible и инвентаризационными файлами hosts;
  3. писать Playbooks и исполнять их.

После прочтения обеих статей у вас получится полноценный проект по автоматизированному развертыванию LEMP-стека на удаленных серверах с помощью Ansible.

Отлично, задача поставлена — действуем! Сначала немного теории, потом разберёмся с тем, что такое Ansible и какие задачи он решает.

Что такое инфраструктура как код?

Что такое инфраструктура как код?

Инфраструктура как код (IaC) — это подход к созданию и настройке инфраструктуры аналогичный процессу разработки ПО. То есть продумывается архитектура, прописываются процессы, устанавливается взаимодействие инфраструктурных элементов между собой. Всё это описывается в специальных форматах, предназначенных для описания иерархических систем: yaml, json, xml и аналогичные им форматы.

Философия IaC основывается на принципах «единого источника правды», согласно которому — исполнение одного и тот же кода формирует одну и ту же исполняемую среду. Благодаря такому подходу достигается единообразие элементов инфраструктуры и их ожидаемое поведение, а также идемпотентность, как свойство системы принимать одно и то же состояние при одинаковых условиях вызова.

Ключевое в IaC — это то, что все взаимодействия с инфраструктурой осуществляются через конфигурационные файлы системой, а не системными администраторами или девопсами в ручном режиме. Человеческий фактор максимально исключается из условий взаимодействий с системой.

Из главных преимуществ использования IaC можно отметить следующие:

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

Сейчас IaC — это одна из доминирующих концепций в DevOps. Она стала так популярна в первую очередь благодаря повышению скорости разработки, тестирования и возможности внедрения непрерывного развертывания (CI/CD). Сама концепция IaC проста и прозрачна, а многие инструменты работы с ней имеют невысокий порог вхождения, например — Ansible.

Что такое Ansible и какие задачи он решает?

Что такое Ansible и какие задачи он решает?

Ansible — это средство управления конфигурациями серверов (виртуальных и выделенных), сохранения их состояний, доставки и развертывания на них ПО. Так примерно звучит официальное описание Ansible, если перефразировать проще, то можно сказать так: Ansible — это инструмент автоматизации работы с серверами и ПО на них.

С помощью Ansible вы можете создавать, удалять, изменять облачные серверы (например, AWS), устанавливать и изменять на них ПО, управлять сетями и сетевыми настройками, и всё это делает Ansible самостоятельно, следуя заранее подготовленным сценариям — плейбукам (Playbook).

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

Ansible реализует 4 главных правила подхода “Инфраструктура как код” (IaC):

  1. Все элементы в инфраструктуре должны быть воспроизводимы;
  2. Должна быть возможность выкинуть любой из элементов;
  3. Инфраструктура должна быть консистентной;
  4. У инфраструктуры не должно быть финального состояния.

Обобщим перечисленные 4 концепции в одну мысль: инфраструктура меняется, ее сегодняшнее состояние — это лишь один из этапов её развития, и уже сегодня нужно подумать над завтрашними изменениями. Ansible позволяет сделать этот процесс максимально безболезненным.

Не будем долго засиживаться на теории и перейдем к аспектам работы 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 очень проста: контрольная нода с Ansible управляет хостами по SSH. Все! Никаких агентов или дополнительного ПО на удалённых серверах. Всё работает прямо из коробки, в случае с Linux, конечно.

С концепцией — понятно, здесь всё просто. Перейдем к тому, как устроен Ansible.

Как устроен Ansible

Ansible имеет изящную и простую архитектуру. Состоит он из 4 базовых элементов:

  • Inventory — файл с данными серверов, над которыми нужно совершить какие-то действия.
  • Modules — это скрипты или программы, которые загружаются на удаленные машины и там исполняются.
  • API — интерфейс взаимодействия с Ansible.
  • Plugins — это сопрограммы, расширяющие возможности Ansible.
 

Графически устройство 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 — наша подборка статей поможет разобраться с тем и с другим.