04 нояб. 2025 г.·7 мин

CMDB как код: факты Ansible, нормализация и контроль изменений

CMDB как код: как собирать факты Ansible, нормализовать данные и фиксировать изменения, чтобы реестр не устаревал и приносил пользу.

CMDB как код: факты Ansible, нормализация и контроль изменений

Почему CMDB перестает быть полезной

«Мертвый реестр» - это CMDB, которая формально существует, но ей не доверяют. Записи устарели, часть полей заполнена «для галочки», а решения все равно принимают по чатам, Excel и памяти отдельных людей.

Чаще всего все начинается с ручного заполнения. Пока серверов десятки, кто-то еще успевает обновлять карточки после изменений. Но когда появляются регулярные патчи, замены дисков, миграции ВМ и срочные правки «на ночь», реестр начинает отставать. Люди заняты инцидентами и проектами, а обновление CMDB не выглядит срочным, пока не случится проверка или авария.

Ситуацию усугубляет отсутствие владельца данных. Админы считают, что это задача эксплуатации, эксплуатация - что это задача ИБ или архитекторов, а владельцы сервисов видят CMDB только в отчетах.

Симптомы обычно заметны сразу:

  • у одного сервера разные имена в мониторинге, инвентаризации и CMDB
  • поля «ОС», «ответственный», «среда» заполнены не везде или разным языком
  • даты изменений не сходятся с реальными окнами работ
  • новые серверы появляются в сети, но не появляются в CMDB
  • никто не может сказать, какая запись «правильная»

Дальше это бьет по работе. При инциденте дольше ищут владельца и зависимости, восстановление затягивается. На аудите приходится собирать доказательства вручную. Закупки и планирование искажаются: кажется, что оборудования хватает, хотя часть узлов уже давно заменилась или перегружена.

Поэтому CMDB как код ценна не сама по себе, а как способ сделать обновления регулярными, проверяемыми и привязанными к фактам, а не к ручным обещаниям.

CMDB как код простыми словами

CMDB как код - это подход, где сведения о серверах и их настройках живут не в ручной базе, а в виде данных, которые можно автоматически собрать, проверить правилами и сохранить с историей изменений. Если инфраструктура меняется каждый день, CMDB тоже должна обновляться каждый день без ручного ввода.

Обычная «табличка в Excel» ломается в двух местах. Во-первых, непонятно, кто и когда вносил правку, и можно ли ей верить. Во-вторых, обновление постоянно откладывают: нет времени, нет владельца, нет понятных правил. В итоге CMDB превращается в архив догадок.

В подходе «как код» источником фактов становятся сами машины (например, через Ansible facts). А вы добавляете слой правил: какие поля важны, как они называются, как сверять значения и что считать ошибкой. Затем изменения фиксируются так же строго, как изменения в коде: видно, что поменялось, где и когда.

Успех здесь измеряется не количеством заполненных полей, а тремя вещами:

  • точность: данные совпадают с реальностью на серверах
  • полнота: покрыты нужные группы систем, а не «пара критичных»
  • скорость обновления: изменения попадают в CMDB быстро, а не раз в квартал

Чтобы начать без перегруза, выберите минимальный набор: уникальный идентификатор хоста, ОС и версия, роли или назначение, основные ресурсы (CPU/RAM/диски), сетевые идентификаторы (IP/MAC), владелец или команда поддержки. Этого достаточно, чтобы ловить дрейф конфигураций и не получить «мертвый реестр» уже в первый месяц.

Источник правды и границы ответственности

Чтобы CMDB как код не превратилась в спорный справочник, заранее решите, где именно находится «правда» для каждого типа данных. Одна и та же запись о сервере может иметь разные официальные источники: железо и серийники лучше брать из закупок или от производителя, сетевые параметры - из IPAM, учетные данные и политики - из систем безопасности, а «живые» признаки ОС и пакетов - из Ansible facts.

Полезно разделить два слоя: факты и намерения. Факты отвечают на вопрос «что сейчас»: версия ядра, список дисков, включенные службы. Намерения отвечают «как должно быть»: целевой образ ОС, разрешенные пакеты, обязательные агенты. Когда эти слои смешаны, CMDB начинает врать. Админ обновил пакет, а «должно быть» не поменяли, и непонятно, это дрейф или новое правило.

Границы ответственности проще закрепить через владельцев данных. Обычно работает такая схема:

  • инфраструктура: хосты, виртуализация, сеть, базовые параметры ОС
  • безопасность: шифрование, учетные политики, агенты EDR, критичность
  • приложения: сервис, среда (dev/test/prod), зависимости, окна работ

Дальше договоритесь о минимальном обязательном наборе полей. Например: уникальный идентификатор, владелец, среда, роль, критичность, источник данных и отметка времени последнего подтверждения. Все остальное делайте необязательным. Иначе люди начнут заполнять «для галочки», и вы снова получите «мертвый реестр».

Модель данных: что именно вы храните в CMDB

Чтобы CMDB не превратилась в «мертвый реестр», сначала договоритесь не про инструмент, а про модель данных: какие объекты вы описываете, какие поля считаете обязательными, и что для вас является «одной и той же машиной». В подходе CMDB как код это особенно важно: автосбор фактов быстро заполнит «все подряд», а пользы не будет.

Практичный старт - хранить только то, что нужно для эксплуатации и контроля изменений, а остальное подтягивать по запросу. Обычно хватает такого набора сущностей:

  • сервер (физический или виртуальный) как главный объект учета
  • ОС и базовые параметры (дистрибутив, версия, ядро)
  • сеть (интерфейсы, IP, VLAN/подсеть, DNS-имя)
  • диски и файловые системы (размер, тип, точки монтирования)
  • сервисы и приложения (что запущено и кто владелец)

Дальше определите идентификацию. Hostname удобен, но ненадежен: его меняют, клонируют, ошибаются в регистре. Лучше иметь «жесткий» ключ (серийный номер, UUID, asset tag) и один-два «мягких» (hostname, основной IP). В CMDB полезно хранить все варианты, но выбрать один главный.

Смысл данным дают связи: сервер привязан к площадке и стойке, к роли (например, БД, веб, терминальный), к владельцу (команда или подразделение) и к критичности. Тогда при изменении, например, сетевого интерфейса понятно, какой сервис и какой владелец затронут.

Зафиксируйте правила представления. Они кажутся мелочью, но именно они спасают от «каши» в отчетах:

  • размеры только в GiB (или только в GB), без смешивания
  • CPU: отдельно «ядра» и отдельно «потоки», не одно поле
  • имена: единый формат hostname и окружения (prod/test/dev)
  • справочники: роли, площадки, владельцы только из списка
  • пустые значения: лучше null, чем текст «unknown»

Пошаговый поток: сбор фактов Ansible до записи в CMDB

Чтобы CMDB не превращалась в «мертвый реестр», ей нужен повторяемый поток данных: от инвентаря до фиксации изменений. Важно, чтобы поток работал одинаково для продакшена и теста, а также для разных площадок и филиалов.

1) От инвентаря к наблюдаемой реальности

Начните с четкого перечня: какие хосты вы считаете «в учете», и как они группируются. Обычно достаточно двух-трех разрезов: среда (prod/dev), площадка (DC1/DC2), роль (web/db/backup). Если сервер не попал в инвентарь Ansible, он не попадет и в CMDB. Это нормально, если правило известно всем.

Дальше включите сбор фактов и добавьте то, что стандартные facts не покрывают: наличие агента мониторинга, версию критичного пакета, параметры RAID, метки виртуализации. Делайте это отдельными простыми проверками, чтобы их было легче поддерживать.

2) Преобразование в запись CMDB

После выполнения плейбука результаты нужно выгрузить в единый формат (обычно JSON), чтобы их можно было одинаково обработать независимо от источника. Затем прогоните валидацию: обязательные поля (hostname, серийный номер или UUID, OS), типы (число, строка, список), допустимые диапазоны (например, размер диска не может быть отрицательным). Ошибки валидации не должны тихо «проходить», иначе в CMDB попадет мусор.

Затем зафиксируйте результат как артефакт и сформируйте отчет по изменениям. Рабочий минимум выглядит так:

  • выбрать целевые группы хостов и отметить среду и площадку
  • собрать стандартные facts и добавить 2-5 кастомных проверок
  • привести вывод к одному JSON-шаблону
  • проверить схему и обязательные поля, отклонить неверные записи
  • записать версию данных и показать diff: что добавилось, изменилось, исчезло

Если в филиале заменили сервер на новый, CMDB должна показать смену идентификатора и характеристик как контролируемое изменение, а не как «потерянный» хост.

Нормализация: как превратить факты в понятные записи

Решение под ваш стек
Интегрируем серверы, ПО и сервисы крупных вендоров под ваши требования и регуляторику.
Собрать решение

Ansible facts полезны, но в чистом виде это «шумная» телеметрия: разные имена, разные форматы версий, много временных полей. Если писать это в CMDB как код без обработки, быстро появится витрина, где невозможно сравнить серверы между собой и отследить изменения.

Нормализация начинается с простого правила: на каждую сущность в CMDB должен быть один понятный «канонический» вид. Все варианты из источников приводятся к нему.

Единые имена и словари

Чаще всего ломается сравнение из-за разного именования одного и того же. Интерфейс может прийти как ens192, eth0 или как MAC без имени, а диск - как /dev/sda, naa.* или серийник из RAID. Нужен слой сопоставления: вы выбираете, что считается «основным именем», и как находить то же устройство при следующем сборе.

То же с ОС: договоритесь о едином словаре. Не храните «Ubuntu 20», «20.04» и «Ubuntu20.04» как разные значения. Приводите к одному формату, например: os_family=ubuntu, os_version=20.04, kernel=5.15.0-....

Чтобы не плодить дубли, заранее определите порядок идентификаторов. Хорошая практика: первичный ключ - инвентарный ID или серийник, затем UUID, затем FQDN, затем IP (как самый ненадежный). Если два сервера «спорят» за один идентификатор, это не «особенность учета», а инцидент качества данных.

Теги и «сырье» отдельно

Нормализованные записи полезны, когда к ним добавлены одинаковые метки: окружение (prod/test), критичность, владелец, уровень поддержки, площадка. Эти поля лучше заполнять из инвентаря и процессов, а не угадывать по hostname.

Храните «сырые» Ansible facts отдельно от нормализованных данных. Сырые факты нужны для аудита и разборов, но в отчетах и проверках дрейфа используйте нормализованный слой. Тогда изменения будут сравнимыми, а CMDB не превратится в свалку полей, которые никто не понимает.

Фиксация изменений и контроль дрейфа конфигураций

Сбор Ansible facts сам по себе не спасает от дрейфа. Польза появляется, когда изменения фиксируются, объясняются и регулярно проверяются. В подходе «CMDB как код» это достигается разделением: Git хранит правила и преобразования, а CMDB хранит состояние и историю.

Версии, дифы и шум

В Git обычно живут плейбуки, роли, схемы нормализации, маппинги полей и списки исключений. В CMDB лучше держать текущее нормализованное состояние объекта и журнал изменений (снимки или события), чтобы можно было ответить на вопрос: что изменилось и когда.

Чтобы дифы были полезными, заранее договоритесь, какие поля считаются изменением, а какие - шумом. К шуму чаще всего относятся временные метрики, счетчики, аптайм, порядок интерфейсов и поля, которые «прыгают» от перезагрузки.

Review нужен не для каждого чиха, а для изменений, которые влияют на риск. Например:

  • версия ОС и ядра, пакеты и патчи
  • открытые порты и правила фаервола
  • состав дисков и RAID, параметры файловых систем
  • членство в домене, локальные админы, sudoers
  • критичные параметры сервисов (БД, веб, резервное копирование)

История и регулярные сверки

Хорошая запись об изменении содержит «кто, когда и почему». «Кто» - исполнитель (CI/CD, инженер, подрядчик), «почему» - тикет или короткая причина, «что» - диф нормализованных полей.

Рабочая практика такая: ночью выполняется сбор фактов по серверам, днем - короткий отчет по расхождениям. Если сервер в больнице или банке внезапно получил новый открытый порт, это видно сразу. Можно требовать согласование или откат, а не искать проблему через неделю.

Как не получить «мертвый реестр»: рабочие правила

ПК и АРМ казахстанского производства
Поставим ПК, моноблоки и рабочие станции для офисов, клиник, школ и вузов.
Получить предложение

«Мертвый реестр» появляется, когда CMDB заполняют вручную, редко обновляют и пытаются сделать идеальной сразу. В CMDB как код цель другая: хранить минимум, который помогает принимать решения, и обновлять его автоматически.

Начните с малого, но полезного

Не описывайте весь серверный мир с первого дня. Выберите 20% полей, которые дают 80% пользы: идентификатор хоста, окружение (prod/test), роль, владелец, ОС и версия, CPU/RAM, критичные сервисы. Остальное добавляйте только когда под это есть конкретный вопрос бизнеса или эксплуатации.

Дальше закрепите правило: если поле не используется ни в одном отчете, проверке или решении об изменениях, оно кандидат на удаление.

Обновление должно быть регулярным и без просьб

Актуальность не удержать, если обновление запускают «когда вспомнили». Задайте расписание и триггеры: после деплоя, после патчей, при перезагрузке или по ночам. Лучше чаще и небольшими порциями, чем редко и огромным пакетом.

Помогает короткий набор правил:

  • перед вводом нового хоста в эксплуатацию обязателен опрос и запись базовых фактов
  • любое изменение конфигурации считается завершенным только после обновления записи
  • если хост не обновлялся дольше допустимого, он помечается как «сомнительный» и не участвует в критичных решениях
  • для разных данных разные сроки: железо можно реже, пакеты и открытые порты чаще
  • исключения согласуются заранее: что делать с «неопрашиваемыми» узлами (изоляция, ручной владелец, временный статус)

Для новых серверов можно сделать «ворота»: без успешного сбора фактов сервер не получает статус production. Это дисциплинирует процесс лучше любых напоминаний.

Типовые ошибки и ловушки при CMDB как код

Самая частая причина, почему реестр «умирает», проста: в него кладут все подряд. Ansible facts дают сотни полей, но если никто не использует их в решениях (инвентаризация, лицензии, емкость, безопасность), это превращается в склад мусора. Через пару месяцев данные перестают проходить проверку здравым смыслом, и CMDB игнорируют.

Вторая ловушка - нет стабильного идентификатора. Хост переименовали, IP поменялся, виртуалку пересоздали, и история «потерялась». Для серверов и ПК надежнее опираться на то, что меняется редко: серийный номер, asset tag, UUID, инвентарный номер. Имя хоста и IP стоит хранить, но не использовать как главный ключ.

Часто ломает процесс смешивание ручных правок и автосбора без понятного приоритета источников. Например, инженер вручную исправил модель сервера, а ночной сбор фактов перезаписал это обратно. Так рождаются бесконечные споры, «чья правда» важнее. Заранее задайте правила: какие поля заполняются только автоматически, какие только вручную, а какие допускают оба варианта, но с фиксированным приоритетом.

Еще одна тихая проблема - одинаковые поля с разным смыслом в разных командах. «Окружение» для одних значит prod/test, для других - площадка, для третьих - уровень критичности. Без словаря значений нормализация будет давать шум, а отчеты - противоречия.

Отдельно не игнорируйте права доступа. Если «менять может любой», CMDB быстро станет полем боя. Минимальный набор правил обычно такой:

  • ограничить, кто может править справочники и нормализаторы
  • разделить права на «правка вручную» и «обновление автосбором»
  • логировать, кто и что изменил, с причиной
  • защищать критичные поля (идентификаторы, связи, владельца)
  • закрепить владельцев данных по доменам (ОС, железо, сеть)

В организациях с большим парком эти ошибки проявляются особенно быстро. Поэтому лучше заложить правила до первого массового импорта.

Короткий чек-лист перед запуском в прод

Перед тем как включать CMDB как код в продакшене, полезно быстро проверить «живучесть» процесса. Вы должны заранее знать, что считается ошибкой, как отличать один сервер от другого и кто принимает решения, когда данные не сходятся.

Проверьте базовые опоры качества данных:

  • обязательные поля описаны и валидируются (например, имя узла, среда, владелец, критичность). Пустые значения не «молча» записываются, а возвращают понятную ошибку
  • есть устойчивые ключи идентификации и правила дублей: что первично (серийник, UUID, asset tag), что делать при конфликте, как «склеивать» записи при переименовании
  • разделены данные, которые обнаруживаются автоматически (Ansible facts), и данные, которые задаются людьми (назначение, владелец, проект). Для ручных полей есть простой способ обновления без правки кода

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

  • запуск по расписанию определен, а не «когда вспомним». Есть отчет: что изменилось, что сломалось, какие хосты не ответили
  • для дрейфа заданы пороги и реакция: какие изменения допустимы, какие требуют тикета или согласования

Назначьте владельца процесса и точку входа для изменений. Например: когда команда эксплуатации добавляет новый класс серверов (условно, S200 для стойки), кто обновляет маппинг фактов в модель и кто утверждает новые обязательные поля.

Если эти пункты закрыты, запуск в прод будет похож на управляемый процесс, а не на «реестр ради реестра».

Пример сценария: как поддерживать актуальность на практике

Серверы GSE для вашего контура
Подберем и поставим стойчные серверы GSE для надежного контура эксплуатации.
Запросить подбор

Компания с двумя площадками (главный офис и резервная) ведет около 60 серверов. За виртуализацию отвечает одна команда, за прикладные сервисы - другая, а часть «наследных» машин держится на ручных правках. Прошлая CMDB быстро устаревала: запись появлялась после покупки, а дальше обновлялась только «когда вспомнят».

Решили внедрить CMDB как код и начать с простых правил. В inventory Ansible разделили хосты по площадкам и ролям (db, app, infra), а на каждом хосте закрепили базовые теги: владелец сервиса, критичность (high/medium/low) и среда (prod/test/dev). Важно, что владелец и критичность задаются людьми и проходят согласование, а факты по железу и ОС приходят автоматически.

Сначала собирали только то, что помогает в ежедневной работе и влияет на риск:

  • ОС и версия, ядро, архитектура
  • CPU, RAM, размер дисков и свободное место по ключевым точкам
  • сетевые адреса и основной интерфейс
  • серийный номер или идентификатор VM, модель (если доступно)
  • набор «контрольных» пакетов и статус агента мониторинга

Потом настроили нормализацию: привели названия ОС к одному справочнику (например, «Ubuntu 22.04 LTS» без вариантов написания), единицы измерения - к одному формату (GiB), а сетевые интерфейсы - к правилу primary_ip. Отдельно договорились, что считать «значимым изменением»: смена ОС, увеличение или уменьшение ресурсов, появление нового диска, смена primary IP, отключение мониторинга, изменения в списке только тех пакетов, которые входят в allowlist (например, ssh, nginx, postgres).

Через месяц эффект стал заметен. Инциденты закрываются быстрее: дежурный сразу видит, что изменилось с прошлого успешного прогона и кому принадлежит сервис. Согласования стали проще: если просят «временно добавить диск», изменение фиксируется автоматически и не теряется. На аудите проще отвечать, какие системы в проде и кто за них отвечает. Планирование тоже точнее: обновления и миграции опираются на фактические параметры, а не на записи «в реестре годичной давности».

Следующие шаги: пилот, закрепление процесса и поддержка

Начните с малого, но формально. «Мертвый реестр» чаще появляется не из-за инструментов, а потому что никто не отвечает за данные и изменения. Первый шаг - договориться, что именно считается правдой, и кто подтверждает спорные поля.

Зафиксируйте минимальную модель данных: 15-30 полей, без попытки описать все сразу. Обычно достаточно идентификатора узла, среды (prod/dev), роли, ОС, версии ядра, CPU/RAM/дисков, сетевых интерфейсов, установленных пакетов по ключевым группам и тега владельца.

Дальше настройте регулярный сбор фактов Ansible по расписанию и единый формат выгрузки. Важно, чтобы это был один «контракт данных» для всех команд: одинаковые имена полей, единицы измерения и правила заполнения пустых значений.

Перед записью добавьте три защитных слоя: валидацию, нормализацию и отчет об изменениях. Валидация ловит «кривые» значения (например, отрицательный размер диска или неожиданную архитектуру). Нормализация приводит данные к одному виду (GiB vs GB, разные названия ОС, разные формы серийников). Отчет по изменениям показывает, что именно поменялось с прошлого запуска и требует ли это реакции.

Чтобы не распылиться, проведите пилот на одной группе серверов, где проще получить обратную связь, например на 20-50 однотипных узлах. Дальше расширяйте охват поэтапно: сначала инфраструктурные сервисы, затем бизнес-системы.

Проверьте, что процесс закреплен:

  • есть владелец модели данных и владелец процесса сбора
  • сбор работает по расписанию и имеет мониторинг
  • изменения не «теряются»: есть журнал и понятный путь эскалации
  • раз в месяц модель пересматривается и чистится от лишнего

Если нужна помощь с архитектурой, интеграцией и инфраструктурой для такого процесса, можно подключать GSE.kz (gse.kz) как системного интегратора: от подбора и поставки серверов до внедрения и 24/7 поддержки в рамках единого контура ответственности.

FAQ

Что значит «мертвый реестр» в контексте CMDB?

«Мертвый реестр» — это CMDB, которой формально ведут учет, но фактически не пользуются, потому что данные не совпадают с реальностью. Обычно это проявляется тем, что при инцидентах и аудитах информацию собирают в чатах и таблицах, а не берут из CMDB.

Почему CMDB чаще всего устаревает, даже если все «стараются»?

Потому что ручное обновление почти всегда проигрывает скорости изменений: патчи, миграции ВМ, замены дисков и срочные правки происходят постоянно. Если обновление CMDB не встроено в регулярный процесс, оно откладывается до тех пор, пока данные не перестают быть полезными.

Кто должен быть владельцем данных в CMDB и зачем он нужен?

Владелец нужен не для того, чтобы «всем управлять», а чтобы решать спорные случаи и поддерживать правила качества данных. На практике назначают владельцев по доменам: кто отвечает за железо и виртуализацию, кто за безопасность, кто за сервисы и их критичность.

Что такое «CMDB как код» простыми словами?

CMDB как код — это подход, где данные о конфигурациях собираются автоматически из источников фактов (например, с серверов), приводятся к единому виду и фиксируются с историей изменений. Ключевая идея в том, что CMDB обновляется регулярно и проверяемо, а не «когда появится время».

Какие поля стоит сделать обязательными на старте?

Минимальный набор обычно включает устойчивый идентификатор (серийник, UUID или asset tag), hostname, ОС и версию, роль/назначение, среду (prod/test/dev), базовые ресурсы (CPU/RAM/диски), IP/MAC и владельца или команду поддержки. Этого достаточно, чтобы быстрее разбирать инциденты и ловить дрейф конфигураций.

Как правильно идентифицировать сервер, чтобы не терять историю изменений?

Сначала определите, что для вас считается «одной и той же машиной» и какой идентификатор главный. Надежнее всего опираться на то, что редко меняется, а hostname и IP хранить как дополнительные признаки, потому что их часто переименовывают и перераспределяют.

Зачем разделять «факты» и «намерения» в CMDB?

Нужно разделить «что сейчас» и «как должно быть». Факты показывают текущее состояние на сервере, а намерения описывают целевое состояние и правила; если смешать эти слои, становится непонятно, где ошибка, а где допустимое отклонение.

Почему нельзя просто записывать в CMDB все Ansible facts как есть?

Потому что «сырые» данные часто шумные: разные форматы версий, нестабильные имена интерфейсов, временные поля и скачущие значения. Нормализация приводит все к каноническому виду, чтобы серверы можно было сравнивать между собой и отслеживать изменения без ложных срабатываний.

Как сделать так, чтобы в CMDB не попадал мусор?

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

Какие изменения стоит считать важными и требующими внимания?

По умолчанию ревью нужны только для изменений, которые влияют на риск: версия ОС и ключевых пакетов, открытые порты и правила доступа, диски и RAID, членство в домене и права администрирования, критичные настройки сервисов. Для «шума» вроде аптайма или порядка интерфейсов лучше заранее определить, что это не считается значимым изменением.

CMDB как код: факты Ansible, нормализация и контроль изменений | GSE