Концепції
Це ключові рішення, на яких тримається архітектура enodia. Розуміння їх пояснює чимало поведінки, яка інакше виглядала б довільною.
Дві фази, свідомо розділювані
Section titled “Дві фази, свідомо розділювані”Збирання даних звертається до Ваших сервісів. Оцінювання звертається до інтернету (календарів життєвого циклу вендорів). У багатьох реальних інфраструктурах немає нічого, що мало б мережевий доступ до обох водночас.
collect → inventory.jsonl → evaluate → assessment → render# усередині закритої мережі - інтернет не потрібенenodia collect --config config.yaml -o inventory.jsonl
# будь-де ще - доступ до Ваших сервісів не потрібенenodia check --from inventory.jsonlenodia check без --from — це ці дві фази, поєднані в одному процесі, а
не окремий шлях виконання: інвентар, створений дорогою, є справжнім
повноцінним артефактом (зі власною схемою та версією), а не просто
проміжним значенням у памʼяті.
Три ортогональні осі, а не один статус
Section titled “Три ортогональні осі, а не один статус”Гілка може бути цілком здоровою, коли вже існує новіша мажорна версія: Confluence 10 LTS актуальна в межах своєї гілки, активно підтримується, і водночас уже вийшла новіша мажорна версія. Згортання цього в один статус викидає саме ту інформацію, яка Вам насправді потрібна.
| Вісь | Значення |
|---|---|
| Патч | current · behind · ahead · unknown |
| Життєвий цикл | active · security · eol · unknown |
| Новіша гілка | latest · newer · newer_lts · unknown |
ahead — не екзотика: release candidate-и та затримка між оголошенням
вендора і появою версії на його сторінці завантажень регулярно дають саме
такий результат.
Відомі CVE, якщо їх налаштовано, — це окремий факт поряд із
трьома осями, а не четверта вісь: вони перелічуються в кожній оцінці, але
ніколи не впливають на критичність, код завершення чи --fail-on.
Факти та судження розділено
Section titled “Факти та судження розділено”Observation містить те, що було фактично побачено: рядок версії, чи була
ціль досяжною, яка помилка (якщо була) сталася. Assessment містить те,
що політика enodia думає про ці факти, — критичність, обчислену поверх них
за політикою, яку контролюєте Ви.
Експорт --format json видає факти. Споживач з іншими пріоритетами може
застосувати поверх них власну політику замість політики enodia. Якби
критичність була вшита в саме спостереження, це було б неможливо.
Час — це параметр
Section titled “Час — це параметр”Оцінювання приймає явну позначку часу asOf — ніщо на шляху оцінювання не
звертається до системного годинника напряму. check --from бере asOf із
власного заголовка інвентарю (collectedAt), тож інвентар місячної
давнини оцінюється станом на момент, коли його було зібрано, а не
мовчки переоцінюється відносно сьогоднішнього дня. Повторний запуск того
самого оцінювання згодом дає той самий результат.
Проби вкомпільовано, а не описано YAML-DSL
Section titled “Проби вкомпільовано, а не описано YAML-DSL”API кожного вендора відрізняються настільки, що декларативна мова проб
виглядає універсальною лише до першого вендора поза тим набором, під який
її створювали. Кожна проба — це один Go-файл з одним явним записом у
реєстрі: коли знання про вендора закодовано в коді, if — це просто if,
читабельний і придатний до налагодження, а не умова, переформульована
засобами YAML.
Це означає, що для додавання нового продукту потрібен реліз, а не просто
правка Вашої конфігурації. Запасний вихід: product: generic приймає
специфікацію парсера (json / xml / header / plaintext / regex)
прямо з Вашої конфігурації — для внутрішніх систем, які ніколи не
отримають окремої проби, — див. Конфігурація.
Словник generic-проби свідомо заморожено: жодних умов, жодних циклів,
жодних ланцюжків запитів. Цілі, якій потрібне щось із цього, потрібна
справжня проба, написана на Go.
Спершу HTTPS, облікові дані за замовчуванням ніколи не передаються відкритим текстом
Section titled “Спершу HTTPS, облікові дані за замовчуванням ніколи не передаються відкритим текстом”Визначення схеми для цілі, в адресі якої немає явного https:///http://:
спершу пробується https, у разі невдачі — http, і в обох випадках
видається попередження. enodia ніколи не пробує http першим — уже перший
запит ніс би облікові дані відкритим текстом, і подальше перенаправлення
на https не скасувало б того, що вже надіслано. Ціль http:// з
прикріпленими обліковими даними — це жорстка помилка, якщо для цього
конкретного сервісу не встановлено allow_insecure_transport: true.
Жодного вбудованого вебсервера, що опитує на запит
Section titled “Жодного вбудованого вебсервера, що опитує на запит”І enodia serve, і export --format html показують останній завершений
знімок — жоден із них ніколи не запускає нове збирання у відповідь на
запит. Кнопка «Оновити», яка на кожен клік опитує весь Ваш парк серверів,
— це самостійно влаштована відмова в обслуговуванні власного продакшену.
Збирання виконується за розкладом (serve --interval або cron/таймер
systemd, що перегенерує HTML-експорт); HTTP лише читає те, що створив
останній успішний цикл.