Я планирую создать повторно используемый шаблонный образ для развертывания моего приложения на нескольких виртуальных машинах, которые могут находиться в разных сетях и разных центрах обработки данных. Я планирую иметь полный контроль над хост-системой и запустить KVM в качестве гипервизора.
Образ станет неизменяемым при подключении к виртуальной машине, что позволит мне проще развертывать изменения, обновляя один шаблон, а не внутреннее программное обеспечение каждой машины.
Я понимаю, как настроить файл /etc/network/interfaces в обычной системе Ubuntu, но как автоматически назначить каждой виртуальной машине 1 или несколько IP-адресов, если вы работаете с неизменяемым образом виртуальной машины при первой загрузке?
Единственный способ, который я себе представил, — настроить шаблон на использование DHCP для работы в сети при загрузке. После загрузки машины она могла бы запустить скрипт, который проверяет и перенастраивает конфигурацию IP, подключаясь к другому серверу или удаленной файловой системе, где есть информация о конфигурации сети.
Возможно, сразу после того, как сеть станет доступной, я мог бы запустить скрипт на гостевой виртуальной машине, который отправляет MAC-адрес подключенного сетевого интерфейса(ов) в качестве уникального идентификатора для получения конфигурации сети с другого "главного" сервера, имеющего назначения IP. Это предполагает, что всем виртуальным машинам будет назначен уникальный MAC-адрес при их создании.
Возможно, мне придется избегать запуска таких служб, как mysql и php, пока сеть не будет настроена и проверена, чтобы перезапуск сети вскоре после загрузки не нарушил ничего важного.
Будет ли это правильным способом сделать это?
Имеют ли Amazon EC2, openstack или другие другой подход к автоматизации сети? Возможно, они предоставляют API и/или скрипты, которые делают то же самое во время загрузки?
Я использую KVM на хосте Ubuntu, гостевая ОС также будет Ubuntu, если это имеет значение.
решение1
Единственное, что вы можете контролировать со стороны хоста, — это MAC, который вы предоставляете виртуальной машине. Поэтому самый простой подход — зарезервировать IP, который вы хотите, чтобы конкретная виртуальная машина имела в DHCP для конкретного MAC, а затем предоставить этот MAC-адрес соответствующей виртуальной машине при ее настройке. Это можно масштабировать до определенного предела, но при наличии сотен виртуальных машин управление MAC-адресами может стать утомительным.
Итак, следующий подход заключается в загрузке виртуальной машины с прикрепленным ISO-образом или дискетой, где предоставляется дополнительный файл настроек для каждой виртуальной машины. Виртуальная машина запустит скрипт при загрузке, который будет искать прикрепленный ISO-образ/дискету и применять найденные там настройки, если такой образ прикреплен. Легко использовать при настройке новых виртуальных машин или при перенастройке существующих.
Конечно, лучшим подходом будет использование системы управления конфигурацией (puppet/chef/cfengine/ansible/saltstack/etc) или какой-либо конвергентной системы развертывания/конфигурации, например theForeman. Она масштабируется настолько, насколько это вообще возможно, и обеспечивает большую гибкость в управлении настройками не только для сети.
решение2
Мне кажется, вы пытаетесь сделать это сложнее, чем оно должно быть. Сетевое взаимодействие KVM по умолчанию в Ubuntu называется Usermode.
https://help.ubuntu.com/community/KVM/Networking#usermodenetworking
Это создаст NAT на вашем физическом хосте, позволяя всем вашим виртуальным машинам получать доступ к сети через NAT. Виртуальные машины получают адрес DHCP, как вы сказали выше, и все.
В качестве альтернативы вы можете использоватьМостовая сетьчтобы позволить внешним хостам напрямую обращаться к службам гостевой операционной системы.