- name: Switch Proxmox VE from Enterprise to Community Repositories hosts: nodito become: true vars_files: - ../infra_vars.yml tasks: - name: Check for deb822 sources format find: paths: /etc/apt/sources.list.d/ patterns: "*.sources" file_type: file register: deb822_sources changed_when: false - name: Check for legacy .list files find: paths: /etc/apt/sources.list.d/ patterns: "*.list" file_type: file register: legacy_list_files changed_when: false - name: Check main sources.list for Proxmox entries command: grep -q "proxmox\|trixie" /etc/apt/sources.list register: main_sources_check failed_when: false changed_when: false - name: Display current repository status debug: msg: | Repository status: - deb822 sources files: {{ deb822_sources.matched }} - legacy .list files: {{ legacy_list_files.matched }} - Proxmox/Trixie entries in sources.list: {{ main_sources_check.rc == 0 }} - name: Check for enterprise repository in deb822 format shell: | for file in /etc/apt/sources.list.d/*.sources; do if grep -q "Components:.*pve-enterprise" "$file" 2>/dev/null; then echo "$file" break fi done register: enterprise_deb822_check failed_when: false changed_when: false - name: Check for enterprise repository in legacy format shell: | for file in /etc/apt/sources.list.d/*.list; do if grep -q "enterprise.proxmox.com" "$file" 2>/dev/null; then echo "$file" break fi done register: enterprise_legacy_check failed_when: false changed_when: false - name: Check for Ceph enterprise repository in deb822 format shell: | for file in /etc/apt/sources.list.d/*.sources; do if grep -q "enterprise.proxmox.com.*ceph" "$file" 2>/dev/null; then echo "$file" break fi done register: ceph_enterprise_deb822_check failed_when: false changed_when: false - name: Check for Ceph enterprise repository in legacy format shell: | for file in /etc/apt/sources.list.d/*.list; do if grep -q "enterprise.proxmox.com.*ceph" "$file" 2>/dev/null; then echo "$file" break fi done register: ceph_enterprise_legacy_check failed_when: false changed_when: false - name: Backup enterprise repository files copy: src: "{{ item }}" dest: "{{ item }}.backup" remote_src: yes backup: yes loop: "{{ (enterprise_deb822_check.stdout_lines + enterprise_legacy_check.stdout_lines + ceph_enterprise_deb822_check.stdout_lines + ceph_enterprise_legacy_check.stdout_lines) | select('string') | list }}" when: (enterprise_deb822_check.stdout_lines + enterprise_legacy_check.stdout_lines + ceph_enterprise_deb822_check.stdout_lines + ceph_enterprise_legacy_check.stdout_lines) | select('string') | list | length > 0 - name: Delete enterprise repository files (deb822 format) file: path: "{{ item }}" state: absent loop: "{{ enterprise_deb822_check.stdout_lines | select('string') | list }}" when: enterprise_deb822_check.stdout_lines | select('string') | list | length > 0 - name: Delete enterprise repository files (legacy format) file: path: "{{ item }}" state: absent loop: "{{ enterprise_legacy_check.stdout_lines | select('string') | list }}" when: enterprise_legacy_check.stdout_lines | select('string') | list | length > 0 - name: Delete Ceph enterprise repository files (deb822 format) file: path: "{{ item }}" state: absent loop: "{{ ceph_enterprise_deb822_check.stdout_lines | select('string') | list }}" when: ceph_enterprise_deb822_check.stdout_lines | select('string') | list | length > 0 - name: Delete Ceph enterprise repository files (legacy format) file: path: "{{ item }}" state: absent loop: "{{ ceph_enterprise_legacy_check.stdout_lines | select('string') | list }}" when: ceph_enterprise_legacy_check.stdout_lines | select('string') | list | length > 0 - name: Create community repository file (deb822 format) copy: dest: /etc/apt/sources.list.d/proxmox.sources content: | Types: deb URIs: http://download.proxmox.com/debian/pve Suites: trixie Components: pve-no-subscription Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg owner: root group: root mode: '0644' backup: yes when: deb822_sources.matched > 0 - name: Create community repository file (legacy format) copy: dest: /etc/apt/sources.list.d/pve-no-subscription.list content: | # PVE pve-no-subscription repository provided by proxmox.com, # NOT recommended for production use deb http://download.proxmox.com/debian/pve trixie pve-no-subscription owner: root group: root mode: '0644' backup: yes when: deb822_sources.matched == 0 - name: Create Ceph community repository file (deb822 format) copy: dest: /etc/apt/sources.list.d/ceph.sources content: | Types: deb URIs: http://download.proxmox.com/debian/ceph-squid Suites: trixie Components: no-subscription Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg owner: root group: root mode: '0644' backup: yes when: deb822_sources.matched > 0 - name: Create Ceph community repository file (legacy format) copy: dest: /etc/apt/sources.list.d/ceph-no-subscription.list content: | # Ceph no-subscription repository provided by proxmox.com, # NOT recommended for production use deb http://download.proxmox.com/debian/ceph-squid trixie no-subscription owner: root group: root mode: '0644' backup: yes when: deb822_sources.matched == 0 - name: Update package cache apt: update_cache: yes cache_valid_time: 3600 - name: Verify community repository is working command: apt-cache policy proxmox-ve register: community_repo_verify changed_when: false - name: Display community repository verification debug: var: community_repo_verify.stdout_lines - name: Update Proxmox packages from community repository apt: name: proxmox-ve state: latest update_cache: yes - name: Verify Proxmox VE version command: pveversion register: proxmox_version changed_when: false - name: Display Proxmox VE version debug: msg: "Proxmox VE version: {{ proxmox_version.stdout }}" - name: Check repository status shell: apt-cache policy | grep -A 5 -B 5 proxmox register: final_repo_status changed_when: false - name: Display final repository status debug: var: final_repo_status.stdout_lines - name: Verify no enterprise repository warnings command: apt update register: apt_update_result changed_when: false - name: Check for enterprise repository warnings fail: msg: "Enterprise repository warnings detected. Check the output above." when: "'enterprise.proxmox.com' in apt_update_result.stdout" - name: Create subscription nag removal script copy: dest: /usr/local/bin/pve-remove-nag.sh content: | #!/bin/sh WEB_JS=/usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js if [ -s "$WEB_JS" ] && ! grep -q NoMoreNagging "$WEB_JS"; then echo "Patching Web UI nag..." sed -i -e "/data\.status/ s/!//" -e "/data\.status/ s/active/NoMoreNagging/" "$WEB_JS" fi MOBILE_TPL=/usr/share/pve-yew-mobile-gui/index.html.tpl MARKER="" if [ -f "$MOBILE_TPL" ] && ! grep -q "$MARKER" "$MOBILE_TPL"; then echo "Patching Mobile UI nag..." printf "%s\n" \ "$MARKER" \ "" \ "" >> "$MOBILE_TPL" fi owner: root group: root mode: '0755' - name: Create APT configuration for nag removal copy: dest: /etc/apt/apt.conf.d/no-nag-script content: | DPkg::Post-Invoke { "/usr/local/bin/pve-remove-nag.sh"; }; owner: root group: root mode: '0644' - name: Run nag removal script immediately command: /usr/local/bin/pve-remove-nag.sh changed_when: false - name: Reinstall proxmox-widget-toolkit to apply nag removal apt: name: proxmox-widget-toolkit state: present force: yes - name: Clean up backup files file: path: "{{ item }}" state: absent loop: - /etc/apt/sources.list.d/ceph.sources.backup - /etc/apt/sources.list.d/pve-enterprise.sources.backup ignore_errors: yes - name: Success message debug: msg: | Successfully switched from Proxmox Enterprise to Community repositories. Enterprise repository has been disabled and community repository is now active. Subscription nag messages have been disabled. Proxmox VE version: {{ proxmox_version.stdout }} IMPORTANT: Clear your browser cache or perform a hard reload (Ctrl+Shift+R) before using the Proxmox VE Web UI to avoid UI display issues.