Como imprimir uma linha específica do arquivo com base no UUID definido na variável?

Como imprimir uma linha específica do arquivo com base no UUID definido na variável?

Eu queria imprimir a linha específica com /etc/fstabbase no UUID definido em uma variável. Mas quando estou tentando com o código abaixo, não estou dando resultados adequados.

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

Responder1

P:"Imprime a linha do arquivo com base no UUID definido em uma variável."

R: Busque o arquivo e selecione a linha. Por exemplo, declare o caminho para armazenar /etc/fstab no controlador

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

e busque o arquivo

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

Dada a variável com o valor UUID

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

procure a linha

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

dá por exemplo,

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

Exemplo de um manual completo para teste

- 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

A solução acima imprime as linhas fstab de UUID(s) rotuladastrocar. (É assim que você obtém o UUID.) Vice-versa, você pode imprimir as partições usadas comotrocarem fstab. Deixe-me refazer a pergunta

P:"Em /etc/fstab, obtenha o UUID da(s) partição(ões) swap. Em seguida, exiba a(s) partição(ões)."

R: Primeiro reúna os fatos e crie um UUID/partição de dicionário. Em seguida, analise /etc/fstab e obtenha o UUID das entradas de troca. Obtenha as partições do(s) UUID(s).

  1. Reúna os fatos
    - setup:
        gather_subset: devices

, obtenha as partições e crie o dicionáriouuid

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

dá por exemplo,

  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 o caminho para armazenar /etc/fstab no controlador
  fstab_path: "/tmp/test/{{ inventory_hostname }}/fstab"

e busque o arquivo

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

Use o filtrocomunidade.geral.jcpara criar a lista de dicionáriosfstab

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

dá por exemplo,

  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

Obtenha o(s) UUID(s) das entradas de troca

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

  uuid_swap:
    - 01865fce-8bb9-48ad-a9eb-1ff43a8db4a5
  1. Obtenha a(s) partição(ões) do(s) UUID(s)
  partition_swap: "{{ uuid_swap|map('extract', uuid) }}"

 partition_swap:
    - sdb4

Exemplo de um manual completo para teste

- 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

Responder2

A respeito de

Como imprimir a linha específica do arquivo com base no UUID definido na variável?

você pode dar uma olhada no seguinte manual de exemplo 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

ePerguntas e respostas semelhantessobre

informação relacionada