proxmox: Site-Datei und pve-host-Rolle an die echten Knoten (pve44–pve61) angepasst
ci / test (push) Failing after 27s
ci / test (push) Failing after 27s
proxmox.yaml mit gelesenen PCI-IDs/IOMMU-Gruppen, eine GPU-VM pro Knoten mit allen Karten, DHCP, Templates je Knoten. pve-host nur für GPU-Knoten: vfio-pci-IDs auf dem Knoten gelesen, softdeps, sysfb aus, initramfs- Handler, Vendor-Snippet für den Gast-Agenten, Replikation erst wenn der Container existiert. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
dfb2630517
commit
908c698589
@@ -31,6 +31,30 @@
|
||||
dest: /etc/modules-load.d/vfio.conf
|
||||
content: "{{ pve_vfio_modules | join('\n') }}\n"
|
||||
mode: "0644"
|
||||
notify: update initramfs
|
||||
|
||||
# IDs auf dem Knoten lesen, nicht aus dem Gedächtnis: Grafik- und Audio-Funktion jeder Karte
|
||||
- name: NVIDIA-Funktionen des Knotens lesen
|
||||
ansible.builtin.shell: |
|
||||
set -o pipefail
|
||||
lspci -n -d 10de: | awk '{print $3}' | sort -u | paste -sd,
|
||||
args:
|
||||
executable: /bin/bash
|
||||
register: nvidia_ids
|
||||
changed_when: false
|
||||
failed_when: nvidia_ids.rc != 0 or nvidia_ids.stdout == ''
|
||||
|
||||
- name: Karten an vfio-pci binden, bevor ein Grafik- oder Audiotreiber zugreift
|
||||
ansible.builtin.copy:
|
||||
dest: /etc/modprobe.d/vfio.conf
|
||||
content: |
|
||||
options vfio-pci ids={{ nvidia_ids.stdout }}
|
||||
softdep nouveau pre: vfio-pci
|
||||
softdep nvidia pre: vfio-pci
|
||||
softdep nvidiafb pre: vfio-pci
|
||||
softdep snd_hda_intel pre: vfio-pci
|
||||
mode: "0644"
|
||||
notify: update initramfs
|
||||
|
||||
- name: NVIDIA-Treiber auf dem Host sperren (GPU gehört der VM)
|
||||
ansible.builtin.copy:
|
||||
@@ -40,31 +64,57 @@
|
||||
blacklist nvidia
|
||||
blacklist nvidiafb
|
||||
mode: "0644"
|
||||
notify: refresh boot
|
||||
notify: update initramfs
|
||||
|
||||
- name: ZFS-Pool tank vorhanden?
|
||||
ansible.builtin.command: zpool list -H -o name tank
|
||||
register: tank
|
||||
- name: Speicher local darf Snippets enthalten (clusterweite Einstellung, einmal)
|
||||
ansible.builtin.shell: |
|
||||
set -euo pipefail
|
||||
c=$(pvesh get /storage/local --output-format json | python3 -c 'import json,sys; print(json.load(sys.stdin)["content"])')
|
||||
case ",$c," in
|
||||
*,snippets,*) echo unverändert ;;
|
||||
*) pvesm set local --content "$c,snippets"; echo geändert ;;
|
||||
esac
|
||||
args:
|
||||
executable: /bin/bash
|
||||
register: snippets
|
||||
changed_when: "'geändert' in snippets.stdout"
|
||||
run_once: true
|
||||
|
||||
- name: Snippet-Verzeichnis
|
||||
ansible.builtin.file:
|
||||
path: "{{ pve_vendor_snippet | dirname }}"
|
||||
state: directory
|
||||
mode: "0755"
|
||||
|
||||
- name: cloud-init-Vendor-Daten für GPU-VMs (qemu-guest-agent meldet tofu die DHCP-Adresse)
|
||||
ansible.builtin.copy:
|
||||
dest: "{{ pve_vendor_snippet }}"
|
||||
content: |
|
||||
#cloud-config
|
||||
packages: [qemu-guest-agent]
|
||||
runcmd:
|
||||
- [systemctl, enable, --now, qemu-guest-agent]
|
||||
mode: "0644"
|
||||
|
||||
- name: Container auf diesem Knoten lesen
|
||||
ansible.builtin.command: ls /etc/pve/lxc/
|
||||
register: local_cts
|
||||
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'. Anlegen z. B.: zpool create -o ashift=12 tank mirror /dev/disk/by-id/<ssd2> /dev/disk/by-id/<ssd3> && pvesm add zfspool tank -pool tank"
|
||||
when: tank.rc != 0
|
||||
|
||||
- name: Bestehende Replikationsjobs lesen
|
||||
ansible.builtin.command: pvesr list
|
||||
register: pvesr_jobs
|
||||
changed_when: false
|
||||
|
||||
- name: ZFS-Replikation für Infra-Gäste
|
||||
- name: ZFS-Replikation für Infra-Gäste (erst wenn der Container auf diesem Knoten existiert)
|
||||
ansible.builtin.command: >
|
||||
pvesr create-local-job {{ item.value.vmid }}-0 {{ item.value.replicate_to }}
|
||||
--schedule '{{ knaster_pve.replication_schedule }}' --comment 'knaster {{ item.key }}'
|
||||
loop: "{{ knaster_pve.containers | dict2items }}"
|
||||
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.value.node == inventory_hostname
|
||||
- item.value.replicate_to is defined
|
||||
- (item.value.vmid | string) + '-0' not in pvesr_jobs.stdout
|
||||
- item.0.value.node == inventory_hostname
|
||||
- (item.0.value.vmid | string) + '.conf' in local_cts.stdout_lines
|
||||
- (item.0.value.vmid | string) + '-' + (idx | string) not in pvesr_jobs.stdout
|
||||
changed_when: true
|
||||
|
||||
Reference in New Issue
Block a user