Найдите файлы в al oop и удалите их - PullRequest
3 голосов
/ 14 июля 2020

Я хочу удалить файл в подкаталоге определенного формата. Однако я получаю сообщение об ошибке

'объект dict' не имеет атрибута 'files'.

Ниже мой код. Шаблон файла будет выглядеть следующим образом: file_name.file_extension.processID.YYYY-MM-DD@HH:MM:SS~

Мои переменные

fileToFindInAllSubDirecotry
  - "home/usr/file1"
  - "home/usr/file2"
  - "home/usr/file3/file4"
  - "home/usr/file5"

Моя роль в пьесе

- name: Find file
  find:
    paths: "{{ item }}"
    use_regex: yes
    patterns:
      - '.*\.\d+\.\d{4}-\d{2}-\d{2}@\d{2}:\d{2}:\d{2}~$'
    age: 1d
    recurse: yes
  register: fileToDelete
  loop: "{{ fileToFindInAllSubDirecotry }}"
  
- name: Delete file
  file:
    path: "{{ item.path }}"
    state: absent
  loop: "{{ fileToDelete.files }}"

Это пример файла и каталога

home
   |-------usr
             |-------file1
                         |-------configFile.xml
             |-------file2
                         |-------propertiesFile.txt.2012.2020-07-13@23:08:10~
             |-------file3
                         |-------file4
                                     |-------content.yml.2012.2020-04-04@23:08:10~                       
             |-------file5
                         |-------configFile.xml.2012.2020-03-05@13:08:10~

1 Ответ

1 голос
/ 15 июля 2020

Это происходит потому, что вы заполняете find с помощью al oop, поэтому вы получите результат, который будет в словаре со списком или results.

Что-то вроде:

ok: [localhost] => {
    "msg": {
        "changed": false,
        "msg": "All items completed",
        "results": [
            {
                ...
                "files": [ ... ],
                ...
                "item": "/home/usr/file1",
                ...
            },
            {
                ...
                "files": [ ... ],
                ...
                "item": "/home/usr/file2",
                ...
            },
            ...
        ]
    }
}

Есть два способа исправить это:

  1. Самый лучший, потому что, как указано в документации, paths Параметр модуля find может принимать списки путей, просто передайте ему все свои fileToFindInAllSubDirecotry переменные вместо использования al oop, таким образом ваше удаление работает как есть:

    - name: Find file
      find:
        paths: "{{ fileToFindInAllSubDirecotry }}"
        use_regex: yes
        patterns:
          - '.*\.\d+\.\d{4}-\d{2}-\d{2}@\d{2}:\d{2}:\d{2}~$'
        age: 1d
        recurse: yes
      register: fileToDelete
    
    - name: Delete file
      file:
        path: "{{ item.path }}"
        state: absent
      loop: "{{ fileToDelete.files }}"
    
  2. Используйте json_query, чтобы получить result[*].files, затем flatten результирующий список списка

    - name: Find file
      find:
        paths: "{{ item }}"
        use_regex: yes
        patterns:
          - '.*\.\d+\.\d{4}-\d{2}-\d{2}@\d{2}:\d{2}:\d{2}~$'
        age: 1d
        recurse: yes
      register: fileToDelete
      loop: "{{ fileToFindInAllSubDirecotry }}"
    
    - name: Delete file
      file:
        path: "{{ item.path }}"
        state: absent
      loop: "{{ fileToDelete | json_query('results[*].files') | flatten }}"
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...