Ключевые практики для ansible-pull в production
1. Preflight checks (обязательно)
- Диск: >1 GiB свободно на корне
- Память: >512 MiB свободно
- Сеть: доступен git-репозиторий
- Права: запись в /var/lib/ansible/pull
2. Защита от параллельных запусков
LOCK=/var/run/ansible-pull.lock
exec 200>$LOCK
flock -n 200 || exit 0
3. Версионирование
- Использовать git tags, а не latest
- Переменная в роли:
{{ lookup('env', 'ANSIBLE_TAG', 'last-good') }}
4. Откат
- Тег
last-good обновляется только при успехе
- Отдельный playbook для быстрого redeploy
5. Мониторинг
- systemd таймер + journal
- Prometheus textfile collector для статуса
- Алерты при ansible_pull_success == 0
6. systemd unit (production)
[Unit]
Description=Ansible Pull
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/bin/ansible-pull -U {{ repo_url }} -C {{ git_tag }}
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
7. Чек-лист перед деплоем
8. Безопасность (добавлено)
- Использовать HTTPS с token вместо SSH
- Секреты через systemd Environment или Vault
- Preflight с --check и --diff
- Структурированное логирование в JSON
9. Ротация логов
/var/log/ansible-pull/*.log {
weekly
rotate 12
compress
delaycompress
missingok
notifempty
create 0640 root adm
}