Возможность в автоматическом режиме разворачивать заранее предопределенные конфигурации набора виртуальных машин (IaC)

Инфраструктура как код (IaC) произвела революцию в том, как мы создаем и управляем облачными средами. Рассматривая определения инфраструктуры как версионированный код, команды могут надежно и воспроизводимо развертывать сложные среды, избегая ошибок, связанных с ручным вводом данных, и отклонений от заданных параметров.

Инструменты IaC помогают определять, развертывать и управлять инфраструктурой воспроизводимым способом с контролем версий. Например, инженер DevOps может хранить спецификации сети, вычислительных ресурсов и хранилища OpenStack в Git, а затем использовать автоматизированные конвейеры для развертывания или обновления облачной среды по запросу.

Создание воспроизводимой инфраструктуры с помощью OpenStack Heat

Сервис Heat от OpenStack предоставляет возможность оркестровки облачных ресурсов на основе шаблонов. Шаблон Heat — это удобочитаемый текстовый файл YAML, в котором указывается необходимая инфраструктура: виртуальные машины, сети, тома, группы безопасности и т.д., а также их взаимосвязи.

Примечание

Heat вызывает API OpenStack в правильном порядке для создания всей инфраструктуры. Шаблоны Heat описывают инфраструктуру облачного приложения в текстовых файлах, которые могут управляться с помощью инструментов контроля версий.

Основные возможности Heat

  • Управление зависимостями: Если том объявлен как подключенный к определенному серверу, Heat знает, что сначала нужно создать сервер, затем том, а затем подключить их.
  • Полный жизненный цикл: После создания стека (развернутого шаблона) вы можете обновить его, изменив шаблон и повторно применив его. Heat вычисляет разницу и корректирует ресурсы.
  • Декларативность: Шаблоны определяют конечное состояние инфраструктуры, а Heat обеспечивает его достижение.
  • Параметры и условия: Возможность параметризации шаблонов и динамического включения/исключения ресурсов.
  • Циклы: Новые версии HOT (Heat Orchestration Template) поддерживают циклы для генерации нескольких похожих ресурсов.

Пример шаблона Heat

heat_template_version: 2023-05-18
description: Simple template to deploy a single instance

parameters:
  image:
    type: string
    description: Image ID or name
  flavor:
    type: string
    description: Flavor to use
  network:
    type: string
    description: Network ID or name

resources:
  server:
    type: OS::Nova::Server
    properties:
      image: { get_param: image }
      flavor: { get_param: flavor }
      networks:
        - network: { get_param: network }

outputs:
  instance_ip:
    description: IP address of the deployed instance
    value: { get_attr: [server, first_address] }

Пример с циклом

resources:
  security_group_rules:
    type: OS::Neutron::SecurityGroup
    repeat:
      for_each:
        <%port%>: { get_param: ports }
      template:
        protocol: tcp
        port_range_min: <%port%>
        port_range_max: <%port%>

Преимущества использования Heat

  • Повторяемость: Один и тот же шаблон можно применять одинаково в средах разработки, тестирования или производства.
  • Идемпотентность: Повторное применение шаблона не создает дубликатов.
  • Контроль версий: Шаблоны можно сравнивать, проверять и отслеживать в Git.
  • Фиксация лучших практик: Команды могут фиксировать утвержденные архитектуры.

Оркестрация с помощью плейбуков Ansible

В то время как Heat отвечает за предоставление инфраструктуры в OpenStack, Ansible превосходно справляется с более широкими задачами оркестрации и управления конфигурацией.

Примечание

Ansible использует YAML-плейбуки для описания последовательностей задач, выполняемых без агентов по SSH (или соответствующим API). В отличие от Heat, который фокусируется на создании ресурсов, Ansible часто используется для настройки этих ресурсов после их создания.

Модули Ansible для OpenStack

Сообщество OpenStack поддерживает коллекцию Ansible openstack.cloud, которая предоставляет модули и плагины для управления облаками OpenStack:

  • openstack.cloud.server — создание/удаление экземпляров
  • openstack.cloud.network — управление сетями
  • openstack.cloud.volume — управление томами
  • и многие другие

Пример плейбука Ansible

- name: Launch webserver
  openstack.cloud.server:
    auth: "{{ openstack_auth }}"
    state: present
    name: web1
    image: CentOS-Stream
    flavor: m1.medium
    network: private-net
    key_name: mykey

- name: Wait for SSH
  wait_for:
    host: "{{ server.openstack.addresses.private-net[0].addr }}"
    port: 22
    delay: 10
    timeout: 300

- name: Install nginx
  apt:
    name: nginx
    state: present
  delegate_to: "{{ server.openstack.addresses.private-net[0].addr }}"

Комбинированный подход: Heat + Ansible

Один из практических вариантов: использовать Heat для запуска виртуальных машин, а затем использовать Ansible для настройки после подготовки.

  1. Heat создает инфраструктуру и выводит IP-адреса созданных серверов.
  2. Плейбук Ansible использует эти IP-адреса для подключения по SSH и установки программного обеспечения.
  3. Можно динамически генерировать инвентаризацию Ansible из выходных данных Heat.
# Создание стека Heat
openstack stack create -t template.yaml --wait my-stack

# Получение выходных данных
SERVER_IP=$(openstack stack output show my-stack instance_ip -c output_value -f value)

# Запуск Ansible плейбука
ansible-playbook -i "$SERVER_IP," configure.yml

Управление с помощью Terraform

Terraform от HashiCorp — еще один популярный инструмент IaC, поддерживающий OpenStack через провайдер terraform-provider-openstack.

terraform {
  required_providers {
    openstack = {
      source = "terraform-provider-openstack/openstack"
    }
  }
}

provider "openstack" {
  auth_url = "https://openstack.example.com:5000/v3"
  tenant_name = "my-project"
  user_name   = "admin"
  password    = "password"
}

resource "openstack_compute_instance_v2" "web" {
  name       = "web-server"
  image_name = "CentOS-Stream"
  flavor_name = "m1.medium"
  network {
    name = "private-net"
  }
}

Интеграция с CI/CD и GitOps

IaC в OpenStack естественным образом интегрируется с практиками CI/CD и GitOps:

  1. Хранение шаблонов в Git: Все определения инфраструктуры хранятся в репозиториях.
  2. Проверка кода: Pull request’ы запускают проверки синтаксиса и линтеры.
  3. Автоматическое развертывание: После слияния изменений конвейер CI/CD применяет их к целевой среде.
  4. Дрифт-детекция: Регулярная проверка соответствия реальной инфраструктуры шаблонам.

Пример конвейера GitLab CI

stages:
  - validate
  - plan
  - apply

validate:
  stage: validate
  script:
    - openstack stack validate -t template.yaml

plan:
  stage: plan
  script:
    - openstack stack preview -t template.yaml --dry-run

apply:
  stage: apply
  script:
    - openstack stack create -t template.yaml --wait production-stack
  only:
    - main