<div><img src="https://top-fwz1.mail.ru/counter?id=3548135;js=na" style="position:absolute;left:-9999px;" alt="Top.Mail.Ru" /></div>
Managed Kubernetes — разверните готовый кластер за 5 минут →
Вход / Регистрация

Timeweb Cloud API: Полезные скрипты для автоматизации рутины

3
18 минут чтения
Средний рейтинг статьи: 5

API — это программный интерфейс, при помощи которого можно управлять инфраструктурой через код. Вместо того чтобы выполнять множество действий в веб-интерфейсе, всё сводится к вызову одной функции — будь то развертывание сервера или настройка сети. Облачный провайдер Timeweb Cloud обладает мощным API, при помощи которого можно легко автоматизировать различные рутинные задачи при работе с инфраструктурой.

Мы собрали практические скрипты на Python и Bash, которые помогут сэкономить время и избежать человеческих ошибок.

cloud

Предварительные требования

Для работы с Timeweb Cloud API нам понадобится:

  • Аккаунт в Timeweb Cloud. Зарегистрировать новый аккаунт можно по ссылке.

  • API-токен, который можно получить в личном кабинете.

Получение API-токена

Прежде чем использовать API, необходимо получить API-токен для аутентификации. Инструкция по получению токена доступна по ссылке.

Подготовка окружения

Прежде чем приступать к запуску скриптов, подготовим окружение для работы. В качестве примера будем использовать дистрибутив Linux Ubuntu.

1) Создаем новую директорию и переходим в нее:

mkdir timeweb-scripts && cd timeweb-scripts

2) Проверим, установлен ли интерпретатор языка Python:

python3 --version

Image1

Если в ответ команда вернула Command 'python3' not found, то необходимо установить Python вручную. Также дополнительно установим менеджер пакетов pip и виртуальное окружение: 

apt update && apt -y install python3 python3-pip python3-venv

3) Далее создадим виртуальное окружение:

python3 -m venv env

И активируем его:

source env/bin/activate

4) Установим необходимые зависимости. Для работы с API нам потребуется пакет requests, а также пакет python-dotenv для считывания пар «ключ-значение» из файла .env, в котором мы будем хранить API-токен. Установим зависимости при помощи пакетного менеджера pip:

pip3 install requests python-dotenv

5) Настроим аутентификацию. Для этого в директории проекта создаем скрытый файл .env:

nano .env

Объявляем переменную с именем TIMEWEB_TOKEN, в которой будет храниться наш API-токен, полученный в предыдущем разделе:

TIMEWEB_TOKEN=<API ТОКЕН>

Image5

При дальнейших запусках скриптов для аутентификации будет использоваться значение из файла .env.

6) Создадим тестовый скрипт, который отобразит баланс на нашем аккаунте. Для этого создаем файл с именем check-balance.py:

nano check-balance.py

И используем следующее содержимое:

import os
import requests
from dotenv import load_dotenv

load_dotenv()
token = os.getenv('TIMEWEB_TOKEN')

if token:
    data = requests.get(
        "https://api.timeweb.cloud/api/v1/account/finances",
        headers={"Authorization": f"Bearer {token}"}
    ).json()
    balance = data['finances']['balance']
    print(f"Текущий баланс {balance:.2f} руб.")

7) Для запуска скрипта используем команду:

python3 check-balance.py

При успешном ответе API-сервер вернет данные о балансе аккаунта.

Image4

Работа с облачными серверами

Ниже представлены скрипты, которые можно использовать для настройки мониторинга облачных серверов с помощью таких инструментов, как Prometheus и Grafana.

Получение списка тарифов

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

Создаем файл скрипта:

nano get_tariffs.py
import os
import requests
import json
from dotenv import load_dotenv

load_dotenv()

headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + os.getenv('TIMEWEB_TOKEN', ''),
}

response = requests.get('https://api.timeweb.cloud/api/v1/presets/servers', headers=headers)

if response.status_code == 200:
    try:
        data = response.json()
        print(json.dumps(data, indent=2, ensure_ascii=False))
    except json.JSONDecodeError:
        print("Error: Invalid JSON response")
else:
    print(f"Error {response.status_code}")

Для запуска используем команду:

python3 get_tariffs.py

Image7

Создание облачного сервера

Создадим облачный сервер на ОС Ubuntu 24.04 со следующими характеристиками: 1 × 3,3 ГГц CPU, 1 ГБ RAM, 15 ГБ NVMe. Скрипт позволит существенно ускорить и упростить создание инфраструктуры. Документация по методам.

Создаем файл скрипта:

nano create_server.py

import os
import requests
from dotenv import load_dotenv

load_dotenv()

headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + os.getenv('TIMEWEB_TOKEN', ''),
}

json_data = {
    'is_ddos_guard': False,
    'os_id': 99,
    'bandwidth': 1000,
    'comment': 'This server was created with API',
    'name': 'server1',
    'preset_id': 4795,
    'is_local_network': False,
}

response = requests.post('https://api.timeweb.cloud/api/v1/servers', headers=headers, json=json_data)

if response.status_code == 201:
    print("✅ Сервер успешно создан!")
else:
    print(f"❌ Ошибка при создании сервера. Код ошибки: {response.status_code}")
    print(f"Ответ сервера: {response.text}")

Для запуска используем команду:

python3 create_server.py

Image6

Перезагрузка сервера

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

В строке url = ... замените 5618281 на свой ID сервера.

Создаем файл скрипта:

nano restart-server.py
import os
import requests
from dotenv import load_dotenv

def main():
    try:
        load_dotenv()
        token = os.getenv('TIMEWEB_TOKEN')
        if not token:
            raise ValueError("TIMEWEB_TOKEN не найден в .env файле")
        
        url = f"https://api.timeweb.cloud/api/v1/servers/5618281/reboot"
        headers = {
            "Authorization": f"Bearer {token}",
            "Content-Type": "application/json"
        }
        
        print("Перезапуск сервера")
        response = requests.post(url, headers=headers)
        response.raise_for_status()
        
        print("Сервер успешно перезапущен!")
            
    except requests.exceptions.RequestException as e:
        print(f"Ошибка API: {e}")
        if hasattr(e, 'response') and e.response:
            print(f"Статус код: {e.response.status_code}")
    except ValueError as e:
        print(f"Ошибка: {e}")
    except Exception as e:
        print(f"Неожиданная ошибка: {e}")

if __name__ == "__main__":
    main()

Для запуска используем команду:

python3 restart-server.py

Image10

Выключение сервера

Скрипт ниже выключит облачный сервер. Документация по методам.

В строке response замените 5700121 на свой ID сервера.

Создаем файл скрипта:

nano stop_server.py

Со следующим содержимым:

import os
import requests
from dotenv import load_dotenv

load_dotenv()

headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + os.getenv('TIMEWEB_TOKEN', ''),
}

response = requests.post('https://api.timeweb.cloud/api/v1/servers/5700121/shutdown', headers=headers)

print("Status Code:", response.status_code)

if response.status_code == 204:
    print("\n✅ Сервер выключен")
else:
    print(f"\n❌ Не удалось выключить сервер: {response.status_code}")

Для запуска используем команду:

python3 stop_server.py

Image8

Запуск сервера

Скрипт ниже включит облачный сервер. Документация по методам.

В строке response замените 5700121 на свой ID сервера.

Создаем файл скрипта:

nano start_server.py

Его содержимое:

import os
import requests
from dotenv import load_dotenv

load_dotenv()

headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + os.getenv('TIMEWEB_TOKEN', ''),
}

response = requests.post('https://api.timeweb.cloud/api/v1/servers/5700121/start', headers=headers)

print("Status Code:", response.status_code)

if response.status_code == 204:
    print("\n✅ Сервер успешно запущен")
else:
    print(f"\n❌ Не удалось запустить сервер: {response.status_code}")

Для запуска используем команду:

python3 start_server.py

Image13

Получение данных о серверах

Создадим скрипт, который будет отображать данные (ID, имя, статус, ОС, CPU, RAM, диск, IPv4) обо всех используемых серверах. Он будет полезен при наличии большого количества серверов, когда нужно быстро собрать информацию, например, для отчетности.

Документация по методам.

Создаем файл скрипта:

nano servers-info.py

Со следующим содержимым:

import requests
import os
from dotenv import load_dotenv

class TimewebCloudMonitor:
    def __init__(self, api_token):
        self.api_token = api_token
        self.base_url = "https://api.timeweb.cloud/api/v1"
        self.headers = {
            "Authorization": f"Bearer {api_token}",
            "Content-Type": "application/json"
        }
    
    def get_servers_with_details(self):
        try:
            response = requests.get(
                f"{self.base_url}/servers",
                headers=self.headers
            )
            response.raise_for_status()
            servers = response.json()["servers"]
            
            print(f"{'ID':<10} {'Имя':<20} {'Статус':<10} {'ОС':<15} {'Ядра':<6} {'RAM':<8} {'Диск':<8} {'IPv4':<15}")
            print("-" * 90)
            
            for server in servers:
                server_id = server["id"]
                name = server["name"]
                status = server["status"]
                cpu = server.get("cpu", "N/A")
                ram = server.get("ram", "N/A")
                
                # Получаем информацию об ОС
                os_info = self._get_os_info(server)
                
                # Получаем размер диска
                disk_size = self._get_disk_size(server)
                
                # Получаем IPv4 адрес
                ip_info = self._get_all_ips(server)
                ipv4 = ip_info.get("ipv4", "N/A")
              
                ram_formatted = f"{ram}MB" if ram != "N/A" else "N/A"
                disk_formatted = f"{disk_size}GB" if disk_size != "N/A" else "N/A"
                
                print(f"{server_id:<10} {name:<20} {status:<10} {os_info:<15} {cpu:<6} {ram_formatted:<8} {disk_formatted:<8} {ipv4:<15}")
                
        except requests.exceptions.RequestException as e:
            print(f"Ошибка при получении данных: {e}")
    
    def _get_os_info(self, server):
        """Получаем информацию об операционной системе"""
        try:
            if "os" in server and server["os"]:
                os_data = server["os"]
                os_name = os_data.get("name", "unknown")
                os_version = os_data.get("version", "")
                
                if os_version:
                    return f"{os_name} {os_version}"
                else:
                    return os_name
            else:
                return "N/A"
                
        except (KeyError, TypeError) as e:
            print(f"Ошибка при получении ОС {server.get('name', 'unknown')}: {e}")
            return "N/A"
    
    def _get_all_ips(self, server):
        """Получаем доступные IP адреса сервера"""
        result = {
            "ipv4": "N/A",
            "ipv6": "N/A", 
            "main_ip": "N/A"
        }
        
        try:
            if ("networks" in server and server["networks"]):
                for network in server["networks"]:
                    if network.get("type") == "public" and "ips" in network and network["ips"]:
                        for ip in network["ips"]:
                            if ip.get("type") == "ipv4":
                                result["ipv4"] = ip["ip"]
                                if ip.get("is_main"):
                                    result["main_ip"] = ip["ip"]
                            elif ip.get("type") == "ipv6":
                                result["ipv6"] = ip["ip"]
                                if ip.get("is_main") and result["main_ip"] == "N/A":
                                    result["main_ip"] = ip["ip"]
                        
                        # Если основной IP не найден, но есть IPv4 - используем его
                        if result["main_ip"] == "N/A" and result["ipv4"] != "N/A":
                            result["main_ip"] = result["ipv4"]
                        elif result["main_ip"] == "N/A" and result["ipv6"] != "N/A":
                            result["main_ip"] = result["ipv6"]
                        
                        break
        
        except (KeyError, IndexError, TypeError) as e:
            print(f"Ошибка при получении IP для сервера {server.get('name', 'unknown')}: {e}")
        
        return result
    
    def _get_disk_size(self, server):
        """Получаем общий размер диска"""
        try:
            if "disks" in server and server["disks"]:
                total_size = 0
                for disk in server["disks"]:
                    if "size" in disk:
                        # Размер в MB, конвертируем в GB
                        total_size += disk["size"] / 1024
                return int(total_size)
            return "N/A"
        except (KeyError, TypeError) as e:
            print(f"Ошибка при получении размера диска: {e}")
            return "N/A"

# Загрузка переменных окружения из .env файла
load_dotenv()

if __name__ == "__main__":
    # Получение API токена из переменной окружения
    API_TOKEN = os.getenv('TIMEWEB_TOKEN')
    
    if not API_TOKEN:
        raise ValueError("API токен не найден. Убедитесь, что файл .env создан и содержит переменную с токеном")
    
    monitor = TimewebCloudMonitor(API_TOKEN)
    monitor.get_servers_with_details()

Для запуска используем команду:

python3 servers-info.py

Image11

Сброс пароля сервера

Создадим скрипт, который сбросит пароль от root-пользователя на сервере с Linux. Документация по методам.

В строке response  замените 5698777 на свой ID сервера.

Создаем файл скрипта:

nano reset_root_password.py
import os
import requests
from dotenv import load_dotenv

load_dotenv()
headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + os.getenv('TIMEWEB_TOKEN', ''),
}
response = requests.post('https://api.timeweb.cloud/api/v1/servers/5698777/reset-password', headers=headers)
if 200 <= response.status_code < 300:
    print("Запрос был успешно выполнен!")
else:
    print("Произошла ошибка!")
    print("Статус код:", response.status_code)
    print("Текст ошибки:", response.text)

Для запуска используем команду:

python3 reset_root_password.py

Image12

После выполнения скрипта на электронную почту придет сообщение о том, что пароль был сброшен. Новый пароль будет доступен в панели управления сервером.

Image14

Создание диска сервера

Создадим диск размером 10 ГБ для уже запущенного облачного сервера. Документация по методам.

В строке response замените 5698777 на свой ID сервера.

Создаем файл скрипта:

nano create_disk_for_server.py

И размещаем в нем следующий код:

import os
import requests
from dotenv import load_dotenv

load_dotenv()

headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + os.getenv('TIMEWEB_TOKEN', ''),
}

json_data = {
    'comment': 'comment',
}

json_data = {
    'size': 10240,
}

response = requests.post('https://api.timeweb.cloud/api/v1/servers/5698777/disks', headers=headers, json=json_data)

if response.status_code == 201:
    print("✅ Диск для сервера успешно создан!")
    print(f"Статус ответа: {response.status_code}")

Для запуска используем команду:

python3 create_disk_for_server.py

Image15

Получение информации о диске сервера

Данный скрипт отобразит подробную информацию о диске сервера, включая его ID, который понадобится для создания резервной копии диска. Документация по методам.

В строке response замените 5842441 на свой ID сервера.

Создаем файл скрипта:

nano get_disk_info.py
import os
import requests
from dotenv import load_dotenv
import json

load_dotenv()

headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + os.getenv('TIMEWEB_TOKEN', ''),
}

response = requests.get('https://api.timeweb.cloud/api/v1/servers/5842441/disks', headers=headers)

if response.status_code == 200:
    data = response.json()

    print(json.dumps(data, indent=4, ensure_ascii=False))
else:
    print(f"Ошибка: {response.status_code}")
    try:
        error_data = response.json()
        print(json.dumps(error_data, indent=4, ensure_ascii=False))
    except:
        print(response.text)

Для запуска используем команду:

python3 get_disk_info.py

Image16

ID диска сервера будет находиться в поле id.

Создание резервной копии диска сервера

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

В строке response замените 5698777 на свой ID сервера, а 22305981 — на ID диска.

Создаем файл скрипта:

nano create_disk_backup.py

Сам скрипт:

import os
import requests
from dotenv import load_dotenv

load_dotenv()

headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + os.getenv('TIMEWEB_TOKEN', ''),
}

json_data = {
    'comment': 'comment',
}

response = requests.post('https://api.timeweb.cloud/api/v1/servers/5698777/disks/22305981/backups', headers=headers, json=json_data)

if response.status_code == 201:
    print("✅ Резервная копия успешно создана!")
    print(f"Статус ответа: {response.status_code}")

Для запуска используем команду:

python3 create_disk_backup.py

Image17

Получение информации о домене

Отобразим подробную информацию о домене, зарегистрированном через Timeweb Cloud. Это может быть полезно для бизнес-аналитики, например, для исследования рынка и деятельности конкурентов. Документация по методам.

В строке response вместо next-cloud-test.ru необходимо указать свое доменное имя.

Создаем файл скрипта:

nano get_domain_info.py
import os
import json
import requests
from dotenv import load_dotenv

load_dotenv()

headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + os.getenv('TIMEWEB_TOKEN', ''),
}

try:
    response = requests.get('https://api.timeweb.cloud/api/v1/domains/next-cloud-test.ru', headers=headers)
    
    print(f"Status Code: {response.status_code}")
    print("-" * 50)
    
    if response.status_code == 200:
        data = response.json()
        print("Domain Information:")
        print(json.dumps(data, indent=2, ensure_ascii=False))
        
    else:
        print(f"Error: HTTP {response.status_code}")
        print("Response:")
        print(response.text)
        
except Exception as e:
    print(f"An error occurred: {e}")

Для запуска используем команду:

python3 get_domain_info.py

Image18

Работа с реестрами контейнеров

Рассмотрим работу с реестрами для хранения образов контейнеров. Готовые реестры можно использовать при настройке CI/CD или при работе с платформой Kubernetes.

Получение списка тарифов реестров

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

Создаем файл скрипта:

nano get_registry_tarrifs.py
import os
import requests
import json
from dotenv import load_dotenv

load_dotenv()

headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + os.getenv('TIMEWEB_TOKEN', ''),
}

response = requests.get('https://api.timeweb.cloud/api/v1/container-registry/presets', headers=headers)


if response.status_code == 200:
    try:
        data = response.json()
        print(json.dumps(data, indent=2, ensure_ascii=False))
    except json.JSONDecodeError:
        print("Error: Invalid JSON response")
else:
    print(f"Error {response.status_code}")

Для запуска используем команду:

python3 get_registry_tarrifs.py

Image19

Создание реестра контейнеров

Создадим новый реестр с тарифом, который включает в себя 5 ГБ места для хранения образов. ID тарифа — 1939, который задается в строке preset_id. Документация по методам.

Создаем файл скрипта:

nano create_registry.py
import os
import requests
import json
from dotenv import load_dotenv

load_dotenv()

headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + os.getenv('TIMEWEB_TOKEN', ''),
}

json_data = {
    'name': 'my-personal-registry',
    'preset_id': 1939,
}

response = requests.post('https://api.timeweb.cloud/api/v1/container-registry', headers=headers, json=json_data)


if response.status_code == 201:
   print("✅ Реестр успешно создан!")
else:
   print(f"❌ Ошибка при создании реестра. Код ошибки: {response.status_code}")
   print(f"Ответ сервера: {response.text}")

Для запуска используем команду:

python3 create_registry.py

Image20

Работа с хранилищем S3

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

Получение списка тарифов S3

Для начала получим список тарифов для дальнейшего создания хранилища. Документация по методам.

Создаем файл скрипта:

nano get_s3_tarrifs.py
import os
import requests
import json
from dotenv import load_dotenv

load_dotenv()

headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + os.getenv('TIMEWEB_TOKEN', ''),
}

response = requests.get('https://api.timeweb.cloud/api/v1/presets/storages', headers=headers)

if response.status_code == 200:
    try:
        data = response.json()
        print(json.dumps(data, indent=2, ensure_ascii=False))
    except json.JSONDecodeError:
        print("Error: Invalid JSON response")
else:
    print(f"Error {response.status_code}")

Для запуска используем команду:

python3 get_s3_tarrifs.py

Image21

Создание облачного хранилища

Создадим приватное хранилище с объемом 100 ГБ. Для это используем ID тарифа под номером 473, который зададим в поле preset_id. Документация по методам.

Создаем файл скрипта:

nano create_s3.py.py

 

import os
import json
import requests
from dotenv import load_dotenv

load_dotenv()

headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + os.getenv('TIMEWEB_TOKEN', ''),
}

json_data = {
    'name': 'my-s3-storage',
    'type': 'private',
    'preset_id': 473,
}

response = requests.post('https://api.timeweb.cloud/api/v1/storages/buckets', headers=headers, json=json_data)

if response.status_code == 201:
   print("✅ Хранилище S3 успешно создано!")
else:
   print(f"❌ Ошибка при создании S3 хранилища. Код ошибки: {response.status_code}")
   print(f"Ответ сервера: {response.text}")

Для запуска используем команду:

python3 create_s3.py

Image9

Заключение

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

3
18 минут чтения
Средний рейтинг статьи: 5
Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
Пока нет комментариев