Shell wrapper
Самый простой вариант для playbook из cron, CI или локального admin host.
#!/bin/bash
set -euo pipefail
export NERVE_DSN="nerve://TOKEN:[email protected]"
if ansible-playbook -i inventory.yml site.yml 2>&1 | tee /tmp/ansible-output.log; then
echo "Ansible OK: site.yml" | nerve send
else
echo "ANSIBLE FAILED: site.yml on $(hostname)" | nerve send --severity critical
tail -20 /tmp/ansible-output.log | nerve send --severity alert
fi
Rescue block внутри playbook
---
- hosts: webservers
tasks:
- block:
- name: Deploy application
ansible.builtin.shell: /opt/deploy.sh
- name: Restart service
ansible.builtin.systemd:
name: my-app
state: restarted
rescue:
- name: Notify Nerve on failure
ansible.builtin.shell: |
echo "Ansible FAILED on {{ inventory_hostname }}: {{ ansible_failed_task.name }}" \
| nerve send --severity critical
environment:
NERVE_DSN: "{{ nerve_dsn }}"
delegate_to: localhost
Scheduled Ansible из cron
# /etc/cron.d/ansible-nightly
30 2 * * * ansible /usr/local/bin/ansible-with-nerve.sh
GitHub Actions + Ansible
- name: Run Ansible
id: ansible
run: ansible-playbook -i inventory.yml site.yml
continue-on-error: true
- name: Notify on failure
if: steps.ansible.outcome == 'failure'
env:
NERVE_DSN: ${{ secrets.NERVE_DSN }}
run: echo "Ansible FAILED: ${{ github.repository }}" | nerve send --severity critical
Что включить в сообщение
ПолезноPlaybook, inventory, environment, failed host, короткая ошибка.
ОпасноVault secrets, приватные ключи, полный verbose output.
ЛучшеКороткий push + ссылка на CI/AWX run, где уже есть полный лог.
FAQ
Как получать Ansible уведомления без Telegram?
Добавьте wrapper вокруг ansible-playbook или rescue block, который вызывает nerve send при ошибке.
Работает ли с AWX / Tower?
Да. Нужен шаг или webhook bridge, который выполнит nerve send с коротким summary.