- name: Site-Datei laden ansible.builtin.set_fact: knaster_pve: "{{ lookup('ansible.builtin.file', pve_site_file) | from_yaml }}" run_once: true delegate_to: localhost - name: Bootloader erkennen (systemd-boot bei ZFS-Root, sonst GRUB) ansible.builtin.stat: path: /etc/kernel/cmdline register: kernel_cmdline - name: IOMMU aktivieren (systemd-boot) ansible.builtin.replace: path: /etc/kernel/cmdline regexp: '^((?!.*intel_iommu=on).*)$' replace: '\1 {{ pve_iommu_cmdline }}' when: kernel_cmdline.stat.exists notify: refresh boot - name: IOMMU aktivieren (GRUB) ansible.builtin.lineinfile: path: /etc/default/grub regexp: '^GRUB_CMDLINE_LINUX_DEFAULT="((?!.*intel_iommu=on).*)"$' line: 'GRUB_CMDLINE_LINUX_DEFAULT="\1 {{ pve_iommu_cmdline }}"' backrefs: true when: not kernel_cmdline.stat.exists notify: refresh boot - name: VFIO-Module laden ansible.builtin.copy: dest: /etc/modules-load.d/vfio.conf content: "{{ pve_vfio_modules | join('\n') }}\n" mode: "0644" - name: NVIDIA-Treiber auf dem Host sperren (GPU gehört der VM) ansible.builtin.copy: dest: /etc/modprobe.d/blacklist-nvidia.conf content: | blacklist nouveau blacklist nvidia blacklist nvidiafb mode: "0644" notify: refresh boot - name: ZFS-Pool tank vorhanden? ansible.builtin.command: zpool list -H -o name tank register: tank changed_when: false failed_when: false - name: Hinweis, falls tank fehlt (Pool wird bewusst NICHT automatisch angelegt – Datenverlustgefahr) ansible.builtin.debug: msg: >- Auf {{ inventory_hostname }} fehlt der ZFS-Pool 'tank'. Nach Freigabe (D1) und Prüfung mit `lsblk -o NAME,SIZE,FSTYPE,LABEL /dev/sdb`: zpool create -o ashift=12 -O compression=lz4 -O atime=off tank /dev/disk/by-id/ && pvesm add zfspool tank --pool tank --content images,rootdir when: - tank.rc != 0 - knaster_pve.nodes[inventory_hostname].zfs_tank | default(false) - name: Bestehende Replikationsjobs lesen ansible.builtin.command: pvesr list register: pvesr_jobs changed_when: false # Ein Job pro Ziel: -0, -1, … (Reihenfolge aus replicate_to) - name: ZFS-Replikation für HA-Gäste ansible.builtin.command: > pvesr create-local-job {{ item.0.value.vmid }}-{{ idx }} {{ item.1 }} --schedule '{{ knaster_pve.replication_schedule }}' --comment 'knaster {{ item.0.key }}' loop: "{{ knaster_pve.containers | dict2items | subelements('value.replicate_to', skip_missing=true) }}" vars: idx: "{{ item.0.value.replicate_to.index(item.1) }}" when: - item.0.value.node == inventory_hostname - ((item.0.value.vmid | string) + '-' + (idx | string)) not in pvesr_jobs.stdout changed_when: true