Почему Terraform нужен отдельный алерт
terraform apply может упасть посередине и оставить инфраструктуру в частично измененном состоянии. В чате это легко пропустить. Nerve отправляет push сразу после non-zero exit code и не требует бота с доступом к истории.
Локальный wrapper
#!/bin/bash
set -euo pipefail
export NERVE_DSN="nerve://TOKEN:[email protected]"
cd /opt/infra/production
if terraform apply -auto-approve 2>&1 | tee /tmp/tf-output.log; then
echo "Terraform OK: production" | nerve send
else
echo "TERRAFORM FAILED: production on $(hostname)" | nerve send --severity critical
tail -20 /tmp/tf-output.log | nerve send --severity alert
fi
GitHub Actions
- name: Terraform Apply
id: apply
run: terraform apply -auto-approve tfplan
continue-on-error: true
- name: Notify on failure
if: steps.apply.outcome == 'failure'
env:
NERVE_DSN: ${{ secrets.NERVE_DSN }}
run: |
echo "terraform apply FAILED: ${{ github.repository }} (${{ github.ref_name }})" \
| nerve send --severity critical
GitLab CI
apply:
stage: deploy
script:
- terraform apply -auto-approve tfplan
after_script:
- |
if [ "$CI_JOB_STATUS" = "failed" ]; then
echo "terraform apply FAILED: $CI_PROJECT_NAME / $CI_COMMIT_REF_NAME" \
| nerve send --severity critical
fi
Drift detection
terraform plan -detailed-exitcode возвращает 2, если есть изменения. Это хороший ночной check.
terraform plan -detailed-exitcode -out=tfplan 2>&1 | tee /tmp/tf-plan.log
EXIT=$?
if [ "$EXIT" -eq 2 ]; then
echo "Terraform drift detected: production" | nerve send --severity alert
elif [ "$EXIT" -ne 0 ]; then
tail -15 /tmp/tf-plan.log | nerve send --severity critical
fi
Что не отправлять
Не надоПолный plan, state, provider credentials, output с secrets.
НадоWorkspace, environment, exit code, короткая причина, ссылка на CI run.
NerveШифрует payload локально; sender DSN не читает историю и не выполняет команды.
FAQ
Как получить уведомление если terraform apply упал?
Проверьте exit code и при ошибке отправьте summary через nerve send. В CI храните NERVE_DSN как secret.
Это замена Telegram-боту для Terraform?
Для failed alerts — да. Telegram удобен для обсуждения, но ops-сигнал лучше отправлять отдельным encrypted pipe.