ansible find: получить путь к директории из регистрации

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

Заранее спасибо за любую помощь. Я не могу понять, в чем именно я ошибаюсь, поэтому ищу помощь. Я хочу найти папку с помощью 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 и копировании её содержимого в другую директорию. Давайте подробно рассмотрим ваш сценарий и оптимизируем его.

Анализ вашего сценария

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

  1. Поиск директории: Вы используете модуль find, чтобы найти директорию, соответствующую определённым шаблонам. Этот подход правильный, но необходимо убедиться, что ваш шаблон совпадает с реальным именем директории.

  2. Копирование файлов: Ваша попытка копирования файлов требует уточнения. Вы должны точно определить, что копируете: все содержимое директории или саму директорию с её содержимым.

Рекомендованный вариант

Обновим ваш код, чтобы сделать его более надёжным и эффективным. Этот пример будет более понятным и не будет содержать избыточных повторений:

- 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  # Защита от выполнения, если нет результатов

Основные исправления и рекомендации

  1. Использование when: Убедитесь, что переменная find_matches.files содержит элементы, прежде чем выполнять дальнейшие действия. Это убережёт вас от ошибок, если целевая директория не найдена.

  2. Корректный путь источника: В директиве src добавлен слэш /, чтобы гарантировать, что копируется всё содержимое директории, а не сама директория. Это критически важно, чтобы сохранить структуру файлов.

  3. Обработка вывода: Используйте loop вместо with_items для большей совместимости с новыми версиями Ansible.

Заключение

Следуя этим рекомендациям, вы сможете эффективно использовать Ansible для поиска и копирования содержимого директорий. Если у вас возникнут дополнительные вопросы о функциональности или возникнут трудности с другими задачами, смело задавайте их.

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

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