Вопрос или проблема
Я пытаюсь пройтись по всем файлам в директории, эти файлы названы по-разному, но должны содержать одно и то же. Есть ли способ пройтись по всем этим файлам с помощью 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, который будет включать следующие задачи:
- Поиск файлов в заданной директории и вычисление их контрольных сумм.
- Группировка и выбор уникальных файлов на основе их контрольных сумм.
- Копирование уникальных файлов в другой каталог.
Вот пример плейбука:
- 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, вы сможете эффективно находить и перемещать уникальные файлы на основе их содержимого из одной директории в другую, что прекрасно подходит для автоматизации работы с файлами. Этот подход минимизирует вероятность дублирования и гарантирует чистоту ваших данных.