Как эффективно управлять парком серверов с помощью API

Как эффективно управлять парком серверов с помощью API

Владислав Ефименко Владислав Ефименко Главный редактор 13 июля 2023

В статье рассказываем, как мониторить выделенные серверы и управлять ими с помощью API.

Изображение записи

По мере развития инфраструктуры, когда парк выделенных серверов расширяется, появляется задача — собирать и анализировать данные о системах, выполнять массовые операции автоматически, иногда без прямого участия человека. Для реализации такой функциональности нужен специальный проводник между серверами и клиентом — API.

В статье рассказываем, как мониторить выделенные серверы и управлять ими с помощью API. А также показываем, как автоматически переустановить операционную систему всего за несколько запросов.

Когда нужна автоматизация в работе с серверами

API в работе с серверами полезен, когда нужно, например, автоматизировать массовые простые действия — переустановка операционных систем на всех серверах и другое. Рассмотрим основные сценарии подробнее.

Работа с биллингом

С ростом парка серверов в инфраструктуре бывает сложно уследить за платежными транзакциями. С помощью API можно с заданной периодичностью следить за предстоящими платежами и формировать отчеты для бухгалтерии.

Кастомная система мониторинга

При построении большой инфраструктуры бывает важно сохранить полноту информации о каждом сервере. Чтобы следить за питанием, конфигурациями, сетью и другим. Для организации подобной системы нужно автоматически «подтягивать» данные прямо из дата-центра провайдера. Эту задачу также можно решить при помощи API.

API выделенных серверов: функциональность

API выделенных серверов — программный интерфейс, который предназначен для управления выделенными серверами при помощи HTTPS-запросов. Условно, все методы API можно разделить на две группы — мониторинга и управления:

  • Методы мониторинга — GET. Пользователь может получить информацию о платежных транзакциях, локациях размещения серверов, потреблении сетевого трафика и электроэнергии (Power Manager). А также данные о работе портов и операционной системы. Эти данные собираются об инфраструктуре перед ее изменением.
Важно отметить, что API позволяет работать не только с выделенными серверами, но и с сетью, colocation и межсетевыми экранами.
  • Методы управления — POST, PUT, PATCH и DELETE. Пользователь может автоматически выбирать, оплачивать и активировать ресурсы серверов, собирать и обновлять машины произвольных конфигураций. А также выключать и перезагружать серверы по питанию, управлять операционной системой и сетевыми портами, подсетями и другим.
Панель управления, полный список методов API. У каждого метода есть свое описание и список параметров.

Полный список методов доступен в документации и панели управления, в разделе API. Каждый запрос можно протестировать не выходя из браузера, с помощью отдельной вкладки Try. Для примера выведем информацию о питании только что созданного выделенного сервера.

Результат: power_state: "power off" — питание выключено, сервер еще создается, информация корректна.

Как работать с методами API?

Встроенные тесты методов не требуют дополнительной авторизации, поскольку API-запрос «исходит» из панели управления. Перед началом полноценной работы с методами необходимо авторизоваться с помощью API-токена, который привязан к аккаунту. Токен можно создать в разделе настроек. Далее в каждом HTTP-запросе необходимо отправлять этот токен в заголовке X-token.


    curl -H "X-token: <token>" -H "Content-Type: application/json" https://api.selectel.ru/servers/v2/resource

Теперь можно выбрать интересующий метод и использовать его, например, с помощью стандартной библиотеки requests в Python. Но есть и другой вариант — загрузить сваггер в платформу для работы с API — Postman или Insomnia.

Это удобно, если нужно формировать сложные запросы, но нет нет желания это делать вручную.

Postman, загруженный сваггер API выделенных серверов.

В качестве примера выведем информацию о питании сервера, но уже с предварительной авторизацией. Для этого переходим в раздел power/{resource_uuid} и выбираем GET-запрос. В секции Authorization нужно добавить способ авторизации по ключу и настроить соответствующие поля:

Выбранный метод можно запустить прямо из платформы, либо экспортировать в любом удобном формате — например, cURL, Python, PHP или Java.

Postman, Python code snippet: код для мониторинга питания.

Готово — скрипт возвращает информацию о питании сервера. Ее можно собирать с определенной периодичностью и отдавать, например, в собственную систему мониторинга.


    {
"task_id": "334b859b-77bf-45de-9e5b-69b098968895", 
"status": "SUCCESS", 
"progress": 100, 
"page": 1, 
"limit": -1,
"item_count": -1,
"execution_time": 0.106, 
"result": 
    {
        "driver_status": 
            {
                 "maintenance": false, 
                 "maintenance_reason": null, 
                 "power_state": "power on", 
                 "target_power_state": null, 
                 "console_enabled": true
            }
     }
}

Ответ API в формате JSON.

Переустановка операционной системы через API

Мы уже научились базово работать с API и даже решать хоть и небольшие, но полезные задачи. Теперь попробуем реализовать что-нибудь посложнее — например, простой менеджер для переустановки операционной системы, ОС.

Подготовка 

Для начала необходимо понять, что мы хотим получить от API и какую функциональность реализовать. Например, нужно сделать, чтобы программа собирала информацию о текущей версии ОС, выводила список актуальных патчей и обновляла сервер при необходимости.

Схема переустановки (обновления) операционной системы с помощью API выделенных серверов.

Обратите внимание. Для работы метода, который предоставляет список доступных ОС, нужно использовать две дополнительных переменные:

  • location_uuid — уникальный номер локации, в которой расположен сервер,
  • service_uuid — идентификатор услуги, в рамках которой нужно обновить операционную систему. 

Эти переменные используются для фильтрации доступных шаблонов ОС. Но откуда взять значения?

Инициализация переменных

Первый способ

Чтобы узнать location_uuid и service_uuid, можно сделать простой GET-запрос по ресурсу, указав в качестве параметра – uuid сервера.


    import json
import requests

url = "https://api.selectel.ru/servers/v2/resource/d913bfc7-7b61-4413-8bc3-32f46423ec1c"
payload = {}
headers = {
 'Accept': 'application/json',
 'X-token': 'TmwVLGzFgqNYdFgC6O3r32jiw_246500'
}

response = requests.request("GET", url, headers=headers, data=payload)
response = json.loads(response.text)
location_uuid = response['result']['location_uuid']
service_uuid = response['result']['service_uuid']

print(f"location_uuid: {location_uuid} \n service_uuid: {service_uuid}")

После запуска программа выведет значения переменных location_uuid и service_uuid. Здесь уже можно перейти к следующему пункту, но есть еще один вариант, как получить значения идентификаторов. Он сложнее, но позволяет понять, что скрывается за этими значениями.

Второй способ 

Во втором способе понадобится сделать два запроса, чтобы узнать значения переменных. Начнем с location_uuid: получить значение можно из полного списка локаций.


    import requests

url = "https://api.selectel.ru/servers/v2/location"
payload = {}
headers = {
  'X-Token': 'TmwVLGzFgqNYdFgC6O3r32jiw_246500',
  'Cookie': 'cid=Ch4GQmSS0h9TN33aZA8VAg=='
}

response = requests.request("GET", url,  headers=headers, data=payload)
print(response.text)

В этом примере сервер, на котором будет переустановлена ОС, находится в пуле SPB-3. Значит, нужно перебрать пары ключ-значение и сохранить uuid этой локации из полученного списка.


    …
{
"uuid": "22fe83ae-a20f-54fc-b436-cec85c94c5e8", 
"name": "SPB-3", 
"location_id": 3, 
"description": 
"\u0414\u0443\u0431\u0440\u043e\u0432\u043a\u0430", 
"dc_count": null, 
"enable": true
},
…

Пример корректного ответа API на запрос списка локаций.

Значение service_uuid можно получить с помощью аналогичного GET-запроса: запрашиваем список всех сервисов и ищем свой по названию конфигурации сервера, name.


    … 
{ 
"uuid":"f162d1a3-6e1e-4e0f-ba5e-bb5604611c93"
"name":"DL-33"
"tariff_line":"Entry Line"
"model":"server"
"tags":null
"tag_list":Array[2]
"state":"Discount"
},
… 

Пример корректного ответа на запрос списка сервисов. Конфигурация сервера — DL-33.

Готово — значения переменных получены и сохранены.

Вывод списка операционных систем

После получения идентификаторов можно вывести список доступных ОС. Для этого достаточно передать в качестве GET-параметров location_uuid и service_uuid, а после — отправить HTTP-запрос.


    import json
import requests

location_uuid = "22fe83ae-a20f-54fc-b436-cec85c94c5e8"
service_uuid = "f162d1a3-6e1e-4e0f-ba5e-bb5604611c93"

url = \
f"https://api.selectel.ru/servers/v2/boot/template/os/new?location_uuid={location_uuid}&service_uuid={service_uuid}"

payload = {}
headers = {
 'Accept': 'application/json',
 'X-token': 'TmwVLGzFgqNYdFgC6O3r32jiw_246500'
}

response = requests.request("GET", url, headers=headers, data=payload)
all_templates = json.loads(response.text)
all_templates = all_templates["result"]

После запуска программа выведет коллекцию из названий ОС, их идентификаторов и другой справочной информации.


    {
"uuid": "226dde22-e8f9-4af4-bd2e-cbeeca66e72f", 
"owner_id": null, 
"os_value": "windows", 
"os_name": "Windows Server", 
"arch": "x86_64", 
"version_value": "win2022std", 
"version_name": "2022 Standard", 
"login": "Administrator", 
"raid": [{"name": "noraid", "description": "No Software RAID"}], 
"partitioning": false, 
"allowed_fs_types": null, 
"default_partitions": null, 
"install_script": null, 
"script_allowed": false, 
"default_script": "", 
"image_url": null,
"is_ssh_key_allowed": false, 
"outdated": false, "template_version": "v1"
}

Получение текущей версии операционной системы

Допустим, перед переустановкой системы на сервере нужно узнать, что установлено на данный момент. Это самый простой шаг, но попробуем добавить элемент автоматизации: сделаем так, чтобы программа автоматически переустанавливала Ubuntu на Windows Server 2022 Standard.


    import json
import requests

url = "https://api.selectel.ru/servers/v2/boot/os/d913bfc7-7b61-4413-8bc3-32f46423ec1c"
payload = {}
headers = {
'Accept': 'application/json',
'X-Token': 'TmwVLGzFgqNYdFgC6O3r32jiw_246500'
}
response = requests.request("GET", url, headers=headers, data=payload)
server_os_now = json.loads(response.text)

# если текущая ОС — ubuntu, нужно переустановить на Windows Server
if server_os_now['result']['os_template'] == "ubuntu":
   reinstall_os("Windows Server",  all_templates)

Работает: программа получает название текущей операционной системы и вызывает функцию переустановки, если на сервере — Ubuntu.

Переустановка операционной системы

Последним этапом нужно отправить POST-запрос на переустановку операционной системы. Здесь также ничего сложного нет: нужно просто использовать ранее полученные параметры. Подробнее — в примере ниже.


    def reinstall_os(system, all_templates):
        for template in all_templates.items():
               if template["os_name"] == Windows Server \ 
               and template['version_name'] == '2022 Standard':
                    url = "https://api.selectel.ru/servers/v2/boot/os/d913bfc7-7b61-4413-8bc3-32f46423ec1c"
                    payload = json.dumps({
                    # arch, полученный ранее
                    "arch": template['arch'],
                    # выгруженный ранее параметр 
                    "os_template": template['os_value'], 
                    # версия ОС
                    "version": template['version_value'],
                    # логин администратора 
                    "login": "Administrator",
                    # название сервера в панели
                    "userhostname": "Young",
                    # новый пароль от системы                          
                    "password": "t1MIIR9qhwOv",
                    # публичный IP-адрес сервера
                    "ipv4_address": "185.149.240.35",
                    # версия шаблона загрузки
                    "template_version": "v1", 
                    "partitioning": False,
                    "user_script": None,
                    "user_ssh_key": "",
                    "raid_type": "noraid"
})

headers = {
 'Content-Type': 'application/json',
 'Accept': 'application/json',
 'X-token': 'TmwVLGzFgqNYdFgC6O3r32jiw_246500'
}

response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)

Шаблон заполнения payload для установки нужной операционной системы можно получить через веб-инспектор, выполнив соответствующий запрос в панели управления. 

Готово — запрос на установку Windows Server отправлен, она будет готова к работе в течение 10-60 минут (Ubuntu устанавливается не более 10 минут). То же самое можно увидеть, если зайти в панель управления.

Заключение

В работе с API выделенных серверов нет ничего сложного, но с помощью него можно реализовать большой набор специфических функций для управления парком серверов.