Идеальный дуэт: Ansible и Terraform

В мире разработки программного обеспечения автоматизация — это невоспетый герой, который спасает нас от рутинных задач и подводных камней человеческих ошибок. Два инструмента, которые вышли на первый план этой революции автоматизации, — это Ansible и Terraform. Хотя они служат разным целям, они прекрасно дополняют друг друга, превращаясь в незаменимый дуэт в любом наборе инструментов DevOps.

Что такое Terraform?

Terraform, разработанный HashiCorp, представляет собой мощный инструмент инфраструктуры как кода (IaC). Он позволяет определять и управлять инфраструктурой с помощью декларативного файла конфигурации. С помощью Terraform вы можете подготавливать и управлять ресурсами различных облачных провайдеров, локальными средами и даже гибридными установками. Его сила заключается в способности управлять жизненным циклом инфраструктурных ресурсов от создания до уничтожения с помощью простого и понятного файла конфигурации.

Что такое Ansible?

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

Зачем использовать Ansible и Terraform вместе?

Хотя оба инструмента могут выполнять некоторые перекрывающиеся задачи, их истинная сила заключается в синергии. Вот как они могут беспрепятственно работать вместе:

Подготовка Terraform

Terraform идеально подходит для настройки базовой инфраструктуры. Вы можете определить свои серверы, сети, хранилища и другие ресурсы в файле конфигурации Terraform. Вот простой пример того, как можно подготовить несколько капель DigitalOcean с помощью Terraform:

provider "digitalocean" {
  token = var.do_token
}

resource "digitalocean_droplet" "web" {
  name       = "web-server-${count.index}"
  size       = "s-1vcpu-1gb"
  image      = "ubuntu-20-04-x64"
  region     = "nyc1"
  count      = 3
}

Конфигурация Ansible

Как только инфраструктура подготовлена, Ansible берёт на себя настройку серверов. Вы можете написать книгу воспроизведения Ansible для установки необходимого программного обеспечения, настройки операционной системы и обеспечения того, чтобы все компоненты находились в нужном состоянии. Вот пример книги воспроизведения для установки Apache на подготовленные капли:

---
- name: Install and configure Apache
  hosts: all
  become: true

  tasks:
    - name: Install Apache
      apt:
        name: apache2
        state: present

    - name: Start Apache
      service:
        name: apache2
        state: started
        enabled: yes

    - name: Create index.html
      copy:
        content: "Welcome to my web server!"
        dest: /var/www/html/index.html

Интеграция Ansible с Terraform

Существует несколько способов интеграции Ansible с Terraform, обеспечивающих бесшовную подготовку и настройку инфраструктуры.

Использование поставщиков Terraform

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

resource "digitalocean_droplet" "web" {
  name       = "web-server-${count.index}"
  size       = "s-1vcpu-1gb"
  image      = "ubuntu-20-04-x64"
  region     = "nyc1"
  count      = 3

  provisioner "local-exec" {
    command = "ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook -i ${path.module}/hosts.ini ${path.module}/apache.yml"
  }
}

Использование выходных данных Terraform в качестве инвентаря Ansible

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

Вот пример того, как вы можете использовать инструмент terraform-inventory для создания файла инвентаризации Ansible из состояния Terraform:

$ terraform-inventory -inventory terraform.tfstate

Это создаст файл инвентаризации, который Ansible может использовать для нацеливания на подготовленные экземпляры.

Диаграмма рабочего процесса

Вот упрощённая диаграмма рабочего процесса, показывающая, как Terraform и Ansible работают вместе:

sequenceDiagram participant Dev participant Terraform participant Ansible participant Cloud Dev->>Terraform: Run terraform apply Terraform->>Cloud: Provision infrastructure Cloud->>Terraform: Return resource details Terraform->>Ansible: Trigger Ansible playbook via provisioner Ansible->>Cloud: Configure provisioned resources Cloud->>Ansible: Confirm configuration Ansible->>Dev: Report completion

Пошаговое руководство

Вот подробное пошаговое руководство, которое поможет вам начать работу:

Шаг 1: Настройте свою среду

  • Установите Terraform и Ansible на свой локальный компьютер.
  • Настройте учётную запись облачного провайдера (например, DigitalOcean, AWS) и сгенерируйте необходимые токены API или ключи.

Шаг 2: Создайте пару ключей SSH

Создайте пару ключей SSH для аутентификации. Это важно как для Terraform, так и для Ansible для доступа к подготовленным экземплярам.

$ ssh-keygen -t rsa -b 4096 -C "[email protected]"

Шаг 3: Напишите конфигурацию Terraform

Создайте файл конфигурации Terraform для определения своей инфраструктуры. Вот пример подготовки капель на DigitalOcean:

provider "digitalocean" {
  token = var.do_token
}

resource "digitalocean_droplet" "web" {
  name       = "web-server-${count.index}"
  size       = "s-1vcpu-1gb"
  image      = "ubuntu-20-04-x64"
  region     = "nyc1"
  count      = 3
}

Шаг 4: Инициализируйте Terraform

Инициализируйте рабочий каталог Terraform, чтобы подготовить его к использованию.

$ terraform init

Шаг 5: Примените конфигурацию Terraform

Примените конфигурацию Terraform для подготовки инфраструктуры.

$ terraform apply

Шаг 6: Напишите книгу воспроизведения Ansible

Создайте книгу воспроизведения Ansible для настройки подготовленных экземпляров. Вот пример установки Apache:

---
- name: Install and configure Apache
  hosts: all
  become: true

  tasks:
    - name: Install Apache
      apt:
        name: apache2
        state: present

    - name: Start Apache
      service:
        name: apache2
        state: started
        enabled: yes

    - name: Create index.html
      copy:
        content: "Welcome to my web server!"
        dest: /var/www/html/index.html

Шаг 7: Интегрируйте Ansible с Terraform

Используйте средства подготовки Terraform для выполнения книги воспроизведения Ansible после подготовки экземпляров.

resource "digitalocean_droplet" "web" {
  name       = "web-server-${count.index}"
  size       = "s-1vcpu-1gb"
  image      = "ubuntu-20-04-x64"
  region     = "nyc1"
  count      = 3

  provisioner "local-exec" {
    command = "ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook -i ${path.module}/hosts.ini ${path.module}/apache.yml"
  }
}

Заключение

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

Так что в следующий раз, когда вы обнаружите, что тонете в море ручных задач, помните: с Ansible и Terraform вы сможете автоматизировать свой путь к более эффективному, надёжному и приятному опыту разработки. Счастливой автоматизации!