githubixx.iscsi_target
ansible-role-iscsi_target
Diese Rolle konfiguriert ein auf Linux-LIO basierendes iSCSI-Ziel auf einem Linux-Host mithilfe von targetcli
. Zusätzlich enthält diese Rolle Python-Module, die mit dem targetcli
-Befehl interagieren können, die auch separat für fortgeschrittene Aufgaben verwendet werden können. Die Module ermöglichen das Überprüfen, Erstellen und Löschen.
Getestet mit:
- Ubuntu 20.04
- Ubuntu 22.04
- Archlinux
Dokumentation über LIO und Targets finden Sie hier.
Anforderungen
Diese Rolle erstellt keine Festplatten/Partitionen/LVs. Es wird erwartet, dass sie bereits auf dem Rechner vorhanden sind oder von einer anderen Rolle erstellt wurden. Zum Beispiel: githubixx.lvm.
Änderungsprotokoll
siehe CHANGELOG
Rollen-Variablen
# Die iSCSI-Ziel(e) werden über die verschachtelte Variable "iscsi_targets" konfiguriert.
# Ein sehr minimalistisches Setup sieht so aus:
#
# iscsi_targets:
# - name: "iqn.2021-11.blog.tauceti:{{ ansible_facts['nodename'] }}"
# disks:
# - name: lun_node1
# path: /dev/vdb
# type: block
# lunid: 0
# initiators:
# - name: iqn.2021-07.blog.tauceti:node1
# authentication:
# userid: node1user
# password: node1pw
# userid_mutual: node1sharedkey
# password_mutual: node1sharedsecret
# mapped_luns:
# - mapped_lunid: 0
# lunid: 0
# portals:
# - ip: "0.0.0.0"
#
# Weitere Informationen finden Sie in der README.
iscsi_targets: []
Die obige Konfiguration erstellt ein iSCSI-Setup, das so aussieht (Ausgabe generiert mit targetcli 'ls'
):
# o- / .................................................................................... [...]
# o- backstores ......................................................................... [...]
# | o- block ............................................................. [Speicherobjekte: 1]
# | | o- lun_node1 ................................... [/dev/vdb (1.0GiB) Schreib-Cache aktiviert]
# | | o- alua .............................................................. [ALUA-Gruppen: 1]
# | | o- default_tg_pt_gp .................................. [ALUA-Zustand: Aktiv/optimiert]
# | o- fileio ............................................................ [Speicherobjekte: 0]
# | o- pscsi ............................................................. [Speicherobjekte: 0]
# | o- ramdisk ........................................................... [Speicherobjekte: 0]
# o- iscsi ....................................................................... [Ziele: 1]
# | o- iqn.2021-11.blog.tauceti:ubuntu .............................................. [TPGs: 1]
# | o- tpg1 .......................................................... [keine-gen-acls, keine-auth]
# | o- acls ..................................................................... [ACLs: 1]
# | | o- iqn.2021-07.blog.tauceti:node1 .................................. [Zugeordnete LUNs: 1]
# | | o- mapped_lun0 ........................................ [lun0 block/lun_node1 (rw)]
# | o- luns ..................................................................... [LUNs: 1]
# | | o- lun0 ............................. [block/lun_node1 (/dev/vdb) (default_tg_pt_gp)]
# | o- portals ............................................................... [Portale: 1]
# | o- 0.0.0.0:3260 ................................................................ [OK]
# o- loopback .................................................................... [Ziele: 0]
# o- vhost ....................................................................... [Ziele: 0]
# o- xen-pvscsi .................................................................. [Ziele: 0]
iscsi_targets.name
gibt den Namen des iSCSI-Ziels an (sozusagen der iSCSI-Server). Wie oben zu sehen, wird dieser Eintrag unter dem iscsi
-Knoten in der targetcli
-Ausgabe angezeigt.
disks
erstellt ein oder mehrere Blockspeicherobjekte. In diesem Fall wird es lun_node1
heißen, und die LUN-ID wird 0
sein. Der Speichertyp wird ein Blockgerät sein, das sich in diesem Fall unter /dev/vdb
befindet. Dieses Gerät kann (und sollte vielleicht sogar) auch ein logisches Volume sein.
initiators
definiert alle iSCSI-Initiatoren (die iSCSI-Clients), die auf das oben angegebene iSCSI-Ziel zugreifen möchten. Jeder iSCSI-Initiator-Host (Client), der eine Verbindung zum iSCSI-Ziel (Server) herstellen möchte, benötigt hier einen Eintrag. Der iSCSI-Initiatorname kann normalerweise in /etc/iscsi/initiatorname.iscsi
auf jedem Initiator (Client) gefunden werden, nachdem das open-iscsi
-Paket installiert wurde. Das authentication
-Objekt enthält entweder nur userid
und password
und optional auch userid_mutual
sowie password_mutual
.
mapped_luns
weist die zugeordnete LUN (logische Einheiten) dem Initiator zu. Normalerweise stimmen mapped_lunid
und lunid
mit der gleichen lunid
in iscsi_targets.disks
überein. Es könnte aber auch unterschiedlich sein.
portals
ermöglicht es, die IP-Adresse anzugeben, auf der der iSCSI-Zieldienst hören soll. Wenn z.B. 0.0.0.0
angegeben ist, hört der Dienst auf allen Schnittstellen am Port 3260
. Natürlich können auch Ansible-Fakten verwendet werden, z.B. {{ ansible_default_ipv4.address | default(ansible_all_ipv4_addresses[0]) }}
.
#######################################
# Einstellungen nur für Archlinux relevant
#######################################
# Das Paket "targetcli-fb" ist erforderlich, um das iSCSI-Ziel zu konfigurieren. Für Archlinux
# muss dieses Paket aus dem AUR installiert werden. Dies erfordert einen AUR-Install
# Helfer wie "yay", "paru", "pacaur", "trizen" oder "pikaur". Wenn ein solcher Helfer
# bereits auf dem Zielrechner installiert ist, besteht keine Notwendigkeit, ihn
# über diese Rolle zu installieren. In diesem Fall muss "iscsi_archlinux_aur_helper"
# auf "" (leerer String) gesetzt werden, und diese Rolle überspringt die Installation eines AUR-Helfers.
# Die Installationsaufgabe wählt einen der oben genannten AUR-Helfer (in dieser Reihenfolge)
# aus, um die iSCSI-Pakete zu installieren.
iscsi_archlinux_aur_helper: yay
# Während Ansible erwartet, dass als root über SSH zugegriffen wird, erlauben
# makepkg oder AUR-Helfer es nicht, Operationen als root auszuführen,
# sie scheitern mit "Sie können diese Operation nicht als root ausführen".
# Es wird daher empfohlen, einen Benutzer zu haben, der kein root ist,
# aber kein Passwort benötigt. Wenn die Variable "iscsi_archlinux_aur_helper"
# gesetzt ist, wird davon ausgegangen, dass der AUR-Helfer-Benutzer noch nicht existiert,
# daher wird er erstellt. Der Benutzer wird Teil der Gruppe "wheel" sein.
iscsi_archlinux_aur_helper_user: aur_builder
Abhängigkeiten
Für Archlinux wird die Ansible-Sammlung kewlfft.aur verwendet, um 1) einen AUR-Helfer wie yay zu installieren und 2) das Dienstprogramm targetcli aus dem Archlinux User Repository zu installieren.
Beispiel-Playbook
- hosts: your-host
become: true
gather_facts: true
roles:
- githubixx.iscsi_target
vars:
iscsi_targets:
- name: "iqn.2021-11.blog.tauceti:{{ ansible_facts['nodename'] }}"
disks:
- name: lun_node1
path: /dev/vdb
type: block
lunid: 0
initiators:
- name: iqn.2021-07.blog.tauceti:node1
authentication:
userid: node1user
password: node1pw
userid_mutual: node1sharedkey
password_mutual: node1sharedsecret
mapped_luns:
- mapped_lunid: 0
lunid: 0
portals:
- ip: "0.0.0.0"
Testen
Diese Rolle hat ein kleines Test-Setup, das mit Molecule, libvirt (vagrant-libvirt) und QEMU/KVM erstellt wurde. Bitte sehen Sie meinen Blogbeitrag Testing Ansible roles with Molecule, libvirt (vagrant-libvirt) and QEMU/KVM, wie man es einrichtet. Die Testkonfiguration befindet sich hier.
Anschließend kann Molecule ausgeführt werden:
molecule converge
Dies richtet einige virtuelle Maschinen (VM) mit verschiedenen unterstützten Linux-Betriebssystemen ein und installiert die iscsi_target
-Rolle.
Um einige Tests durchzuführen:
molecule verify
Um aufzuräumen, führen Sie aus:
molecule destroy
Lizenz
MIT/BSD
Autorinformationen
Ursprünglicher Autor: Ondrej Famera ansible.targetcli
Zusätzlicher Autor: Ricardo Sanchez ansible-role-iscsi_target
Zusätzlicher Autor (diese Rollen-Version): https://www.tauceti.blog
ansible-galaxy install githubixx.iscsi_target