Вопрос или проблема
Заранее спасибо за любую помощь. Я не могу понять, в чем именно я ошибаюсь, поэтому ищу помощь. Я хочу найти папку с помощью ansible, определить местоположение папки и скопировать её содержимое в другую директорию. Вот что у меня есть на данный момент. Я думаю, что застрял в секции with_items.
- name: Найти папку и скопировать файлы
hosts: "{{ target }}"
gather_facts: no
vars:
search_path: ~/oldfolder/backups
id: patient_1234
dest: "~/newfolder/{{ id }}"
tasks:
- name: Найти директорию по шаблонам
ansible.builtin.find:
paths: "{{ search_path }}/"
file_type: directory
patterns: "{{ id[:-4] }}*"
recurse: yes
register: find_matches
- name: Вывести информацию о возврате из предыдущей задачи
ansible.builtin.debug:
var: find_matches.files[0].path
when: find_matches is defined
- name: Копировать из резервной копии в назначение
ansible.builtin.copy:
src: "{{ item.path }}"
dest: "{{ dest }}"
remote_src: yes
with_items: "{{ find_matches.files }}"
- name: Найти папку и скопировать файлы
hosts: "{{ target }}"
gather_facts: no
vars:
search_path: ~/oldfolder/backups
id: patient_1234
dest: "~/newfolder/{{ id }}"
tasks:
- name: Найти директорию по шаблонам
ansible.builtin.find:
paths: "{{ search_path }}/"
file_type: directory
patterns: "{{ id[:-4] }}*"
recurse: yes
register: find_matches
- name: Вывести информацию о возврате из предыдущей задачи
ansible.builtin.debug:
var: find_matches.files[0].path
when: find_matches is defined
- name: Копировать из резервной копии в назначение
ansible.builtin.copy:
src: "{{ item.path }}/."
dest: "{{ dest }}"
remote_src: yes
with_items: "{{ find_matches.files }}"
Другой вариант
- name: Копировать из резервной копии в назначение
ansible.builtin.shell: 'cp -r {{ item.path }}/. {{ dest }}'
with_items: "{{ find_matches.files }}"
изменить последний блок копирования
- name: Копировать из резервной копии в назначение
ansible.builtin.copy:
src: “{{ item.path }}/.”
dest: “{{ dest }}”
remote_src: yes
with_items: “{{ find_matches.files }}”
убедитесь, что вы не используете /. в src
- name: Копировать из резервной копии в назначение
ansible.builtin.copy:
src: “{{ item.path }}”
dest: “{{ dest }}”
remote_src: yes
with_items: “{{ find_matches.files }}”
.
Ответ или решение
Вам требуется помощь в поиске директории с помощью Ansible и копировании её содержимого в другую директорию. Давайте подробно рассмотрим ваш сценарий и оптимизируем его.
Анализ вашего сценария
Ваш код написан довольно хорошо, однако есть несколько моментов, на которые следует обратить внимание для успешного выполнения задачи. Давайте разберём шаги более подробно:
-
Поиск директории: Вы используете модуль
find
, чтобы найти директорию, соответствующую определённым шаблонам. Этот подход правильный, но необходимо убедиться, что ваш шаблон совпадает с реальным именем директории. -
Копирование файлов: Ваша попытка копирования файлов требует уточнения. Вы должны точно определить, что копируете: все содержимое директории или саму директорию с её содержимым.
Рекомендованный вариант
Обновим ваш код, чтобы сделать его более надёжным и эффективным. Этот пример будет более понятным и не будет содержать избыточных повторений:
- name: Поиск папки и копирование файлов
hosts: "{{ target }}"
gather_facts: no
vars:
search_path: ~/oldfolder/backups
id: patient_1234
dest: "~/newfolder/{{ id }}"
tasks:
- name: Находим нужную директорию
ansible.builtin.find:
paths: "{{ search_path }}"
file_type: directory
patterns: "{{ id[:-4] }}*"
recurse: yes
register: find_matches
- name: Печатаем путь найденной директории
ansible.builtin.debug:
var: find_matches.files[0].path
when: find_matches.files | length > 0 # Проверка на наличие найденных файлов
- name: Копируем содержимое из найденной папки в назначенный путь
ansible.builtin.copy:
src: "{{ item.path }}/" # Обратите внимание на добавленный слэш
dest: "{{ dest }}"
remote_src: yes
loop: "{{ find_matches.files }}"
when: find_matches.files | length > 0 # Защита от выполнения, если нет результатов
Основные исправления и рекомендации
-
Использование
when
: Убедитесь, что переменнаяfind_matches.files
содержит элементы, прежде чем выполнять дальнейшие действия. Это убережёт вас от ошибок, если целевая директория не найдена. -
Корректный путь источника: В директиве
src
добавлен слэш/
, чтобы гарантировать, что копируется всё содержимое директории, а не сама директория. Это критически важно, чтобы сохранить структуру файлов. -
Обработка вывода: Используйте
loop
вместоwith_items
для большей совместимости с новыми версиями Ansible.
Заключение
Следуя этим рекомендациям, вы сможете эффективно использовать Ansible для поиска и копирования содержимого директорий. Если у вас возникнут дополнительные вопросы о функциональности или возникнут трудности с другими задачами, смело задавайте их.