Приведи пример настройки сервиса с нуля в DevOps-стиле

«Приведи пример настройки сервиса с нуля в DevOps-стиле» — вопрос из категории Архитектура и DevOps-практики, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я настраиваю сервисы с нуля, используя принципы Infrastructure as Code (IaC) и идемпотентности. Пример — развертывание веб-приложения с Nginx, Docker и мониторингом.

1. Инфраструктура как код (Terraform): Сначала описываю виртуальную машину, группы безопасности и DNS-запись.

# main.tf - Создание инстанса в Yandex Cloud
resource "yandex_compute_instance" "web" {
  name        = "web-app"
  platform_id = "standard-v3"
  resources {
    cores  = 2
    memory = 2
  }
  boot_disk {
    initialize_params {
      image_id = "fd8vmcue7aajpmeo39kk" # Ubuntu 22.04
    }
  }
  network_interface {
    subnet_id = yandex_vpc_subnet.subnet-a.id
    nat       = true
  }
  metadata = {
    ssh-keys = "ubuntu:${file("~/.ssh/id_rsa.pub")}"
  }
}

2. Конфигурация через Ansible: Создаю плейбук для идемпотентной настройки сервера.

# playbook.yml
- hosts: web_servers
  become: yes
  tasks:
    - name: Install Docker and dependencies
      apt:
        name:
          - docker.io
          - docker-compose
        state: present
        update_cache: yes

    - name: Create directory for app
      file:
        path: /opt/myapp
        state: directory
        mode: '0755'

    - name: Copy docker-compose and nginx config
      copy:
        src: "{{ item }}"
        dest: /opt/myapp/
      loop:
        - docker-compose.yml
        - nginx.conf

    - name: Start services with Docker Compose
      community.docker.docker_compose:
        project_src: /opt/myapp
        state: present

3. Docker Compose & Nginx Config:

# docker-compose.yml
version: '3.8'
services:
  app:
    image: my-registry/app:latest
    restart: unless-stopped
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - app

4. Мониторинг: Добавляю в тот же плейбук установку Node Exporter для сбора метрик в Prometheus.

Итог: Сервис развертывается одной командой terraform apply && ansible-playbook playbook.yml, конфигурация версионируется в Git, а состояние инфраструктуры предсказуемо.