Aquí está mi libro de jugadas donde trato de encontrar test-juli.jar en el directorio /app; sin embargo, deseo excluir la carpeta /app/Patchbackup de la búsqueda.

A continuación se muestra mi libro de jugadas para lo mismo:

  tasks:

    - name: Find test home directories under /app
      find:
        paths: /app
        file_type: any
        recurse: yes
        depth: 4
        patterns: 'test-juli.jar'
        excludes: 'log,tmp,.installation,Patchbackup'
      tags: always
      register: tomjarfound

    - debug:
        msg: "ALL LISTED REFINED JARS: {{ item.path }}"
      loop: "{{ tomjarfound.files }}"

Cuando ejecuto lo anterior, esperaba que find no se encontrara debajo de /app/Patchbackup, pero el resultado muestra que lo hace a pesar de estar excluido.

Aquí está la salida:

TASK [debug] ***********************************************************************************************************************************************************
ok: [10.0.0.11] => (item=/app/apache-test-9.0.10/bin/test-juli.jar) => {
    "msg": "ALL LISTED REFINED JARS: /app/apache-test-9.0.10/bin/test-juli.jar"
}
ok: [10.0.0.11] => (item=/app/Patchbackup/app/apache-test-9.0.10/bin/test-juli.jar) => {
    "msg": "ALL LISTED REFINED JARS: /app/Patchbackup/app/apache-test-9.0.10/bin/test-juli.jar"
}

¿Puede sugerir cómo puedo excluir la carpeta /app/Patchbackup de la búsqueda de ansible?

2
Ashar 25 ago. 2020 a las 15:23

3 respuestas

La mejor respuesta

Como se dio cuenta, el módulo find no le proporciona una opción para comenzar con el directorio raíz de /app pero excluye uno de sus directorios. Tienes pocas opciones:

  1. si los directorios debajo de /app no son muchos, puede usar la cláusula paths para proporcionar una lista de ellos (excluyendo los Patchbackup no deseados)
  2. recupere todos los resultados en / app y luego filtre los de /app/Patchbackup que no desee. aquí hay un ejemplo de cómo filtrarlos:

Código:

  - set_fact:
      my_results_final: "{{ my_results_final | default([]) + [item] }}"
    when: item is not regex('^/app/Patchbackup(.+)')
    with_items:
    - "{{ tomjarfound.files }}"


  - debug:
      var: my_results_final
1
ilias-sp 25 ago. 2020 a las 13:49

El parámetro find del módulo excludes de Ansible opera en nombres base de archivos. Según la documentación:

excluye : uno o más patrones (shell o regex), cuyo tipo está controlado por la opción use_regex. Los elementos cuyos nombres base coinciden con un patrón de exclusión se seleccionan de coincidencias de patrones. Se pueden especificar varios patrones usando una lista.

En su caso, ignora correctamente /app/Patchbackup/ porque su nombre base es Patchbackup, pero también incluye correctamente /app/Patchbackup/app/apache-test-9.0.10/bin/test-juli.jar porque su nombre base es test-juli.jar.

0
hedgie 25 ago. 2020 a las 14:31

Podría decirse que el módulo find está roto. El parámetro excludes se aplica solo a los elementos del conjunto de resultados final, y no a los directorios intermedios.

Es decir, si tiene una estructura de directorio como esta:

toplevel/
  foo/
    testfile1.txt
  bar/
    testfile2.txt

Y desde el padre del directorio toplevel, ejecuta una tarea como esta:

- find:
    paths: toplevel
    recurse: true
    excludes: foo
  register: results

Su conjunto de resultados se verá así:

  • toplevel/bar/testfile2.txt
  • toplevel/foo/testfile1.txt

Compare eso con la configuración file_type: any, así:

- find:
    paths: toplevel
    file_type: any
    recurse: true
    excludes: foo
  register: results

En este caso, el conjunto de resultados se verá así:

- `toplevel/bar`
- `toplevel/bar/testfile2.txt`
- `toplevel/foo/testfile1.txt`

Tenga en cuenta que toplevel/bar está incluido en los resultados, pero toplevel/foo está excluido. Eso es porque:

  • Configuramos file_type: any, lo que significa que queremos encontrar directorios además de archivos.
  • Esto hace que toplevel/foo forme parte del conjunto de resultados.
  • Estamos excluyendo de los resultados todo lo que tenga el nombre de base foo

Obtendrá un comportamiento más flexible si simplemente usa el comando find:

- name: exclude an intermediate directory with find command
  command: >-
    find toplevel -name foo -prune -o -type f -print
  register: result

Que devolverá los siguientes artículos:

  • toplevel/bar/testfile2.txt

He puesto una versión ejecutable del anterior en github.

1
larsks 25 ago. 2020 a las 13:30