Wie drucke ich eine bestimmte Zeile aus einer Datei basierend auf der in der Variablen definierten UUID?

Wie drucke ich eine bestimmte Zeile aus einer Datei basierend auf der in der Variablen definierten UUID?

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).

  1. 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
  1. 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
  1. 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

verwandte Informationen