1. Создайте API ключ
Войдите в раздел "KernelHost API" клиентского портала и создайте ключ. Выберите только те разрешения, которые вам действительно нужны (по умолчанию: только чтение). Секрет показывается только один раз, поэтому надёжно сохраните его в своём менеджере секретов.
2. Сохраните учётные данные
Сохраните ключ и секрет в переменных окружения. Никогда в коде, никогда в репозитории.
# .env или профиль оболочки
export KH_KEY="kh_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
export KH_SECRET="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
3. Отправьте первый запрос
Получите список доступных продуктов. Подпись формируется по методу, пути, временной метке, nonce и хешу тела.
TS=$(date +%s)
NONCE=$(openssl rand -hex 16)
BODY_SHA256=$(printf '' | openssl dgst -sha256 -hex | awk '{print $NF}')
SIG_INPUT=$(printf 'GET\n/v1/products\n%s\n%s\n%s' "$TS" "$NONCE" "$BODY_SHA256")
SIG=$(printf '%s' "$SIG_INPUT" | openssl dgst -sha256 -hmac "$KH_SECRET" -hex | awk '{print $NF}')
curl https://www.kernelhost.com/cp/kernelhost_api/v1/products \
-H "KH-Key: $KH_KEY" \
-H "KH-Timestamp: $TS" \
-H "KH-Nonce: $NONCE" \
-H "KH-Signature: $SIG"
4. Разместите заказ
Важно: POST /v1/orders требует Idempotency-Key и имя хоста. Если после сетевой ошибки вы повторите запрос с тем же ключом, то получите тот же ответ, а не второй заказ. Опции конфигурации, которые вы не указали (например, локация или операционная система), получают первое значение, предлагаемое в магазине.
BODY='{"product_id":42,"billing_cycle":"monthly","hostname":"web01.example.com"}'
IDEM="order-web01-$(date +%Y%m%d)"
BODY_SHA256=$(printf '%s' "$BODY" | openssl dgst -sha256 -hex | awk '{print $NF}')
TS=$(date +%s)
NONCE=$(openssl rand -hex 16)
SIG_INPUT=$(printf 'POST\n/v1/orders\n%s\n%s\n%s' "$TS" "$NONCE" "$BODY_SHA256")
SIG=$(printf '%s' "$SIG_INPUT" | openssl dgst -sha256 -hmac "$KH_SECRET" -hex | awk '{print $NF}')
curl -X POST https://www.kernelhost.com/cp/kernelhost_api/v1/orders \
-H "KH-Key: $KH_KEY" \
-H "KH-Timestamp: $TS" \
-H "KH-Nonce: $NONCE" \
-H "KH-Signature: $SIG" \
-H "Idempotency-Key: $IDEM" \
-H "Content-Type: application/json" \
--data "$BODY"
5. Проверьте статус и получите учётные данные
В ответе на заказ указаны service_ids. Опрашивайте GET /v1/services/{id}, пока status не примет значение active и не будет назначен IP-адрес; настройка обычно занимает от нескольких секунд до нескольких минут. Затем GET /v1/services/{id}/credentials (разрешение read:credentials) возвращает имя хоста, IP-адреса, имя пользователя и пароль, например для вашего инвентаря Ansible.
kh_get() {
TS=$(date +%s)
NONCE=$(openssl rand -hex 16)
BODY_SHA256=$(printf '' | openssl dgst -sha256 -hex | awk '{print $NF}')
SIG_INPUT=$(printf 'GET\n%s\n%s\n%s\n%s' "$1" "$TS" "$NONCE" "$BODY_SHA256")
SIG=$(printf '%s' "$SIG_INPUT" | openssl dgst -sha256 -hmac "$KH_SECRET" -hex | awk '{print $NF}')
curl -s "https://www.kernelhost.com/cp/kernelhost_api$1" \
-H "KH-Key: $KH_KEY" \
-H "KH-Timestamp: $TS" \
-H "KH-Nonce: $NONCE" \
-H "KH-Signature: $SIG"
}
kh_get /v1/services/1234
kh_get /v1/services/1234/credentials
6. Укажите URL вебхука (опционально)
Уже сейчас вы можете указать HTTPS URL для каждого ключа. Доставка событий находится в разработке; до тех пор используйте запросы статуса из шага 5.

