Как я могу пройтись по файлам в директории и переместить только уникальные файлы, используя Ansible?

Вопрос или проблема

Я пытаюсь пройтись по всем файлам в директории, эти файлы названы по-разному, но должны содержать одно и то же. Есть ли способ пройтись по всем этим файлам с помощью ansible и затем переместить уникальные файлы в другую директорию?

Спасибо заранее

Вы можете попросить модуль find вычислить контрольную сумму. Например, учитывая файлы

shell> tree dir1
dir1
├── a.txt
├── b.txt
├── c.txt
├── d.txt
├── e.txt
└── f.txt

и их содержимое

shell> find dir1 -type f | sort | xargs cat
123
123
456
789
789
789

playbook ниже

- hosts: localhost

  vars:

    dir1: "{{ playbook_dir }}/dir1"
    dir2: "{{ playbook_dir }}/dir2"
    files_unique: "{{ out.files | groupby('checksum')
                                | map(attribute="1.0.path")
                                | list }}"

  tasks:

    - find:
        paths: "{{ dir1 }}"
        file_type: file
        get_checksum: true
      register: out

    - debug:
        var: files_unique

    - copy:
        src: "{{ item }}"
        dest: "{{ dir2 }}"
      loop: "{{ files_unique }}"

копирует уникальные файлы из директории dir1 в директорию dir2

shell> ansible-playbook pb.yml 

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

TASK [find] **********************************************************************************
ok: [localhost]

TASK [debug] *********************************************************************************
ok: [localhost] => 
  files_unique:
  - /export/scratch/tmp7/test-033/dir1/a.txt
  - /export/scratch/tmp7/test-033/dir1/d.txt
  - /export/scratch/tmp7/test-033/dir1/c.txt

TASK [copy] **********************************************************************************
changed: [localhost] => (item=/export/scratch/tmp7/test-033/dir1/a.txt)
changed: [localhost] => (item=/export/scratch/tmp7/test-033/dir1/d.txt)
changed: [localhost] => (item=/export/scratch/tmp7/test-033/dir1/c.txt)

PLAY RECAP ***********************************************************************************
localhost: ok=3    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
shell> tree dir2
dir2
├── a.txt
├── c.txt
└── d.txt

.

Ответ или решение

Для решения задачи по перемещению уникальных файлов из одной директории в другую с использованием Ansible, следуйте представленному алгоритму. Ansible предлагает мощный инструмент для автоматизации и управления конфигурацией, и в данном случае мы будем использовать его, чтобы находить файлы с одинаковым содержимым и перемещать только уникальные из одного каталога в другой.

Шаг 1: Подготовка окружения

Убедитесь, что на вашем сервере установлены Ansible и доступен необходимый доступ к директориям. В нашем примере мы будем использовать два каталога: dir1 для исходных файлов и dir2 для хранения уникальных файлов.

Шаг 2: Плейбук Ansible

Создайте плейбук Ansible, который будет включать следующие задачи:

  1. Поиск файлов в заданной директории и вычисление их контрольных сумм.
  2. Группировка и выбор уникальных файлов на основе их контрольных сумм.
  3. Копирование уникальных файлов в другой каталог.

Вот пример плейбука:

- hosts: localhost
  vars:
    dir1: "{{ playbook_dir }}/dir1"
    dir2: "{{ playbook_dir }}/dir2"
    files_unique: "{{ out.files | groupby('checksum') | map(attribute='1.0.path') | list }}"

  tasks:
    - name: Находим все файлы в dir1 и вычисляем их контрольные суммы
      find:
        paths: "{{ dir1 }}"
        file_type: file
        get_checksum: true
      register: out

    - name: Отладка: выводим список уникальных файлов
      debug:
        var: files_unique

    - name: Копируем уникальные файлы в dir2
      copy:
        src: "{{ item }}"
        dest: "{{ dir2 }}"
      loop: "{{ files_unique }}"

Шаг 3: Запуск плейбука

Выполните плейбук командой:

ansible-playbook pb.yml

Шаг 4: Проверка результатов

После успешного выполнения плейбука, проверьте содержимое каталога dir2, чтобы убедиться, что уникальные файлы были скопированы:

tree dir2

Результаты

На выходе вы должны увидеть список уникальных файлов, которые были скопированы из dir1 в dir2. В нашем примере результаты могут выглядеть следующим образом:

dir2
├── a.txt
├── c.txt
└── d.txt

Заключение

Используя данный плейбук Ansible, вы сможете эффективно находить и перемещать уникальные файлы на основе их содержимого из одной директории в другую, что прекрасно подходит для автоматизации работы с файлами. Этот подход минимизирует вероятность дублирования и гарантирует чистоту ваших данных.

Оцените материал
Добавить комментарий

Капча загружается...