Обновить playbooks/update.yml

This commit is contained in:
2026-08-24 10:39:31 +03:00
parent cc4561d9c5
commit 202828cf19
+27 -21
View File
@@ -5,15 +5,11 @@
gather_facts: yes gather_facts: yes
vars: vars:
# Telegram bot token (из задания)
telegram_token: "8820292312:AAECFO1AEWOJTh30zNuhyjC5C81o_qJHQcM" telegram_token: "8820292312:AAECFO1AEWOJTh30zNuhyjC5C81o_qJHQcM"
# ID чата, куда отправлять уведомления (из вашего сообщения)
telegram_chat_id: "407968638" telegram_chat_id: "407968638"
# Прокси для Telegram API (формат для curl)
telegram_proxy: "socks5h://administrator:60NthRegT@192.168.0.218:1080" telegram_proxy: "socks5h://administrator:60NthRegT@192.168.0.218:1080"
tasks: tasks:
# 1. Показываем текущую версию ОС и ядра (для контекста)
- name: Show OS and kernel version - name: Show OS and kernel version
debug: debug:
msg: msg:
@@ -21,7 +17,6 @@
- "OS: {{ ansible_distribution }} {{ ansible_distribution_version }}" - "OS: {{ ansible_distribution }} {{ ansible_distribution_version }}"
- "Kernel: {{ ansible_kernel }}" - "Kernel: {{ ansible_kernel }}"
# 2. Обновляем кэш apt и запоминаем, изменился ли он
- name: Update apt cache - name: Update apt cache
apt: apt:
update_cache: yes update_cache: yes
@@ -32,19 +27,17 @@
debug: debug:
msg: "Apt cache was {{ 'updated' if apt_update_result.changed else 'already up to date' }}" msg: "Apt cache was {{ 'updated' if apt_update_result.changed else 'already up to date' }}"
# 3. Получаем список пакетов, которые можно обновить (до обновления)
- name: Get list of upgradable packages - name: Get list of upgradable packages
command: apt list --upgradable command: apt list --upgradable
register: upgradable_before register: upgradable_before
changed_when: false changed_when: false
ignore_errors: yes # если команда недоступна, продолжить ignore_errors: yes
- name: Show upgradable packages before update - name: Show upgradable packages before update
debug: debug:
var: upgradable_before.stdout_lines var: upgradable_before.stdout_lines
when: upgradable_before.stdout_lines | length > 0 when: upgradable_before.stdout_lines | length > 0
# 4. Выполняем полное обновление (dist-upgrade)
- name: Perform dist-upgrade (full upgrade) - name: Perform dist-upgrade (full upgrade)
apt: apt:
upgrade: dist upgrade: dist
@@ -52,31 +45,28 @@
autoclean: yes autoclean: yes
register: apt_upgrade_result register: apt_upgrade_result
# 5. Показываем результат обновления (что изменилось)
- name: Show upgrade results - name: Show upgrade results
debug: debug:
msg: msg:
- "Packages upgraded: {{ apt_upgrade_result.results | default([]) | map(attribute='packages') | list | flatten | unique | join(', ') if apt_upgrade_result.results is defined else 'No package list available' }}" - "Packages upgraded: {{ apt_upgrade_result.results | default([]) | map(attribute='packages') | list | flatten | unique | join(', ') if apt_upgrade_result.results is defined else 'No package list available' }}"
when: apt_upgrade_result.changed when: apt_upgrade_result.changed
# 6. Если изменений не было – сообщаем об этом
- name: No packages were upgraded - name: No packages were upgraded
debug: debug:
msg: "All packages are up to date." msg: "All packages are up to date."
when: not apt_upgrade_result.changed when: not apt_upgrade_result.changed
# 7. Проверяем, требуется ли перезагрузка (наличие /var/run/reboot-required)
- name: Check if reboot is required - name: Check if reboot is required
stat: stat:
path: /var/run/reboot-required path: /var/run/reboot-required
register: reboot_required_file register: reboot_required_file
# - name: Reboot if required # - name: Reboot if required
# reboot: # reboot:
# reboot_timeout: 600 # reboot_timeout: 600
# pre_reboot_delay: 30 # pre_reboot_delay: 30
# post_reboot_delay: 30 # post_reboot_delay: 30
# when: reboot_required_file.stat.exists # when: reboot_required_file.stat.exists
- name: Reboot not required - name: Reboot not required
debug: debug:
@@ -90,26 +80,42 @@
<b>Host:</b> {{ inventory_hostname }} <b>Host:</b> {{ inventory_hostname }}
<b>OS:</b> {{ ansible_distribution }} {{ ansible_distribution_version }} <b>OS:</b> {{ ansible_distribution }} {{ ansible_distribution_version }}
<b>Kernel:</b> {{ ansible_kernel }} <b>Kernel:</b> {{ ansible_kernel }}
<b>Update result:</b> {% if apt_upgrade_result.changed %}✅ Updates applied{% else %}✅ No updates needed{% endif %} <b>Update result:</b> {% if apt_upgrade_result.changed %}✅ Updates applied{% else %}✅ No updates needed{% endif %}
{% if apt_upgrade_result.changed and upgradable_before.stdout_lines is defined and upgradable_before.stdout_lines | length > 0 %} {% if apt_upgrade_result.changed and upgradable_before.stdout_lines is defined and upgradable_before.stdout_lines | length > 0 %}
<b>Upgraded packages (old → new):</b> <b>Upgraded packages (old → new):</b>
{{ upgradable_before.stdout_lines | select('match', '^[^/]+/') | list | join('\n') }} {{ upgradable_before.stdout_lines | select('match', '^[^/]+/') | list | join('\n') }}
{% else %}
(no packages to upgrade)
{% endif %} {% endif %}
<b>Reboot required:</b> {% if reboot_required_file.stat.exists %}⚠️ YES{% else %}No{% endif %} <b>Reboot required:</b> {% if reboot_required_file.stat.exists %}⚠️ YES{% else %}No{% endif %}
- name: Send Telegram notification - name: Send Telegram notification
shell: | shell: |
# Экранируем текст для JSON # Формируем JSON-экранированное сообщение с помощью Python (безопасно для многострочного текста)
MESSAGE=$(cat <<'EOF' | python3 -c 'import sys, json; print(json.dumps(sys.stdin.read()))' MESSAGE=$(cat <<'EOF' | python3 -c 'import sys, json; print(json.dumps(sys.stdin.read()))'
{{ message_text }} {{ message_text }}
EOF EOF
) )
curl -x {{ telegram_proxy }} \ PROXY_OPT=""
-s -X POST \ {% if telegram_proxy | default('') %}
PROXY_OPT="-x {{ telegram_proxy }}"
{% endif %}
curl $PROXY_OPT \
-s -f -X POST \
--connect-timeout 30 \
--max-time 120 \
-H "Content-Type: application/json" \ -H "Content-Type: application/json" \
-d "{\"chat_id\": \"{{ telegram_chat_id }}\", \"text\": $MESSAGE, \"parse_mode\": \"HTML\"}" \ -d "{\"chat_id\": \"{{ telegram_chat_id }}\", \"text\": $MESSAGE, \"parse_mode\": \"HTML\"}" \
https://api.telegram.org/bot{{ telegram_token }}/sendMessage https://api.telegram.org/bot{{ telegram_token }}/sendMessage
register: telegram_result
when: when:
- telegram_token | default('') != '' - telegram_token | default('') != ''
- telegram_chat_id | default('') != '' - telegram_chat_id | default('') != ''
ignore_errors: yes ignore_errors: yes
- name: Show Telegram send result
debug:
msg: "Telegram notification sent (rc={{ telegram_result.rc }})"
when: telegram_result is defined