Обновить playbooks/update.yml
This commit is contained in:
+20
-14
@@ -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,20 +45,17 @@
|
|||||||
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
|
||||||
@@ -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
|
||||||
Reference in New Issue
Block a user