Pull to refresh

Красивая структура компонентов в облаке Microsoft Azure

Reading time 5 min
Views 2.7K
Microsoft Azure — одна из самых крупных облачных платформ в мире. Даже несмотря на отсутствие у меня симпатий к сделавшей её корпорации, должен признать, что платформа обладает рядом удобств по сравнению с конкурентами. Но нет бочки мёда без ложки дёгтя, и этой ложкой в Microsoft Azure являются имена компонентов системы. Если в AWS переименовать компонент — дело двух кликов, то в Azure имена намертво привязываются к компонентам, и изменить их без танцев с бубном порой невозможно. Поэтому очень важно при работе с Azure изначально создать правильную структуру.

image

Итак, давайте попробуем в Microsoft Azure создать виртуальную машину с именем server-01 и настройками по умолчанию. Следующий рисунок наглядно отображает ту кашу, которую имеем в итоге.

image

Если вас здесь всё устраивает, то дальше можете не читать. Ну а если вам, как и мне, нравится тотальный порядок в администрируемом хозяйстве, то рискну предложить схему красивого именования компонентов 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

Вот что в итоге получилось:

image

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. Открываете скрипт в любом текстовом редакторе, вбиваете свои данные и можно разворачивать виртуальные машины с красивыми именами нажатием нескольких клавиш.
Tags:
Hubs:
+6
Comments 1
Comments Comments 1

Articles