Перейти к содержанию

💻 IAC

Infrastructure as Code — способ управлять ИТ-инфраструктурой с помощью кода: описывать серверы, сети, хранилища и окружения в файлах, хранить их в репозитории и применять изменения автоматически.

Status: In progress

1. Проблематика
Infrastructure as Bash History

«Как установить сервер?» — «Смотри в моей .bash_history за прошлый вторник.»

Настройка = череда apt install, sed, systemctl без зафиксированного описания.

Проблемы:

  • невоспроизводимость на другом хосте
  • нет версионирования и аудита «кто что менял»
  • хрупкость: одна ошибка в цепочке ломает всё неочевидно
Дрифт конфигураций (Configuration Drift)

Постепенное расхождение текущего состояния сервера с желаемым (из кода или эталона).

Почему бывает:

  • ручные правки мимо автоматизации
  • обновления не на всех узлах одинаково
  • автоматизация покрывает не всё

Последствия: сбои, сложная отладка, серверы превращаются в «снежинки».

Серверы-снежинки (Snowflake / Pets)

Уникальные, часто вручную накопленные конфигурации. Каждый хост «особенный».

Проблемы: не восстановить 1:1 после аварии, трудно масштабировать, тяжело сопровождать.

Серверы-фениксы (Phoenix / Cattle)

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

Плюсы: воспроизводимость, масштабирование, быстрая замена при сбое.

Практики улучшения
  • переиспользование и переменные вместо «магических» констант в коде
  • атомарные задачи
  • VCS, code review, тесты — как у обычного ПО
2. Выгоды IaC
Снижение затрат

Один инженер через код ведёт много машин; рутина автоматизируется; облако можно гасить, когда не нужно (например, через Terraform).

Скорость

Среды и серверы поднимаются за минуты по одному описанию; изменения на парке узлов — согласованно; восстановление ближе к «пересоздать феникс».

Меньше рисков

Меньше ручных опечаток; желаемое состояние в коде; откат и ревью через Git; меньше дрифта при дисциплине применения.

3. Паттерны
Идемпотентность

Операция идемпотентна, если повторный запуск даёт тот же результат и не ломает уже настроенную систему.

В IaC это база декларативных инструментов: можно смело гонять playbook / apply снова.

Пример Ansible:

- name: Установить Nginx
  apt:
    name: nginx
    state: present
  • уже установлен → ничего не меняет
  • нет → установит
  • повторный запуск → снова «Nginx есть»

Кратко: Ansible — конфиг серверов (модули), Terraform — инфраструктура (API + state), Kubernetes — желаемое состояние нагрузки (контроллеры + манифесты).

Императивный подход

Описываешь как — шаги по порядку.

apt-get update
apt-get install -y nginx
systemctl start nginx
echo "Привет" > /var/www/html/index.html

Плюсы: просто, полный контроль, без тяжёлых инструментов. Минусы: плохо масштабируется, нет сверки с текущим состоянием, легко накопить ошибки.

Декларативный подход

Описываешь что должно быть; инструмент сам сходится к состоянию (обычно идемпотентно).

- hosts: webservers
  tasks:
    - name: Установить Nginx
      apt:
        name: nginx
        state: present
    - name: Nginx запущен
      service:
        name: nginx
        state: started
        enabled: true

Плюсы: масштаб, повторные прогоны, меньше сюрпризов. Минусы: нужно учить инструмент, меньше контроля над каждым шагом.

4. Push и Pull
Push

Управляющий узел сам применяет конфиг к целям (SSH, API).

Примеры: Ansible по SSH, Terraform → API облака.

+ быстро, часто без агента (Ansible) нужен доступ до узлов / API, на очень больших парках сложнее

Pull

Агенты на узлах сами забирают конфиг с центра.

Примеры: Puppet Agent, kubelet ← API Kubernetes.

+ лучше масштаб, узлы автономнее нужны агенты, возможна задержка цикла pull

5. Карта инструментов
Инструмент Push / Pull Подход Зачем
Ansible Push (SSH) Declarative (playbooks) Конфиг ОС и приложений
Ansible ad-hoc Push Imperative Разовые команды
Terraform Push (API) Declarative Облачная / DC инфраструктура + state
Kubernetes Pull (kubelet) Declarative Поды, сервисы, желаемое состояние кластера
Puppet Pull (agent) Declarative Долгоживущий CM на агентах
SaltStack Push / Pull Dec / Imp Гибкий CM, reactor-события

Подробный разбор playbooks — в разделе ANSIBLE.

6. Управление конфигурациями (кратко)

Цели CM: контроль изменений, управляемый жизненный цикл, предсказуемое качество.

На примере Ansible:

Задача Как проявляется
Идентификация inventory, playbooks, роли в Git
Контроль идемпотентные модули, повторный прогон безопасен
Учёт состояния facts (setup)
Процесс разработки Git + CI (Jenkins, GitLab CI…)
Сборка / окружения одни playbooks, разные -e target=… / inventory
ansible-playbook deploy.yml -e "target=webservers_dev"
ansible-playbook deploy.yml -e "target=webservers_prod"
Вопросы

В разработке..