Если ты устал от ручного управления своим TrueNAS сервером через веб-интерфейс, представь, что у тебя появился удаленный пульт управления. TrueNAS API — это именно он. Этот инструмент позволяет автоматизировать рутинные задачи, интегрировать систему хранения в существующую инфраструктуру и создавать кастомные решения для мониторинга и управления. Давай разберем, как им пользоваться эффективно и безопасно.
Что такое TrueNAS API и зачем он нужен
TrueNAS API — это RESTful интерфейс, который предоставляет программный доступ практически ко всем функциям системы. Через него можно:
- Создавать, удалять и управлять ZFS пулами и дисками
- Настраивать общие ресурсы (SMB, NFS, iSCSI)
- Управлять пользователями, группами и ACL
- Мониторить состояние системы и получать статистику
- Запускать и останавливать службы
- Создавать моментальные снимки (snapshots) и клоны
Настройка и аутентификация в TrueNAS API
Перед началом работы нужно включить API и настроить доступ. Давай пройдем по шагам:
Шаг 1: Включение API в веб-интерфейсе
Зайди в веб-интерфейс TrueNAS → Система → Настройки → Услуги. Найди "API" и включи его. Убедись, что служба запущена.
Шаг 2: Создание API ключа
Для безопасного доступа используй API ключи вместо пароля root:
1. Система → API Keys → Добавить
2. Укажи имя ключа (например, "ansible-automation")
3. Скопируй сгенерированный токен — он покажется только один раз!
Шаг 3: Базовый тестовый запрос
Проверим, что API работает, с помощью простого cURL запроса:
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
Создадим простой скрипт для проверки здоровья дисков и объема свободного места:
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
Автоматизируем создание общей папки:
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:
---
- 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 для мониторинга состояния пулов:
#!/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. Пример для ежедневных снепшотов:
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 | Перезагрузка системы (осторожно!) |
GET запросы перед DELETE.
Заключение
TrueNAS API открывает мощные возможности для автоматизации твоей инфраструктуры хранения данных. Начни с простых задач: мониторинг состояния пулов, автоматическое создание снепшотов. Постепенно переходи к более сложным сценариям: интеграция с CI/CD, автоматическое выделение ресурсов для виртуальных машин, централизованное управление несколькими TrueNAS серверами.
Помни, что с большой силой приходит большая ответственность. Всегда тестируй свои скрипты на не-продакшен среде, имей актуальные бэкапы и мониторь результаты выполнения операций. Удачной автоматизации!