Búsqueda ansible de nombres de directorios principales de archivos

Búsqueda ansible de nombres de directorios principales de archivos

Estoy intentando obtener el directorio principal. Nombre de los archivos identificados por un patrón.

base/tool1/sub/test.log
base/tool2/abc/values.log
base/tool3/sub/test.log

Quiero obtener la ruta absoluta de cada directorio, donde se encuentra test.log. así base/tool1/sub/serían base/tool3/sub/las coincidencias que quiero obtener como resultado.

- name: "Loop-Playbook"
  hosts: all
  tasks:

  - name: "Filter File Matches"
    find:
      paths: "/base"
      file_type: "file"
      recurse: "yes"
      patterns: "*test.log"
    register: files_matched

  - name: "Debug files_matched full"
    debug:
var: files_matched.files

  - name: "Debug files_matched items"
    debug:
      var: item.path | dirname 
    loop: "{{ files_matched.files| flatten(levels=1) }}"
    loop_control:
      label: "{{ item.path }}"

Supongo que necesito usar algo como {{ item.path | dirname }}pero, para ser honesto, no tengo idea de DÓNDE tengo que definir esto.

alguien me puede ayudar?

Respuesta1

mapa() en JinjaPuede extraer atributos o aplicar un filtro a una secuencia. Utilice ambos para transformar los resultados de la búsqueda en una cadena de filtros.

---
- name: "basename of find results"
  hosts: localhost
  gather_facts: False

  vars:
    testfiles:
    - base/tool1/sub/test.log
    - base/tool2/abc/values.log
    - base/tool3/sub/test.log

  tasks:
  - name: "Set up test case"
    block:

    - tempfile:
        state: directory
      register: mktemp

    - file:
        path: "{{ ( mktemp.path ~ '/' ~ item ) | dirname }}"
        state: directory
      loop: "{{ testfiles }}"

    - file:
        path: "{{ mktemp.path ~ '/' ~ item }}"
        state: touch
      loop: "{{ testfiles }}"


  - name: "Filter File Matches"
    find:
      paths: "{{ mktemp.path }}"
      file_type: "file"
      recurse: "yes"
      # patterns is already matched against basename
      # Do not use a wildcard in front, so only "test.log" matches
      patterns: "test.log"
    register: files_matched

  - name: "Debug files_matched full"
    debug:
       var: files_matched.files
       verbosity: 1

  - name: "Directories found"
    debug:
      msg: "{{ testdirnames }}"
    vars:
      # map to extract an attribute
      # map to apply a filter
      # (it can do either)
      # list filter to consume any generator object returned by Jinja
      testdirnames: "{{ files_matched.files | map(attribute='path') | map('dirname') | list }}"

Producción:

$ ansible-playbook sf1073762.yml

PLAY [basename of find results] **************************************************************************************

TASK [tempfile] ******************************************************************************************************
changed: [localhost]

TASK [file] **********************************************************************************************************
changed: [localhost] => (item=base/tool1/sub/test.log)
changed: [localhost] => (item=base/tool2/abc/values.log)
changed: [localhost] => (item=base/tool3/sub/test.log)

TASK [file] **********************************************************************************************************
changed: [localhost] => (item=base/tool1/sub/test.log)
changed: [localhost] => (item=base/tool2/abc/values.log)
changed: [localhost] => (item=base/tool3/sub/test.log)

TASK [Filter File Matches] *******************************************************************************************
ok: [localhost]

TASK [Debug files_matched full] **************************************************************************************
skipping: [localhost]

TASK [Directories found] *****************************************************************************************************
ok: [localhost] => {
    "msg": [
        "/tmp/ansible.Nc0b6i/base/tool1/sub",
        "/tmp/ansible.Nc0b6i/base/tool3/sub"
    ]
}

información relacionada