Ответ
Декларативный подход — это парадигма, при которой я описываю желаемое конечное состояние инфраструктуры или конфигурации, а инструмент (Terraform, Kubernetes, Ansible) сам определяет и выполняет последовательность действий для достижения этого состояния.
Контраст с императивным подходом:
- Императивный (как сделать): "Запусти скрипт, который создаст 3 ВМ, установит на них Nginx и настроит балансировщик". Это последовательность команд.
- Декларативный (что должно быть): "В инфраструктуре должно быть 3 ВМ с установленным Nginx за балансировщиком". Это описание цели.
Почему в DevOps это стало стандартом:
- Идемпотентность: Многократное применение конфигурации даёт один и тот же результат. Не страшно запустить
terraform applyдважды. - Версионность и код как инфраструктура (IaC): Конфигурационный файл можно хранить в Git, ревьюить, тегировать.
- Самодокументируемость: По файлам Terraform или Kubernetes манифестам легко понять, что развёрнуто.
- Упрощение коллаборации и CI/CD: Процесс развёртывания инфраструктуры становится частью пайплайна.
Примеры декларативных инструментов:
1. Terraform (инфраструктура):
# main.tf - Описываем, что в облаке AWS должна быть VPC и две подсети.
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
tags = { Name = "Production VPC" }
}
resource "aws_subnet" "public" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
availability_zone = "us-east-1a"
}
resource "aws_subnet" "private" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.2.0/24"
availability_zone = "us-east-1b"
}
Запуск: terraform apply. Terraform сам рассчитает, что нужно создать VPC, затем подсети.
2. Kubernetes (оркестрация контейнеров):
# deployment.yaml - Описываем, что в кластере должен быть деплоймент из 3 реплик нашего приложения.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3 # ЖЕЛАЕМОЕ состояние: 3 пода
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app-container
image: myregistry/app:v1.2.3
ports:
- containerPort: 8080
Применение: kubectl apply -f deployment.yaml. Если один под упадёт, Kubernetes автоматически создаст новый, чтобы соответствовать декларации (replicas: 3).
3. Ansible (в декларативном режиме):
# site.yml - Описываем, что на серверах должна быть установлена последняя версия nginx и он должен быть запущен.
- hosts: webservers
tasks:
- name: Ensure nginx is at the latest version
ansible.builtin.apt:
name: nginx
state: latest
- name: Ensure nginx is running
ansible.builtin.service:
name: nginx
state: started
enabled: yes
Итог: Декларативный подход — это фундамент современного DevOps, позволяющий управлять сложной, масштабируемой и воспроизводимой инфраструктурой предсказуемым образом.