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

    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. Открываете скрипт в любом текстовом редакторе, вбиваете свои данные и можно разворачивать виртуальные машины с красивыми именами нажатием нескольких клавиш.
    Поделиться публикацией

    Похожие публикации

    Комментарии 1
      0
      Понимаю вашу боль, сам проходил через это. Но, увы, столкнувшись с AKS понял, что энтропия победила, там вариантов сделать красивый и корректный нейминг я не нашел.

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое