Ich wollte die bestimmte Zeile basierend auf der in einer Variablen definierten UUID drucken /etc/fstab
. Aber wenn ich es mit dem folgenden Code versuche, werden keine richtigen Ergebnisse erzielt.
Code:
---
- name: check
hosts: all
become: true
tasks:
- name: set fact for uuid
set_fact:
uuid_disk: "{{ item.value.links.uuids }}"
loop: "{{ ansible_devices | dict2items }}"
when: ('swap' in (item.value.links.labels))
- name: print
debug:
msg: "{{ uuid_disk | join() }}"
- name: fstab
slurp:
src: /etc/fstab
register: output
- name: print
debug:
msg: "{{ item | select('match','UUID') | list }}"
loop: "{{ (output.content | b64decode).splitlines() }}"
- name: print
debug:
msg: "{{ item }}"
loop: "{{ (output.content | b64decode).splitlines() }}"
when: (item | regex_search('^UUID')) in uuid_disk
Antwort1
Q:"Drucken Sie die Zeile aus der Datei basierend auf der in einer Variablen definierten UUID."
A: Rufen Sie die Datei ab und wählen Sie die Zeile aus. Geben Sie beispielsweise den Pfad an, in dem /etc/fstab auf dem Controller gespeichert werden soll.
fstab_path: "/tmp/test/{{ inventory_hostname }}/fstab"
und holen Sie die Datei
- fetch:
src: /etc/fstab
dest: "{{ fstab_path }}"
flat: true
Gegeben sei die Variable mit dem UUID-Wert
uuid_disk: 01865fce-8bb9-48ad-a9eb-1ff43a8db4a5
Suche die Zeile
uuid_line: "{{ lookup('file', fstab_path).splitlines()|
select('search', uuid_disk) }}"
gibt zum Beispiel
uuid_line:
- UUID=01865fce-8bb9-48ad-a9eb-1ff43a8db4a5 none swap sw 0 0
Beispiel eines vollständigen Playbooks zum Testen
- hosts: all
vars:
uuid_disk: 01865fce-8bb9-48ad-a9eb-1ff43a8db4a5
fstab_path: "/tmp/test/{{ inventory_hostname }}/fstab"
uuid_line: "{{ lookup('file', fstab_path).splitlines()|
select('search', uuid_disk) }}"
tasks:
- fetch:
src: /etc/fstab
dest: "{{ fstab_path }}"
flat: true
- debug:
var: uuid_line
Die obige Lösung druckt die fstab-Zeilen der UUID(s) mit der Bezeichnungtauschen. (So erhalten Sie die UUID.) Umgekehrt können Sie die verwendeten Partitionen ausdrucken alstauschenin fstab. Lassen Sie mich die Frage anders formulieren
Q:"Holen Sie sich aus /etc/fstab die UUID der Swap-Partition(en). Zeigen Sie dann die Partition(en) an."
A: Sammeln Sie zunächst die Fakten und erstellen Sie ein Wörterbuch mit UUID/Partition. Analysieren Sie dann /etc/fstab und ermitteln Sie die UUID der Swap-Einträge. Ermitteln Sie die Partition(en) der UUID(s).
- Sammeln Sie die Fakten
- setup:
gather_subset: devices
, holen Sie sich die Partitionen und erstellen Sie das WörterbuchUUID
partitions: "{{ ansible_devices|
json_query('*.partitions')|
combine }}"
uuid: "{{ dict(partitions|
dict2items|
selectattr('value.uuid')|
json_query('[].[value.uuid, key]')) }}"
gibt zum Beispiel
uuid:
01865fce-8bb9-48ad-a9eb-1ff43a8db4a5: sdb4
04dc9170-bdbc-4a22-abaf-b9e3cf1ba969: sda5
7074BA0A74B9D2D8: sda2
9a2199dd-0662-47b4-a957-adbcf5d350f4: sdb5
EC808480808452CE: sda1
F86C-A380: sdb2
c484594d-fd2e-4f57-9c14-74b8e397d8ed: sdb3
- Geben Sie den Pfad zum Speichern von /etc/fstab auf dem Controller an.
fstab_path: "/tmp/test/{{ inventory_hostname }}/fstab"
und holen Sie die Datei
- fetch:
src: /etc/fstab
dest: "{{ fstab_path }}"
flat: true
Verwenden Sie den Filtergemeinschaft.general.jcum die Liste der Wörterbücher zu erstellenfstab
fstab: "{{ lookup('file', fstab_path)|
community.general.jc('fstab') }}"
gibt zum Beispiel
fstab:
- fs_file: /
fs_freq: 0
fs_mntops: errors=remount-ro
fs_passno: 1
fs_spec: UUID=c484594d-fd2e-4f57-9c14-74b8e397d8ed
fs_vfstype: ext4
- fs_file: /boot/efi
fs_freq: 0
fs_mntops: umask=0077
fs_passno: 1
fs_spec: UUID=F86C-A380
fs_vfstype: vfat
- fs_file: /export
fs_freq: 0
fs_mntops: defaults
fs_passno: 2
fs_spec: UUID=9a2199dd-0662-47b4-a957-adbcf5d350f4
fs_vfstype: ext4
- fs_file: none
fs_freq: 0
fs_mntops: sw
fs_passno: 0
fs_spec: UUID=01865fce-8bb9-48ad-a9eb-1ff43a8db4a5
fs_vfstype: swap
- fs_file: none
fs_freq: 0
fs_mntops: sw
fs_passno: 0
fs_spec: /usr/swap0
fs_vfstype: swap
Holen Sie sich die UUID(s) der Swap-Einträge
uuid_swap: "{{ fstab|
selectattr('fs_vfstype', '==', 'swap')|
selectattr('fs_spec', 'match', 'UUID=')|
map(attribute='fs_spec')|
map('split', '=')|
map('last') }}"
gibt
uuid_swap:
- 01865fce-8bb9-48ad-a9eb-1ff43a8db4a5
- Holen Sie sich die Partition(en) der UUID(s)
partition_swap: "{{ uuid_swap|map('extract', uuid) }}"
gibt
partition_swap:
- sdb4
Beispiel eines vollständigen Playbooks zum Testen
- hosts: all
vars:
partitions: "{{ ansible_devices|
json_query('*.partitions')|
combine }}"
uuid: "{{ dict(partitions|
dict2items|
selectattr('value.uuid')|
json_query('[].[value.uuid, key]')) }}"
fstab_path: "/tmp/test/{{ inventory_hostname }}/fstab"
fstab: "{{ lookup('file', fstab_path)|
community.general.jc('fstab') }}"
uuid_swap: "{{ fstab|
selectattr('fs_vfstype', '==', 'swap')|
selectattr('fs_spec', 'match', 'UUID=')|
map(attribute='fs_spec')|
map('split', '=')|
map('last') }}"
partition_swap: "{{ uuid_swap|map('extract', uuid) }}"
tasks:
- setup:
gather_subset: devices
- debug:
var: uuid
- fetch:
src: /etc/fstab
dest: "{{ fstab_path }}"
flat: true
- debug:
var: fstab
- debug:
var: uuid_swap
- debug:
var: partition_swap
Antwort2
Hinsichtlich
Wie drucke ich die bestimmte Zeile aus einer Datei basierend auf der in der Variablen definierten UUID?
Sie können einen Blick in das folgende minimale Beispiel-Playbook werfen
---
- hosts: localhost
become: false
gather_facts: false
vars:
uuid_disk: 12345678-abcd-efgh-ijkl-123456789012
tasks:
- name: fstab
slurp:
src: /etc/fstab
register: output
- name: Print UUID, if there is any
debug:
msg: "{{ item | regex_search('[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}') }}"
loop: "{{ (output.content | b64decode).splitlines() }}"
- name: Print line where UUID match
debug:
msg: "{{ item }}"
loop: "{{ (output.content | b64decode).splitlines() }}"
when: uuid_disk in item
UndÄhnliche Fragen und Antwortenum