feat: complete uninstall cleanup on server and local output

Remove binary, config, masq, system user, ufw rules, and apt packages from VPS; delete output/<server>/ by default and rebuild global index.html via localhost play.
This commit is contained in:
Sergey Antropoff
2026-07-01 12:55:52 +03:00
parent b9e622e5c2
commit 5e42d60778
6 changed files with 108 additions and 20 deletions
-3
View File
@@ -43,6 +43,3 @@ hysteria2_qr_png_error_correction: M
hysteria2_wait_for_acme: true
hysteria2_open_browser: true
# --- uninstall ---
hysteria2_uninstall_remove_config: true
hysteria2_uninstall_remove_local_output: false
+15
View File
@@ -0,0 +1,15 @@
---
# Системный пользователь Hysteria (создаётся install_server.sh)
hysteria2_system_user: hysteria
# --- uninstall (Salamander: без masq, порты 443/tcp+udp) ---
hysteria2_uninstall_remove_config: true
hysteria2_uninstall_remove_masq: false
hysteria2_uninstall_remove_system_user: true
hysteria2_uninstall_remove_packages: true
hysteria2_uninstall_remove_firewall_rules: true
hysteria2_uninstall_remove_local_output: true
hysteria2_uninstall_rebuild_global_index: true
hysteria2_uninstall_ufw_rules:
- "{{ hysteria2_listen_port }}/tcp"
- "{{ hysteria2_listen_port }}/udp"
+74 -13
View File
@@ -6,31 +6,79 @@
state: stopped
failed_when: false
- name: Remove Hysteria2 via official script
ansible.builtin.shell:
cmd: bash <(curl -fsSL https://get.hy2.sh/) --remove
executable: /bin/bash
- name: Sync official Hysteria2 install script on control node
ansible.builtin.import_tasks: sync_install_script.yml
- name: Copy Hysteria2 install script to server
ansible.builtin.copy:
src: "{{ hysteria2_install_script_name }}"
dest: "{{ hysteria2_install_script_remote_path }}"
mode: "0755"
- name: Remove Hysteria2 binary and systemd units via official script
ansible.builtin.command:
cmd: "{{ hysteria2_install_script_remote_path }} --remove"
register: _hysteria2_remove
changed_when: _hysteria2_remove.rc == 0
failed_when: false
- name: Remove Hysteria2 configuration directory
- name: Remove Hysteria2 configuration and ACME data
ansible.builtin.file:
path: "{{ hysteria2_config_path | dirname }}"
state: absent
when: hysteria2_uninstall_remove_config | bool
- name: Remove Hysteria system user and home directory
ansible.builtin.user:
name: "{{ hysteria2_system_user }}"
state: absent
remove: true
when: hysteria2_uninstall_remove_system_user | bool
failed_when: false
- name: Check if ufw is available and active
ansible.builtin.command: ufw status
register: _hysteria2_ufw_status
changed_when: false
failed_when: false
when: hysteria2_uninstall_remove_firewall_rules | bool
- name: Remove firewall rules added during install
ansible.builtin.command: "ufw delete allow {{ item }}"
loop: "{{ hysteria2_uninstall_ufw_rules }}"
register: _hysteria2_ufw_delete
changed_when: >-
_hysteria2_ufw_delete.rc == 0
and 'Could not delete' not in (_hysteria2_ufw_delete.stdout | default(''))
and 'Could not find' not in (_hysteria2_ufw_delete.stderr | default(''))
failed_when: false
when:
- hysteria2_uninstall_remove_firewall_rules | bool
- "'active' in (_hysteria2_ufw_status.stdout | default(''))"
- name: Remove packages installed for Hysteria2
ansible.builtin.apt:
name: "{{ _hysteria2_apt_packages }}"
state: absent
purge: true
autoremove: true
vars:
_hysteria2_apt_packages: >-
{{
['curl', 'micro']
+ (['qrencode'] if hysteria2_generate_qr_png | bool else [])
}}
when: hysteria2_uninstall_remove_packages | bool
- name: Remove copied install script from server
ansible.builtin.file:
path: "{{ hysteria2_install_script_remote_path }}"
state: absent
- name: Reload systemd after uninstall
ansible.builtin.systemd:
daemon_reload: true
- name: Show uninstall result
ansible.builtin.debug:
msg: >-
Hysteria2 (Salamander) удалён с {{ inventory_hostname }}.
{% if not hysteria2_uninstall_remove_local_output | bool %}
Локальные URL/QR в {{ hysteria2_output_dir }}/{{ hysteria2_output_name }}/ сохранены.
{% endif %}
- name: Remove local exported client files
ansible.builtin.file:
path: "{{ hysteria2_output_dir }}/{{ hysteria2_output_name }}"
@@ -38,3 +86,16 @@
delegate_to: localhost
become: false
when: hysteria2_uninstall_remove_local_output | bool
- name: Show uninstall result
ansible.builtin.debug:
msg: >-
Hysteria2 (Salamander) полностью удалён с {{ inventory_hostname }}.
{% if hysteria2_uninstall_remove_local_output | bool %}
Локальные URL/QR в {{ hysteria2_output_dir }}/{{ hysteria2_output_name }}/ удалены.
{% if hysteria2_uninstall_rebuild_global_index | bool %}
Глобальный {{ hysteria2_output_dir }}/index.html пересобран.
{% endif %}
{% else %}
Локальные URL/QR в {{ hysteria2_output_dir }}/{{ hysteria2_output_name }}/ сохранены.
{% endif %}