Возможность в автоматическом режиме разворачивать заранее предопределенные конфигурации набора виртуальных машин (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 для настройки после подготовки.
- Heat создает инфраструктуру и выводит IP-адреса созданных серверов.
- Плейбук Ansible использует эти IP-адреса для подключения по SSH и установки программного обеспечения.
- Можно динамически генерировать инвентаризацию 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:
- Хранение шаблонов в Git: Все определения инфраструктуры хранятся в репозиториях.
- Проверка кода: Pull request’ы запускают проверки синтаксиса и линтеры.
- Автоматическое развертывание: После слияния изменений конвейер CI/CD применяет их к целевой среде.
- Дрифт-детекция: Регулярная проверка соответствия реальной инфраструктуры шаблонам.
Пример конвейера 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