Terraform и Ansible — два независимых продукта, но, соединенные вместе, они представляют удобный инструмент для развертывания облачного сервера с необходимыми программными и аппаратными конфигурациями. Совмещение этих программных пакетов — наглядная иллюстрация концепции IaC (Infrastructure as Code). В статье расскажем, зачем использовать оба инструмента, и выясним, как их подружить.
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. Начнем со второго варианта.
cloud
Здесь можно использовать такие инструкции 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 сохраняет всю информацию о предоставленных ресурсах в свой файл состояния. Там мы можем найти IP-адреса предоставленных экземпляров и импортировать их в файл inventory
Ansible. По умолчанию Terraform сохраняет файл состояния локально в виде файла JSON, что упрощает его анализ и извлечение необходимых IP-адресов. Теперь, когда файл inventory
готов, просто запускаем Ansible playbook для настройки узлов.
Добавим, что для автоматического импорта IP-адресов из файла можно использовать приложение Terraform Inventory. Этот инструмент извлекает список IP-адресов из файла состояния «Терраформа» и импортирует его в файл inventory
Ansible, чтобы использовать затем при выполнении плейбука.
Разверните облачный сервер в Timeweb Cloud
Допускаем, что интеграция Terraform-Ansible может показаться ненужным усложнением простой задачи по развертыванию виртуальной машины. Но, хотя настройку одной виртуальной машины действительно быстрее выполнить через веб-интерфейс, развертывание и настройка десятков виртуальных машин займет слишком много времени.
Чем больше инфраструктура, тем больше преимуществ у концепции IaC (инфраструктура как код). Без интеграции Terraform и Ansible задачи по добавлению новых виртуальных машин могут занять довольно много времени. А совместное использование описанных выше инструментов в рамках этой концепции позволит значительно сократить время, затрачиваемое на добавление новых машин в кластер.