¿Cómo imprimir una línea específica de un archivo basado en el UUID definido en la variable?

¿Cómo imprimir una línea específica de un archivo basado en el UUID definido en la variable?

Quería imprimir la línea específica /etc/fstabbasada en el UUID definido en una variable. Pero cuando intento con el siguiente código no obtengo los resultados adecuados.

Código:

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

Respuesta1

P:"Imprime la línea del archivo según el UUID definido en una variable".

R: Busque el archivo y seleccione la línea. Por ejemplo, declare la ruta para almacenar /etc/fstab en el controlador

  fstab_path: "/tmp/test/{{ inventory_hostname }}/fstab"

y buscar el archivo

    - fetch:
        src: /etc/fstab
        dest: "{{ fstab_path }}"
        flat: true

Dada la variable con el valor UUID

  uuid_disk: 01865fce-8bb9-48ad-a9eb-1ff43a8db4a5

buscar la línea

  uuid_line: "{{ lookup('file', fstab_path).splitlines()|
                 select('search', uuid_disk) }}"

da por ejemplo,

  uuid_line:
  - UUID=01865fce-8bb9-48ad-a9eb-1ff43a8db4a5 none swap sw 0 0

Ejemplo de un libro de jugadas completo para realizar pruebas.

- 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

La solución anterior imprime las líneas fstab de los UUID etiquetadosintercambio. (Así es como se obtiene el UUID). Viceversa, puede imprimir las particiones utilizadas comointercambioen fstab. Deja que exprese esa pregunta de otra manera

P:"Desde /etc/fstab obtenga el UUID de las particiones de intercambio. Luego, muestre las particiones".

R: Primero recopile los hechos y cree un UUID/partición de diccionario. Luego, analice /etc/fstab y obtenga el UUID de las entradas de intercambio. Obtenga las particiones de los UUID.

  1. Reúna los hechos
    - setup:
        gather_subset: devices

, obtener las particiones y crear el diccionario.UUID

  partitions: "{{ ansible_devices|
                  json_query('*.partitions')|
                  combine }}"
  uuid: "{{ dict(partitions|
                 dict2items|
                 selectattr('value.uuid')|
                 json_query('[].[value.uuid, key]')) }}"

da por ejemplo,

  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. Declare la ruta para almacenar /etc/fstab en el controlador
  fstab_path: "/tmp/test/{{ inventory_hostname }}/fstab"

y buscar el archivo

    - fetch:
        src: /etc/fstab
        dest: "{{ fstab_path }}"
        flat: true

Usa el filtrocomunidad.general.jcpara crear la lista de diccionariosfstab

  fstab: "{{ lookup('file', fstab_path)|
             community.general.jc('fstab') }}"

da por ejemplo,

  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

Obtenga los UUID de las entradas de intercambio

  uuid_swap: "{{ fstab|
                 selectattr('fs_vfstype', '==', 'swap')|
                 selectattr('fs_spec', 'match', 'UUID=')|
                 map(attribute='fs_spec')|
                 map('split', '=')|
                 map('last') }}"

da

  uuid_swap:
    - 01865fce-8bb9-48ad-a9eb-1ff43a8db4a5
  1. Obtenga las particiones de los UUID
  partition_swap: "{{ uuid_swap|map('extract', uuid) }}"

da

 partition_swap:
    - sdb4

Ejemplo de un libro de jugadas completo para realizar pruebas.

- 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

Respuesta2

Acerca de

¿Cómo imprimir la línea específica del archivo según el UUID definido en la variable?

Puedes echar un vistazo al siguiente libro de jugadas de ejemplo mínimo.

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

yPreguntas y respuestas similaresacerca de

información relacionada