diff --git a/playbooks/kernel-update.yml b/playbooks/kernel-update.yml new file mode 100644 index 0000000..5fac0fc --- /dev/null +++ b/playbooks/kernel-update.yml @@ -0,0 +1,100 @@ +--- +- name: Automatic kernel update with reboot (excluding AWX server) + hosts: all:!awx # исключаем группу awx + become: yes + gather_facts: yes + + vars: + # Telegram bot variables – лучше передавать через AWX Credentials или переменные + telegram_token: "{{ telegram_bot_token }}" # задать в AWX + telegram_chat_id: "{{ telegram_chat_id }}" # задать в AWX + api_url: "https://api.telegram.org/bot{{ telegram_token }}/sendMessage" + + tasks: + # 1. Узнаём текущую версию ядра + - name: Get current kernel version + command: uname -r + register: kernel_before + changed_when: false + + # 2. Устанавливаем обновления ядра (обновляем все пакеты, но фокусируемся на ядре) + - name: Update all packages (including kernel) + apt: + upgrade: dist + autoremove: yes + autoclean: yes + register: apt_result + + # 3. Узнаём новую версию ядра + - name: Get new kernel version after update + command: uname -r + register: kernel_after + changed_when: false + ignore_errors: yes # если обновление не выполнялось, то uname -r выдаст ту же версию + + # 4. Определяем, было ли обновление ядра + - name: Check if kernel version changed + set_fact: + kernel_updated: "{{ kernel_before.stdout != kernel_after.stdout }}" + + # 5. Отправляем уведомление в Telegram (если ядро обновлено или если были другие изменения) + - name: Send Telegram notification (if kernel updated) + uri: + url: "{{ api_url }}" + method: POST + body_format: json + body: + chat_id: "{{ telegram_chat_id }}" + text: | + 🐧 Kernel update on {{ inventory_hostname }} + Before: {{ kernel_before.stdout }} + After: {{ kernel_after.stdout }} + Host: {{ inventory_hostname }} ({{ ansible_distribution }} {{ ansible_distribution_version }}) + Status: ✅ Kernel updated. Rebooting in 30 seconds. + disable_notification: false + when: kernel_updated + delegate_to: localhost + run_once: false # отправляем с каждого хоста, уведомление будет от каждого хоста + + # 6. Перезагрузка, если ядро обновлено + - name: Reboot if kernel was updated + reboot: + reboot_timeout: 600 + pre_reboot_delay: 30 + post_reboot_delay: 60 + when: kernel_updated + + # 7. После ребута отправляем второе уведомление – подтверждение загрузки + - name: Send reboot completion notification + uri: + url: "{{ api_url }}" + method: POST + body_format: json + body: + chat_id: "{{ telegram_chat_id }}" + text: | + 🔄 Reboot completed on {{ inventory_hostname }} + New kernel: {{ kernel_after.stdout }} + Host: {{ inventory_hostname }} + All services are up. + disable_notification: false + when: kernel_updated + delegate_to: localhost + run_once: false + + # 8. Если обновления ядра не было – отправим уведомление об этом + - name: Send no-kernel-update notification + uri: + url: "{{ api_url }}" + method: POST + body_format: json + body: + chat_id: "{{ telegram_chat_id }}" + text: | + ⏭️ No kernel update on {{ inventory_hostname }} + Current kernel: {{ kernel_before.stdout }} + Host: {{ inventory_hostname }} + disable_notification: false + when: not kernel_updated + delegate_to: localhost + run_once: false \ No newline at end of file