найти последний файл, который был изменен в последнюю минуту в ansible? - PullRequest
2 голосов
/ 04 октября 2019

У меня есть список файлов в определенном каталоге, как показано ниже:

david@host:~/jobs/process/workspace/files$ ls -lrth
total 68K
-rw-r--r-- 1 david david 7.8K Oct  1 11:10 golden_proc.init.1569953435497
-rw-r--r-- 1 david david 7.7K Oct  2 12:11 golden_proc.init.1570043494149
-rw-r--r-- 1 david david 7.7K Oct  2 20:15 golden_proc.init.1570072510929

Каждое имя файла заканчивается отметкой времени в нем. Теперь мне нужно найти один последний файл, который был изменен или создан всего минуту назад в ansible.

  • Если такого файла нет, тогда успешно вернитесь из файла с записью «невозможно найти файл», если это возможно.
  • Если есть файл такого типазатем скопируйте этот файл в папку "/ tmp".
  • Если за последнюю минуту было создано или изменено несколько файлов, используйте самый последний.

Возможно ли это сделать ванзибль? Я видел, что есть модуль поиска в ansible, но не уверен, как я могу заставить вышеуказанные вещи работать, используя этот модуль?

---
- name: Play 1
  hosts: 127.0.0.1
  tasks:
      - name: find the latest file
        find: paths=/var/lib/jobs/workspace/process/files
              file_type=file
              age=-{{ time_window }}m
              age_stamp=mtime
        register: files

1 Ответ

2 голосов
/ 05 октября 2019

Это определенно что-то возможно, вы даже близко от решения.

Как вы, возможно, уже видели, что он делает debug из ваших find, возвращаемое значение содержит список files, этот список будет пустым, если у вас нет файла.

Так что довольно просто увидеть, когда список пуст с Jinja

- debug:
    msg: '{{ files.files if files.files|count > 0 else "cannot find any file" }}'

Этот синтаксис использует inline if, а также count filter .

Что касается того, что вы хотите самый последний файл сейчас, вы также можете использовать набор файлов Jinja: filter sort поможет вам отсортироватьфайлы по времени модификации, а фильтр first поможет вам получить только первый элемент вашего списка.

- debug:
    msg: '{{ (files.files | sort(attribute="mtime", reverse=true) | first).path }}'

Теперь вам просто нужно объединить оба в одном длинном Jinjaвыражение:

- debug:
    msg: '{{ (files.files | sort(attribute="mtime", reverse=true) | first).path if files.files|count > 0 else "cannot find any file" }}'

Чтобы скопировать файл, вам понадобится один дополнительный фильтр Jinja, специфичный для Ansible и равный basename, чтобы получить имяфайл вне его полного пути

- debug:
    msg: '{{ (files.files | sort(attribute="mtime", reverse=true) | first).path | basename if files.files|count > 0 else "cannot find any file" }}'

Но вам также понадобятся операторы wheno ваша копия будет пропущена, если не найден соответствующий файл:

- name: Copy file, if found                 
  copy:
    src: '{{ (files.files | sort(attribute="mtime", reverse=true) | first).path }}'
    dest: '/tmp/{{ (files.files | sort(attribute="mtime", reverse=true) | first).path | basename }}'
  when: files.files|count > 0

Полная рабочая тетрадь для тестирования:

---
- hosts: localhost
  connection: locale

  vars:
    var_files:
      - { 'name': 'a', 'time': 86400 }
      - { 'name': 'b', 'time': 30 }
      - { 'name': 'c', 'time': 20 }

  tasks:
    - name: creating a bunch of matching files
      file:
        path: '/data/{{ item.name }}'
        state: touch
      with_items: '{{ var_files }}'

    - name: aging those files
      file:
        path: '/data/{{ item.name }}'
        modification_time: '{{ "%Y%m%d%H%M.%S" | strftime( ( ansible_date_time.epoch | int ) - item.time ) }}'
      with_items: '{{ var_files }}'

    - name: find the latest file
      find: paths=/data
        file_type=file
        age=-1m
        age_stamp=mtime
      register: files

    - debug:
        msg: '{{ (files.files | sort(attribute="mtime", reverse=true) | first).path if files.files|count > 0 else "cannot find any file" }}'

    - name: Copy file, if found
      copy:
        src: '{{ (files.files | sort(attribute="mtime", reverse=true) | first).path }}'
        dest: '/tmp/{{ (files.files | sort(attribute="mtime", reverse=true) | first).path | basename }}'
      when: files.files|count > 0

    - name: removing files to test the behaviour with no matching files
      file:
        path: '/data/{{ item.name }}'
        state: absent
      with_items: '{{ var_files }}'

    - name: find the latest file
      find: paths=/data
        file_type=file
        age=-1m
        age_stamp=mtime
      register: files

    - debug:
        msg: '{{ (files.files | sort(attribute="mtime", reverse=true) | first).path if files.files|count > 0 else "cannot find any file" }}'    

    - name: Copy file, if found                 
      copy:
        src: '{{ (files.files | sort(attribute="mtime", reverse=true) | first).path }}'
        dest: '/tmp/{{ (files.files | sort(attribute="mtime", reverse=true) | first).path | basename }}'
      when: files.files|count > 0

и соответствующий вывод этой пьесы

PLAY [localhost] ********************************************************************************************************************************

TASK [Gathering Facts] **************************************************************************************************************************
ok: [localhost]

TASK [creating a bunch of matching files] *******************************************************************************************************
changed: [localhost] => (item={'name': 'a', 'time': 86400})
changed: [localhost] => (item={'name': 'b', 'time': 30})
changed: [localhost] => (item={'name': 'c', 'time': 20})

TASK [aging those files] ************************************************************************************************************************
changed: [localhost] => (item={'name': 'a', 'time': 86400})
changed: [localhost] => (item={'name': 'b', 'time': 30})
changed: [localhost] => (item={'name': 'c', 'time': 20})

TASK [find the latest file] *********************************************************************************************************************
ok: [localhost]

TASK [debug] ************************************************************************************************************************************
ok: [localhost] => {
    "msg": "/data/c"
}

TASK [Copy file, if found] **********************************************************************************************************************
changed: [localhost]

TASK [removing files to test the behaviour with no matching files] ******************************************************************************
changed: [localhost] => (item={'name': 'a', 'time': 86400})
changed: [localhost] => (item={'name': 'b', 'time': 30})
changed: [localhost] => (item={'name': 'c', 'time': 20})

TASK [find the latest file] *********************************************************************************************************************
ok: [localhost]

TASK [debug] ************************************************************************************************************************************
ok: [localhost] => {
    "msg": "cannot find any file"
}

TASK [Copy file, if found] **********************************************************************************************************************
skipping: [localhost]

PLAY RECAP **************************************************************************************************************************************
localhost                  : ok=9    changed=4    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...