TrueNAS API: Полное руководство по автоматизации и интеграции | AdminWiki
Timeweb Cloud — сервера, Kubernetes, S3, Terraform. Лучшие цены IaaS.
Попробовать

TrueNAS API: Полное руководство по автоматизации и интеграции

19 февраля 2026 8 мин. чтения #ansible #api #devops #python #rest api #truenas #zabbix #автоматизация

Если ты устал от ручного управления своим TrueNAS сервером через веб-интерфейс, представь, что у тебя появился удаленный пульт управления. TrueNAS API — это именно он. Этот инструмент позволяет автоматизировать рутинные задачи, интегрировать систему хранения в существующую инфраструктуру и создавать кастомные решения для мониторинга и управления. Давай разберем, как им пользоваться эффективно и безопасно.

Что такое TrueNAS API и зачем он нужен

TrueNAS API — это RESTful интерфейс, который предоставляет программный доступ практически ко всем функциям системы. Через него можно:

  • Создавать, удалять и управлять ZFS пулами и дисками
  • Настраивать общие ресурсы (SMB, NFS, iSCSI)
  • Управлять пользователями, группами и ACL
  • Мониторить состояние системы и получать статистику
  • Запускать и останавливать службы
  • Создавать моментальные снимки (snapshots) и клоны
Важно: TrueNAS API доступен как в TrueNAS Core (на базе FreeBSD), так и в TrueNAS SCALE (на базе Linux). Основные эндпоинты совместимы, но могут быть различия в некоторых деталях реализации.

Настройка и аутентификация в TrueNAS API

Перед началом работы нужно включить API и настроить доступ. Давай пройдем по шагам:

Шаг 1: Включение API в веб-интерфейсе

Зайди в веб-интерфейс TrueNAS → Система → Настройки → Услуги. Найди "API" и включи его. Убедись, что служба запущена.

Шаг 2: Создание API ключа

Для безопасного доступа используй API ключи вместо пароля root:

Веб-интерфейс
1. Система → API Keys → Добавить
2. Укажи имя ключа (например, "ansible-automation")
3. Скопируй сгенерированный токен — он покажется только один раз!
Внимание: API токен — это как пароль суперпользователя. Храни его в безопасном месте (например, в HashiCorp Vault или зашифрованном файле) и никогда не коммить в Git!

Шаг 3: Базовый тестовый запрос

Проверим, что API работает, с помощью простого cURL запроса:

bash
curl -X GET \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  https://your-truenas-ip/api/v2.0/system/version \
  -k

В ответе получишь информацию о версии TrueNAS. Флаг -k игнорирует проверку SSL сертификата (для самоподписанных сертов).

Практические примеры работы с TrueNAS API

Пример 1: Мониторинг состояния системы на Python

Создадим простой скрипт для проверки здоровья дисков и объема свободного места:

python
import requests
import json

class TrueNASClient:
    def __init__(self, host, api_key):
        self.base_url = f"https://{host}/api/v2.0"
        self.headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }
        self.session = requests.Session()
        self.session.headers.update(self.headers)
        self.session.verify = False  # Отключаем для самоподписанных сертов
        
    def get_system_info(self):
        """Получаем информацию о системе"""
        response = self.session.get(f"{self.base_url}/system/info")
        return response.json()
    
    def get_pool_health(self):
        """Проверяем состояние всех пулов"""
        response = self.session.get(f"{self.base_url}/pool")
        pools = response.json()
        
        health_status = []
        for pool in pools:
            pool_response = self.session.get(f"{self.base_url}/pool/id/{pool['id']}")
            pool_data = pool_response.json()
            
            health_status.append({
                "name": pool_data["name"],
                "health": pool_data["healthy"],
                "status": pool_data["status"],
                "used_gb": round(pool_data["used"]["parsed"] / 1024**3, 2),
                "free_gb": round(pool_data["available"]["parsed"] / 1024**3, 2)
            })
        
        return health_status

# Использование
if __name__ == "__main__":
    client = TrueNASClient("192.168.1.100", "your-api-token-here")
    
    print("=== System Information ===")
    system_info = client.get_system_info()
    print(f"Hostname: {system_info['hostname']}")
    print(f"Version: {system_info['version']}")
    
    print("\n=== Pool Health ===")
    pools = client.get_pool_health()
    for pool in pools:
        status_icon = "✅" if pool["health"] else "❌"
        print(f"{status_icon} {pool['name']}: {pool['status']}")
        print(f"   Used: {pool['used_gb']} GB, Free: {pool['free_gb']} GB")

Пример 2: Создание SMB шары через API

Автоматизируем создание общей папки:

python
def create_smb_share(self, path, name, comment="", readonly=False):
    """Создаем SMB общую папку"""
    share_data = {
        "path": path,
        "name": name,
        "comment": comment,
        "ro": readonly,
        "guestok": False,
        "hostsallow": [],
        "hostsdeny": [],
        "aal": "NONE",
        "abe": False,
        "acl": False,
        "durablehandle": True,
        "streams": True,
        "timemachine": False,
        "recyclebin": False
    }
    
    response = self.session.post(
        f"{self.base_url}/sharing/smb",
        json=share_data
    )
    
    if response.status_code == 200:
        print(f"SMB share '{name}' created successfully")
        return response.json()
    else:
        print(f"Failed to create SMB share: {response.text}")
        return None

# Создаем шару для бэкапов
client.create_smb_share(
    path="/mnt/pool01/backups",
    name="backups",
    comment="Automated backup share",
    readonly=True
)

Интеграция TrueNAS API с популярными инструментами

Интеграция с Ansible для автоматизации

Создадим Ansible роль для управления пользователями TrueNAS:

ansible/truenas-user.yml
---
- name: Manage TrueNAS users via API
  hosts: localhost
  vars:
    truenas_host: "{{ lookup('env', 'TRUENAS_HOST') }}"
    truenas_token: "{{ lookup('env', 'TRUENAS_TOKEN') }}"
    
  tasks:
    - name: Create user on TrueNAS
      uri:
        url: "https://{{ truenas_host }}/api/v2.0/user"
        method: POST
        headers:
          Authorization: "Bearer {{ truenas_token }}"
          Content-Type: "application/json"
        body_format: json
        body:
          username: "{{ item.username }}"
          full_name: "{{ item.full_name }}"
          password: "{{ item.password }}"
          group: {{ item.group }}
          home: "/mnt/pool01/homes/{{ item.username }}"
          shell: "/usr/bin/bash"
        validate_certs: no
      loop: "{{ users_to_create }}"
      loop_control:
        label: "{{ item.username }}"
      no_log: true  # Скрываем пароли в логах

    - name: Ensure user's home directory exists
      uri:
        url: "https://{{ truenas_host }}/api/v2.0/filesystem/mkdir"
        method: POST
        headers:
          Authorization: "Bearer {{ truenas_token }}"
          Content-Type: "application/json"
        body_format: json
        body:
          path: "/mnt/pool01/homes/{{ item.username }}"
        validate_certs: no
      loop: "{{ users_to_create }}"
      loop_control:
        label: "{{ item.username }}"

Мониторинг через Zabbix

Настроим Zabbix для мониторинга состояния пулов:

bash/zabbix-truenas.sh
#!/bin/bash

# Zabbix внешний скрипт для мониторинга TrueNAS
TRUENAS_HOST="$1"
API_TOKEN="$2"
METRIC="$3"
POOL_NAME="$4"

case $METRIC in
    "pool.health")
        # Возвращаем 1 если пул здоров, 0 если нет
        response=$(curl -s -k -H "Authorization: Bearer $API_TOKEN" \
          "https://$TRUENAS_HOST/api/v2.0/pool?name=$POOL_NAME")
        healthy=$(echo $response | jq -r '.[0].healthy')
        [[ "$healthy" == "true" ]] && echo 1 || echo 0
        ;;
    "pool.used")
        # Использованное место в процентах
        response=$(curl -s -k -H "Authorization: Bearer $API_TOKEN" \
          "https://$TRUENAS_HOST/api/v2.0/pool?name=$POOL_NAME")
        used=$(echo $response | jq -r '.[0].used.parsed')
        total=$(echo $response | jq -r '.[0].size.parsed')
        if [[ $total -gt 0 ]]; then
            echo "scale=2; $used * 100 / $total" | bc
        else
            echo 0
        fi
        ;;
    "system.uptime")
        # Аптайм системы в секундах
        response=$(curl -s -k -H "Authorization: Bearer $API_TOKEN" \
          "https://$TRUENAS_HOST/api/v2.0/system/info")
        echo $response | jq -r '.uptime_seconds'
        ;;
    *)
        echo "Unknown metric: $METRIC"
        exit 1
        ;;
esac

Лучшие практики и рекомендации

Безопасность

  • ✅ Используй API ключи вместо паролей root
  • ✅ Регулярно ротируй API токены (каждые 90 дней)
  • ✅ Ограничивай доступ по IP через firewall
  • ✅ Используй HTTPS с валидными сертификатами
  • ❌ Никогда не храни токены в открытом виде в репозиториях

Надежность

  • Всегда проверяй коды ответов HTTP
  • Реализуй повторные попытки (retry logic) для идемпотентных операций
  • Логируй все изменения через API для аудита
  • Тестируй скрипты на dev/staging среде перед продакшеном

Часто задаваемые вопросы (FAQ)

Как получить список всех доступных эндпоинтов API?

Используй Swagger UI, доступный по адресу https://your-truenas-ip/api/docs. Там же можно тестировать запросы прямо из браузера. Альтернативно, посмотри исходный код TrueNAS на GitHub — там есть полная спецификация.

Какие есть ограничения по частоте запросов (rate limiting)?

По умолчанию TrueNAS не устанавливает жестких лимитов, но злоупотребление может привести к нагрузке на систему. Для production используй кэширование частых запросов и делай паузы между операциями. Мониторинг состояния системы можно делать раз в 5-10 минут, этого достаточно.

Как работать с большими объемами данных через API?

Для массовых операций используй пагинацию. Многие эндпоинты поддерживают параметры limit и offset. Например: GET /api/v2.0/pool?limit=50&offset=0. Для загрузки/выгрузки файлов используй эндпоинты /filesystem с multipart/form-data.

Можно ли откатить изменения, сделанные через API?

Прямого "undo" в API нет. Все изменения применяются сразу. Поэтому критически важные операции (удаление пулов, изменение прав) нужно предварительно тестировать и обязательно делать бэкапы конфигурации через эндпоинт /system/config/save.

Как автоматизировать создание моментальных снимков (snapshots)?

Используй эндпоинт /pool/snapshot. Пример для ежедневных снепшотов:

python
snapshot_data = {
    "dataset": "pool01/dataset1",
    "name": "auto-daily-$(date +%Y%m%d)",
    "recursive": False,
    "vmware_sync": False
}
response = session.post("https://truenas/api/v2.0/pool/snapshot", json=snapshot_data)

Полезные эндпоинты для старта

Эндпоинт Метод Описание
/system/info GET Информация о системе (версия, хостанейм, uptime)
/pool GET Список всех ZFS пулов
/alert/list GET Активные алерты системы
/sharing/smb POST Создание SMB шары
/dataset POST Создание ZFS датасета
/system/reboot POST Перезагрузка системы (осторожно!)
Важный совет: Перед использованием деструктивных эндпоинтов (удаление, перезагрузка) всегда делай dry-run сначала. Например, для проверки прав используй GET запросы перед DELETE.

Заключение

TrueNAS API открывает мощные возможности для автоматизации твоей инфраструктуры хранения данных. Начни с простых задач: мониторинг состояния пулов, автоматическое создание снепшотов. Постепенно переходи к более сложным сценариям: интеграция с CI/CD, автоматическое выделение ресурсов для виртуальных машин, централизованное управление несколькими TrueNAS серверами.

Помни, что с большой силой приходит большая ответственность. Всегда тестируй свои скрипты на не-продакшен среде, имей актуальные бэкапы и мониторь результаты выполнения операций. Удачной автоматизации!

Поделиться:
Сохранить гайд? В закладки браузера