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

Как использовать Ansible вместе с Terraform

Роман Андреев
Роман Андреев
Технический писатель
20 декабря 2022 г.
1907
5 минут чтения
Средний рейтинг статьи: 5

Terraform и Ansible — два независимых продукта, но, соединенные вместе, они представляют удобный инструмент для развертывания облачного сервера с необходимыми программными и аппаратными конфигурациями. Совмещение этих программных пакетов — наглядная иллюстрация концепции IaC (Infrastructure as Code). В статье расскажем, зачем использовать оба инструмента, и выясним, как их подружить.

Terraform и Ansible

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

Когда вы работаете с Ansible, вы запускаете Playbooks с той системы, на которой он установлен. Playbooks — это файлы манифеста, которые описывают, что нужно сделать на конкретной виртуальной машине. Например, добавить нового пользователя или установить сервер NGINX и настроить его корневую папку. Затем необходимо создать файл inventory со списком хостов, которые должен настроить Ansible. Программа считывает файл inventory и подключается к нужным виртуальным машинам через SSH, чтобы установить и настроить всё, что было указано в «плейбуке».

Похожим образом работает и Terraform. Вы устанавливаете его на свой компьютер и пишете манифесты. Когда вы выполняете команду terraform apply, она создает инфраструктуру где-то в облаке в соответствии с вашим манифестом. Поскольку Terraform в основном используется для создания новых ресурсов, его файлы манифеста определяют, например, тип виртуальных машин и их количество, которое необходимо развернуть. После создания инфраструктуры приложение сохраняет сведения о подготовленных ресурсах (например, об IP-адресах созданных виртуальных машин) обратно в файл состояния.

И чтобы заставить эти два приложения работать вместе, нам нужно каким-то образом передать информацию об инфраструктуре, созданной Terraform, в Ansible, или наоборот. Здесь у нас есть два варианта: либо использовать выходные данные Terraform в качестве входных данных для Ansible, либо поручить Terraform выполнить инструкции из файла inventory Ansible. Начнем со второго варианта.

Выполняем инструкции Ansible в Terraform

Здесь можно использовать такие инструкции Terraform, как local-exec и remote-exec. Они позволяют выполнять любую команду либо на машине, с которой запускается Terraform, либо из экземпляра, им предоставленного. Давайте заставим Terraform создавать виртуальные машины, а затем запустим плейбук Ansible для этих экземпляров. Для этого добавим следующий код в раздел подготовки экземпляров:

provisioner "local-exec" {command = "ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook -u {var.user} -i '${self.ipv4_address},' --private-key ${var.ssh_private_key} playbook.yml"}

Ключевым компонентом здесь является переменная ${self.ipv4_address}. После инициализации машины Terraform знает ее IP-адрес. И нам нужно передать IP-адрес для Ansible. Поэтому мы используем встроенную переменную в качестве входных данных для Ansible.

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

Использование вывода Terraform для Ansible Inventory

Здесь нам понадобится запустить оба сервиса отдельно, а затем импортировать данные из первого во второй. Terraform сохраняет всю информацию о предоставленных ресурсах в свой файл состояния. Там мы можем найти IP-адреса предоставленных экземпляров и импортировать их в файл inventory Ansible. По умолчанию Terraform сохраняет файл состояния локально в виде файла JSON, что упрощает его анализ и извлечение необходимых IP-адресов. Теперь, когда файл inventory готов, просто запускаем Ansible playbook для настройки узлов.

Добавим, что для автоматического импорта IP-адресов из файла можно использовать приложение Terraform Inventory. Этот инструмент извлекает список IP-адресов из файла состояния «Терраформа» и импортирует его в файл inventory Ansible, чтобы использовать затем при выполнении плейбука.

Выводы о выгодах

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

Чем больше инфраструктура, тем больше преимуществ у концепции IaC (инфраструктура как код). Без интеграции Terraform и Ansible задачи по добавлению новых виртуальных машин могут занять довольно много времени. А совместное использование описанных выше инструментов в рамках этой концепции позволит значительно сократить время, затрачиваемое на добавление новых машин в кластер.

Зарегистрируйтесь и начните пользоваться
сервисами Timeweb Cloud прямо сейчас

15 лет опыта
Сосредоточьтесь на своей работе: об остальном позаботимся мы
165 000 клиентов
Нам доверяют частные лица и компании, от небольших фирм до корпораций
Поддержка 24/7
100+ специалистов поддержки, готовых помочь в чате, тикете и по телефону