# extravars: username, password, panel_port, web_base_path, domain (optional), version (optional) # # Ставит 3x-ui скриптом из README проекта в неинтерактивном режиме. # Сертификат: на домен, если он задан, иначе на ip. Оба варианта требуют открытый 80 порт (acme). - name: Install 3x-ui panel hosts: target gather_facts: false vars: xui_bin: /usr/local/x-ui/x-ui xui_domain: "{{ domain | default('') }}" tasks: - ansible.builtin.import_tasks: tasks/firewall.yml vars: firewall_tcp_ports: [ "{{ ansible_port }}", 80, 443, "{{ panel_port }}" ] - name: Download install script ansible.builtin.get_url: url: https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh dest: /root/3x-ui-install.sh mode: "0700" force: true - name: Run install script ansible.builtin.command: cmd: "bash /root/3x-ui-install.sh {{ version | default('') }}" creates: "{{ xui_bin }}" environment: XUI_NONINTERACTIVE: "1" XUI_USERNAME: "{{ username }}" XUI_PASSWORD: "{{ password }}" XUI_PANEL_PORT: "{{ panel_port }}" XUI_WEB_BASE_PATH: "{{ web_base_path }}" XUI_SSL_MODE: "{{ 'domain' if xui_domain else 'ip' }}" XUI_DOMAIN: "{{ xui_domain }}" XUI_SERVER_IP: "{{ ansible_host }}" no_log: true # скрипт не перезаписывает настройки уже установленной панели, поэтому задаем их явно - name: Apply panel settings ansible.builtin.command: >- {{ xui_bin }} setting -username {{ username | quote }} -password {{ password | quote }} -port {{ panel_port }} -webBasePath {{ web_base_path | quote }} no_log: true - name: Restart panel ansible.builtin.systemd_service: name: x-ui state: restarted enabled: true - name: Read API token ansible.builtin.shell: "{{ xui_bin }} setting -getApiToken | grep -Eo 'apiToken: .+' | awk '{print $2}'" register: api_token changed_when: false no_log: true - name: Return panel access ansible.builtin.set_stats: aggregate: false data: api_token: "{{ api_token.stdout }}" no_log: true