Microsoft Azure — одна из самых крупных облачных платформ в мире. Даже несмотря на отсутствие у меня симпатий к сделавшей её корпорации, должен признать, что платформа обладает рядом удобств по сравнению с конкурентами. Но нет бочки мёда без ложки дёгтя, и этой ложкой в Microsoft Azure являются имена компонентов системы. Если в AWS переименовать компонент — дело двух кликов, то в Azure имена намертво привязываются к компонентам, и изменить их без танцев с бубном порой невозможно. Поэтому очень важно при работе с Azure изначально создать правильную структуру.
Итак, давайте попробуем в Microsoft Azure создать виртуальную машину с именем server-01 и настройками по умолчанию. Следующий рисунок наглядно отображает ту кашу, которую имеем в итоге.
Если вас здесь всё устраивает, то дальше можете не читать. Ну а если вам, как и мне, нравится тотальный порядок в администрируемом хозяйстве, то рискну предложить схему красивого именования компонентов Microsoft Azure, которой сам пользуюсь на протяжении последних нескольких лет.
Данная схема позволяет привести всю систему к следующему унифицированному виду:
{Группа компонентов}__{Элемент}
{Компонент}-{Номер}__{Элемент}-{номер}
Итак, приступим…
Добавляем группу ресурсов
Создаём виртуальную сеть и подсеть
По умолчанию Microsoft Azure расширяет подсеть на всю виртуальную сеть. Это не очень удобно, так как при необходимости будет очень сложно добавить новые подсети (к примеру, подсеть VPN). Поэтому я обычно под виртуальную сеть отдаю два последних октета (маска 16), а для подсети — один последний октет (маска 24).
Первые несколько адресов подсети (10.0.0.01...03) Azure использует под свои нужды, поэтому я сдвинул рабочие адреса в диапазон выше 100. Таким образом, номер сервера будет соответствовать последней цифре IP-адреса: server-01 = 10.0.0.101, server-02 = 10.0.0.102, server-43 = 10.0.0.143 и т.п.
Внешний адрес и группа безопасности
Если планируется, что виртуальная машина будет смотреть наружу, то создаём публичный адрес и группу безопасности.
В Azure группу безопасности можно создать как для одной машины, так и для подсети в целом. В зависимости от варианта имена будут различаться.
Вариант группы безопасности для отдельного хоста:
Группа безопасности для подсети:
Диск
К сожалению, Azure не позволяет создавать диски с произвольными именами, поэтому здесь потребуется проделать обходной манёвр через создание фиктивной виртуальной машины, а потом воспользоваться её диском как болванкой для создания рабочей машины.
Создаём фиктивную виртуальную машину
После создания фиктивной машины можно удалить все компоненты (включая саму машину), помеченные суффиксом raw за исключением диска.
Снимаем снапшот диска
На основе снапшота создаём новый рабочий диск:
Разворачиваем рабочую машину на основе нового диска
Сетевые интерфейсы
Ещё одно упущение Microsoft — при создании виртуальной машины из диска в GUI нет возможности прикрепить к ней созданный ранее сетевой интерфейс. Поэтому останавливаем машину, удаляем сетевой интерфейс и прикрепляем к ней тот, что мы создали выше.
Удаление мусора
Последний штрих — удаление мусора, который остался от сделанных нами манипуляций.
Удаляем:
сетевой интерфейс server-01982,
группу безопасности server-01-nsg,
диск от фиктивной машины: server-01-raw_OsDisk…
снапшот server-01-raw-snapshot
Вот что в итоге получилось:
Вы, наверное, уже заметили, что навести красоту в Azure является довольно хлопотным занятием. Но всё существенно упрощается, если воспользоваться командной строкой (CLI). Microsoft Azure предоставляет CLI как для её родного PowerShell, так и для консоли Линукс. Последний вариант и будет описан ниже.
Логинимся:
Получаем список доступных локаций
Получаем список размеров виртуальных машин:
Задаём список параметров сети и виртуальной машины (во все последующие команды эти данные будут передаваться через переменные):
Создаём группу ресурсов:
Создаём виртуальную сеть и подсеть:
Создаём сетевой интерфейс:
Создаём фиктивную виртуальную машину:
Нормализуем диск:
Удаляем фиктивную машину и разворачиваем рабочую:
Удаляем фиктивный диск:
Чтоб автоматизировать процесс разворачивания виртуальных машин в облаке Microsoft Azure, я свёл все вышеперечисленные команды в один bash-скрипт azure-create-vm.sh, который можно взять с Github. Открываете скрипт в любом текстовом редакторе, вбиваете свои данные и можно разворачивать виртуальные машины с красивыми именами нажатием нескольких клавиш.
Итак, давайте попробуем в Microsoft Azure создать виртуальную машину с именем server-01 и настройками по умолчанию. Следующий рисунок наглядно отображает ту кашу, которую имеем в итоге.
Если вас здесь всё устраивает, то дальше можете не читать. Ну а если вам, как и мне, нравится тотальный порядок в администрируемом хозяйстве, то рискну предложить схему красивого именования компонентов Microsoft Azure, которой сам пользуюсь на протяжении последних нескольких лет.
Данная схема позволяет привести всю систему к следующему унифицированному виду:
{Группа компонентов}__{Элемент}
{Компонент}-{Номер}__{Элемент}-{номер}
Итак, приступим…
Добавляем группу ресурсов
Resource groups >> +Add
Resource group name: servers
Создаём виртуальную сеть и подсеть
По умолчанию Microsoft Azure расширяет подсеть на всю виртуальную сеть. Это не очень удобно, так как при необходимости будет очень сложно добавить новые подсети (к примеру, подсеть VPN). Поэтому я обычно под виртуальную сеть отдаю два последних октета (маска 16), а для подсети — один последний октет (маска 24).
Virtual networks >> +Add
Name: servers__network
Address space: 10.0.0.0/16
Subnet:
Name: default
Address range: 10.0.0.0/24
Network interfaces: +Add
Name: server-01__ip-private-01
Virtual network: servers__network
Subnet: default
Private IP address: Static/10.0.0.101
Первые несколько адресов подсети (10.0.0.01...03) Azure использует под свои нужды, поэтому я сдвинул рабочие адреса в диапазон выше 100. Таким образом, номер сервера будет соответствовать последней цифре IP-адреса: server-01 = 10.0.0.101, server-02 = 10.0.0.102, server-43 = 10.0.0.143 и т.п.
Внешний адрес и группа безопасности
Если планируется, что виртуальная машина будет смотреть наружу, то создаём публичный адрес и группу безопасности.
Public IP addresses: +Add
Name: server-01__ip-public-01
IP address assignment: Static
Public IP addresses >> выбираем server-01__ip-public-01 >> Associate:
Resource type >> Network interface: server-01__ip-private-01
В Azure группу безопасности можно создать как для одной машины, так и для подсети в целом. В зависимости от варианта имена будут различаться.
Network security groups >> +Add
Вариант группы безопасности для отдельного хоста:
Name: server-01__security-group
Network interfaces >> +Associate: server-01__ip-private-01
Группа безопасности для подсети:
Name: servers__network-security-group
Subnets >> +Associate:
Virtual network: servers__network
Subnet: default
Диск
К сожалению, Azure не позволяет создавать диски с произвольными именами, поэтому здесь потребуется проделать обходной манёвр через создание фиктивной виртуальной машины, а потом воспользоваться её диском как болванкой для создания рабочей машины.
Создаём фиктивную виртуальную машину
Virtual machines >> +Add
Basics:
Name: server-01-raw
VM disk type: Premium SSD
Username: your-name
SSH public key: your-public-key
Settings:
Availability set: None
Network: servers__network
Subnet: default
Public IP address: None
Select public inbound ports: No public inbound ports
Monitoring: Disabled
После создания фиктивной машины можно удалить все компоненты (включая саму машину), помеченные суффиксом raw за исключением диска.
Снимаем снапшот диска
Disks >> выбираем disk server-01-raw_OsDisk_... >> +Create snapshot
Name: server-01-raw-snapshot
На основе снапшота создаём новый рабочий диск:
Disks >> +Add
Name: server-01__disk-01
Source type: Snapshot
Source snapshot: server-01-raw-snapshot
Разворачиваем рабочую машину на основе нового диска
Disks >> выбираем server-01__disk-01 >> + Create VM
Basics:
Name: server-01
Settings:
Availability set: None
Network: servers__network
Subnet: default
Public IP address: None
Select public inbound ports: No public inbound ports
Monitoring: Disabled
Сетевые интерфейсы
Ещё одно упущение Microsoft — при создании виртуальной машины из диска в GUI нет возможности прикрепить к ней созданный ранее сетевой интерфейс. Поэтому останавливаем машину, удаляем сетевой интерфейс и прикрепляем к ней тот, что мы создали выше.
Virtual machines >> выбрать VM server-01 >> Stop
Virtual machines >> выбрать VM server-01 >> Networking:
Attach network interface >> server-01__ip-private-01
Detach network interface >> server-01982
Удаление мусора
Последний штрих — удаление мусора, который остался от сделанных нами манипуляций.
Удаляем:
сетевой интерфейс server-01982,
группу безопасности server-01-nsg,
диск от фиктивной машины: server-01-raw_OsDisk…
снапшот server-01-raw-snapshot
Вот что в итоге получилось:
CLI
Вы, наверное, уже заметили, что навести красоту в Azure является довольно хлопотным занятием. Но всё существенно упрощается, если воспользоваться командной строкой (CLI). Microsoft Azure предоставляет CLI как для её родного PowerShell, так и для консоли Линукс. Последний вариант и будет описан ниже.
Логинимся:
az login -u AzureUserName
Получаем список доступных локаций
az account list-locations
Получаем список размеров виртуальных машин:
az vm list-sizes --location locationName
Задаём список параметров сети и виртуальной машины (во все последующие команды эти данные будут передаваться через переменные):
location="westindia"
resource_group="servers"
virt_network="servers__network"
virt_network_range="10.0.0.0/16"
subnet="default"
subnet_range="10.0.0.0/24"
user="username"
ssh_key="ssh-public-key"
name="server-01"
image="UbuntuLTS"
ip="10.0.0.101"
interface_suffix="__ip-private-01"
disk_suffix="__disk-01"
size="Standard_B1s"
### SSD = "Premium_LRS"; HDD = "Standard_LRS"
storage_type="Premium_LRS"
Создаём группу ресурсов:
az group create --location ${location} --name ${resource_group}
Создаём виртуальную сеть и подсеть:
az network vnet create --location ${location} --resource-group ${resource_group} --name ${virt_network} --address-prefixes ${virt_network_range}
az network vnet subnet create --resource-group ${resource_group} --vnet-name ${virt_network} --name ${subnet} --address-prefix ${subnet_range}
Создаём сетевой интерфейс:
az network nic create --resource-group ${resource_group} --location ${location} --name ${name}${interface_suffix} --subnet ${subnet} --vnet-name ${virt_network} --private-ip-address ${ip}
Создаём фиктивную виртуальную машину:
az vm create --name ${name} --admin-username ${user} --ssh-key-value "${ssh_key}" --resource-group ${resource_group} --location ${location} --image ${image} --size ${size} --nics ${name}${interface_suffix} --storage-sku ${storage_type}
Нормализуем диск:
az vm stop --name ${name} --resource-group ${resource_group}
disk_old=$(az vm get-instance-view --name ${name} --resource-group ${resource_group} | grep -o "${name}_OsDisk[0-9a-z\_]\{1,\}" | head -1)
az disk create --location ${location} --resource-group ${resource_group} --name ${name}${disk_suffix} --source ${disk_old} --sku ${storage_type}
Удаляем фиктивную машину и разворачиваем рабочую:
az vm delete --name ${name} --resource-group ${resource_group} --yes
az vm create --name ${name} --resource-group ${resource_group} --location ${location} --size ${size} --nics ${name}${interface_suffix} --attach-os-disk ${name}${disk_suffix} --os-type Linux ${availability_set_as_option}
Удаляем фиктивный диск:
az disk delete --resource-group ${resource_group} --name ${disk_old} --yes
Автоматизация
Чтоб автоматизировать процесс разворачивания виртуальных машин в облаке Microsoft Azure, я свёл все вышеперечисленные команды в один bash-скрипт azure-create-vm.sh, который можно взять с Github. Открываете скрипт в любом текстовом редакторе, вбиваете свои данные и можно разворачивать виртуальные машины с красивыми именами нажатием нескольких клавиш.