Блог ·
Скрипт, який знає, що говорить із контейнером
Сім необовʼязкових полів, де відсутність означає невстановлено, таблиця команд, тест якої виводить свої випадки, і операційна система в хибному списку.
Автор: Provibr
Вузол Proxmox може виконувати дві дуже різні речі: повну віртуальну машину з власним ядром і власним мікрокодом, і контейнер, що ділить ядро вузла. Здалеку обидві є «сервером», і кабінет тримає їх в одному списку. Зблизька вони різняться так, як це важить для того, хто пише автоматизацію, і до цього раунду скрипт не міг їх розрізнити.
Це погане становище. Скрипт, який просить контейнер збільшити віртуальний диск, приєднати образ ISO чи завантажитися з мережі, просить не про щось складне; він просить про те, чого немає. Невдача приходить чотирма шарами пізніше, як команда, прийнята, поставлена в чергу, надіслана і потім відхилена агентом.
Сім полів, і відсутнє означає невстановлено
Скрипти й вебгаки тепер отримують групу фактів про те, що лежить під сервером: його рід, шаблон, з якого він походить, чи є він непривілейованим, сховище, де лежить його корінь, його точки монтування, що він справді вміє і чого не вміє.
Будь-яке з тих полів може бракувати, а брак означає невстановлено. Це те саме правило, якого дотримується стовпець унизу, де рід ніколи мовчки не дозаповнювали, і воно існує тому, що заміна гірша за марність. Знімок, який пише «віртуальна машина», коли ніхто цього не міряв, є здогадом, переданим скриптові, який ухвалить на ньому рішення.
Невідомий рід тому не стає типовим значенням. Поле повністю зникає з контексту відтворення, і читання його є тоді твердою помилкою тієї миті, коли потік зберігають, замість порожнього рядка, який мовчки робить умову хибною. Це те саме міркування, що й вилучення групи змінних, якої тригер дати не може: голосно під час збереження перемагає тихо під час виконання.
Це також перша вкладена група в каталозі змінних. Назва поля з крапкою всередині зазвичай є пасткою в цій базі коду, бо каталог перекладу трактує крапку як рівень; тут ключ каталогу навмисно її сплощує, тоді як шлях контексту сходить на рівень нижче, а тест закріплює припущення, що крапка там рівно одна.
Шляхи вузла не подорожують
Приєднане монтування в налаштуванні контейнера має вигляд ключа, шляху вузла і точки монтування. Той шлях є текою гіпервізора, і виходити звідти йому не можна ніколи.
Правило у власній нашій документації пряме: клієнти ніколи не отримують через Provibr оболонки вузла, шляху в його файловій системі чи адміністративних даних гіпервізора. Знімок змінних є саме таким шляхом. Він опиняється в скрипті, у тілі вебгака в третьої сторони і в рядку аудиту.
Знімок тому джерела ніколи не несе. Лишається те, що клієнт має право знати про власний контейнер: який це ключ, де воно змонтоване в контейнері і з якого роду джерела походить. Одна стала текстова форма, бо скрипт читає це, розрізаючи за роздільником, а не розбираючи прозу: mp1:bind:/srv каже, що на /srv висить приєднане монтування, і не каже геть нічого про те, звідки воно на вузлі.
Це справджується і для монтування тому. Назва сховища не є шляхом вузла, але вона є власною номенклатурою гіпервізора, і жодне питання скрипта її не потребує. Назва сховища зʼявляється один раз, окремо, як одне слово, яке клієнт і так бачив під час замовлення.
Ціна цього задуму оголошена, а не схована: факти монтування походять із налаштування, яке агент читає під час резервної копії, тож контейнер, у якого копії ніколи не було, не дає жодної точки монтування. Поле тоді бракує, і це слушно, бо порожній список стверджував би, що контейнер точок монтування не має.
Таблиця, тест якої виводить власні випадки
Уже існувала записана таблиця, яка каже для кожної команди віртуальної машини, чи вміє її контейнер і чому ні. Бракувало таблиці, що охоплювала б кожну команду, яку може нести інтеграція Proxmox, разом із резервними копіями і чотирма читаннями, що описують інтеграцію, а не одного гостя.
Без цієї відмінності сито не може відділити «жодної записаної оцінки» від «це взагалі не про гостя», а єдиною безпечною поведінкою для другого є пропустити. Це саме та мовчазна гілка, на якій цей проєкт раз по раз обпікається.
Нова таблиця тому виведена із записаної, а не написана поруч, і тест випадків не перелічує. Він обчислює досяжну множину з реєстрів, беручи кожен рід команди, якого постачальник Proxmox не відхиляє і який до того ж служить гостьовому ресурсові, плюс читання, названі на самому описі постачальника, і вимагаючи потім заяви для кожного роду. Двадцять сім гостьових команд і чотири читання інтеграції, і тест довели спершу червоним, а вже потім зеленим.
Тест на випадок не може знайти випадку, якого бракує. Ця база коду вивчила цей урок уже тричі, і це третя форма тієї самої сторожі.
Однієї команди бракує навмисно, і коментар каже, де її шукати. Виконати команду всередині контейнера означало б сьогодні запустити її адміністратором на гіпервізорі, поза контейнером, із правами вузла. Це не скриптова можливість із малим слідом; це оболонка вузла з приязною назвою. Хто її збудує, дістане власний раунд, із виконавцем у гостеві, власним правом і власним слідом аудиту.
Відмова до надсилання не лишає рядка
Шлюз відхиляв неможливі команди й раніше. Та відмова стається з командою, яка вже є: рядок стоїть у базі даних, операцію створено, і клієнт дивиться, як завдання зазнає невдачі.
Вимагали ж перевірки до надсилання, і саме в цьому відмінність. Прохання до контейнера про його віртуальне обладнання має дати речення, а не рядок аудиту.
Два сита розійтися не можуть, бо читають одну таблицю. Це не друга правда; це та сама правда, на шар раніше. Шлюз і далі потрібен для повторного чи підробленого запиту, який крізь функцію кабінету не проходить ніколи.
Причину відмови подають одним повідомленням із гілкою на кожну причину, а сторожа навколо вимагає двох речей: гілки для кожної причини і щоб речення різнилися між собою. Відсутня гілка у виборі мови провалюється до типового значення і каже щось правдиве, що не означає нічого, а цю поведінку відмови проєкт уже знає.
Операційна система в хибному списку
Знахідка, яку дала лише справжня база даних, до всього вищого стосунку не мала.
Записи операційних систем колись тримали своє джерело встановлення в одному стовпці, а тепер тримають у двох, причому старий читається як запасний для рядків, яких жоден новий записувач ніколи не торкався. Шаблони контейнерів прийшли пізніше і йдуть у власний стовпець, а на новому рядку їх ще й проєктують у старий.
Запасний шлях про це не знав. Він читав посилання на контейнер у старому стовпці як шаблон віртуальної машини, тож операційна система, яка мала лише шаблон контейнера, стояла у списку віртуальних машин потоку замовлення, без роду обчислення, а замовлення на неї згодом сіло б на джерелі клонування без ідентифікатора, який клонувати.
Виправлення становить одна гілка: посилання на контейнер у старому стовпці не є джерелом віртуальної машини. Не втрачається нічого, бо контейнерний бік читає власний стовпець і жоден інший, а рядки, достатньо старі, щоб потребувати запасного шляху, за побудовою посилання на контейнер нести не можуть: того стовпця тоді ще не було.
Друга знахідка прийшла зі знімка екрана, а не з перевірки. У списку того, чого контейнер не вміє, стояла команда оплати, яка належить іншому постачальникові і якої на Proxmox немає для жодного з двох родів. Правдива і геть недоречна на сторінці подробиць контейнера. Її з того списку прибрали.
Що б ми записали
- Відсутнє є відповіддю. Якщо ви не знаєте роду, не ставте типового значення. Здогад, переданий автоматизації, гірший за прогалину, яку скрипт може побачити.
- Безпека прав є властивістю форми, а не викликача. Задумати знімок так, щоб шляху вузла в ньому не було, і жоден майбутній читач його не викаже.
- Стала текстова форма перемагає прозу. Хтось розріже це за роздільником.
- Виводити випадки з реєстру. Тест на випадок за побудовою не здатен знайти той випадок, якого ніхто не написав.
- Відмовляти до того, як записувати. Відмова, що дає рядок аудиту, уже розповіла клієнтові хибну історію.
- Дивитися на знімки екрана. Недоречний запис був правдивим, пройшов кожну перевірку і був для людського ока хибним одразу.
Для ясності щодо того, чим це є: контейнери можна замовити на Proxmox, а обчислювальні факти працюють у продуктиві. Кілька речей лишилися недоведеними. Нічого з цього в цьому раунді не випробували проти справжнього гіпервізора, факти монтування залежать від того, чи була резервна копія хоч раз, одне речення в потоці замовлення й досі каже «ця ВМ» на контейнері, а лічильник ліцензій і далі рахує контейнер як віртуальну машину.
Із платформної роботи Provibr. Чому непривілейований контейнер є вимірюванням, а не налаштуванням, описано в непривілейований є вимірюванням, а не налаштуванням, а які точки монтування резервна копія контейнера містить, а яких ні, описано в чого резервна копія не містить.