Неизменяемость — это круто для обеспечения согласованности, предсказуемости и надежности, и я не вижу причин, по которым мне не следует стремиться к неизменности на уровне ОС при развертывании моего приложения на Linux VPS от разных облачных провайдеров по всему миру. Мир. С такими инструментами, как Packer, помогающими создавать образы ОС, похоже, это тоже правильный путь.
Для некоторых облачных провайдеров (например, Digital Ocean) я могу создать образ локально в формате qcow2 или raw, а затем загрузить готовый образ облачному провайдеру для развертывания при создании новых VPS.Кажется, это лучший вариант.
Но другие облачные провайдеры (например, Hetzner в Германии) не поддерживают импорт ваших собственных образов ОС — вместо этого вам нужно создать образ в их инфраструктуре на основе одного из их исходных образов, а затем вы можете сделать моментальный снимок окончательной установки в многоразовый образ. изображение, когда все настроено правильно. На самом деле это также то, что делает «Hetzner Cloud Builder» от Packer.
Но как я тогда гарантирую, что окончательное изображение Hetzner имеет точный такая же установка CentOS 8 (вплоть до точно такого же набора установленных RPM-пакетов с точно такими же номерами версий), что и у всех других облачных провайдеров?
Я предполагаю, что решением может быть какой-то декларативный инструмент, который берет список пакетов RPM и связанных с ними номеров версий и приводит целевую систему в соответствие с этим списком, гарантируя, что все отсутствующие пакеты RPM установлены в нужной версии, удаляя лишние. Пакеты RPM, обновление старых пакетов RPM и понижение версии более новых пакетов RPM, чтобы убедиться, что установлена требуемая версия.
Существует ли такой инструмент, или я должен думать об этом совершенно по-другому?
Некоторые могут возразить, что RPM-пакеты CentOS всегда следует просто обновлять до новейшей доступной версии, но тогда я не могу гарантировать, что все облачные провайдеры используют одну и ту же установку ОС, что потенциально может повлиять на предсказуемость и надежность моего сервиса.
Вместо этого я хочу иметь возможность тщательно протестировать полную установку (ОС + приложение) перед ее развертыванием у любого облачного провайдера, а затем развертывание должно быть одинаковым для всех облачных провайдеров. Именно так мы делаем вещи на уровне приложений, используя образы Docker, и я не понимаю, почему мы должны соглашаться на меньшее на уровне ОС.
Есть ли какие-нибудь советы от коллег DevSecOps о том, как достичь этих целей?