Рейтинг:2

Ansible Поиск имен родительских каталогов файлов

флаг id

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

база/tool1/sub/test.log
база/tool2/abc/values.log
база/tool3/sub/test.log

Я хочу получить абсолютный путь к каждому каталогу, где находится test.log. так база/tool1/sub/ и база/tool3/sub/ будут совпадения, которые я хочу получить в результате.

- название: "Петля-Playbook"
  хозяева: все
  задачи:

  - name: "Отфильтровать совпадения файлов"
    найти:
      пути: "/база"
      тип_файла: "файл"
      рекурсия: "да"
      шаблоны: "*test.log"
    регистрация: files_matched

  - имя: "Файлы отладки_сопоставлены полностью"
    отлаживать:
переменная: files_matched.files

  - имя: "Отладка файлов_совпадающих элементов"
    отлаживать:
      переменная: элемент.путь | имя 
    цикл: "{{ files_matched.files| сгладить (уровни = 1) }}"
    loop_control:
      метка: "{{ item.path }}"

Думаю, мне нужно использовать что-то вроде {{ элемент.путь | имя_каталога }} но, честно говоря, я понятия не имею, ГДЕ я должен это определить.

Кто-нибудь может мне помочь?

Zeitounator avatar
флаг fr
`debug: {var: varname}` предназначен для отладки содержимого переменной, идентифицированного `varname`. В этом случае вы хотите использовать `debug: {msg: "{{ item.path | dirname }}"}`, так как вы вычисляете содержимое jinja2, которое необходимо расширить. Обычно ожидается, что вы предоставите вывод своего скрипта и опишите, чем он отличается от того, что вы ожидаете, чтобы помочь людям понять вашу проблему и обнаружить ошибки.
Alien Life Form avatar
флаг ru
Если вам нужен *абсолютный* путь, вам, возможно, придется сделать что-то вроде этого: https://stackoverflow.com/questions/53489453/get-absolute-path-of-file-on-local-host
Рейтинг:1
флаг cn

map() в Джиндже может извлекать атрибуты или применять фильтр к последовательности. Используйте оба, чтобы преобразовать результаты поиска в одну цепочку фильтров.

---
- name: "базовое имя результатов поиска"
  хосты: локальный
  собрать_факты: Ложь

  вары:
    тестовые файлы:
    - база/tool1/sub/test.log
    - база/tool2/abc/values.log
    - база/tool3/sub/test.log

  задачи:
  - название: "Настроить тестовый пример"
    блокировать:

    - временный файл:
        состояние: каталог
      регистрация: mktemp

    - файл:
        путь: "{{ ( mktemp.path ~ '/' ~ элемент ) | имя каталога }}"
        состояние: каталог
      цикл: "{{ тестовые файлы }}"

    - файл:
        путь: "{{ mktemp.path ~ '/' ~ элемент }}"
        состояние: коснуться
      цикл: "{{ тестовые файлы }}"


  - name: "Отфильтровать совпадения файлов"
    найти:
      пути: "{{ mktemp.path }}"
      тип_файла: "файл"
      рекурсия: "да"
      # шаблон уже сопоставлен с базовым именем
      # Не используйте подстановочный знак впереди, чтобы совпало только "test.log"
      шаблоны: "test.log"
    регистрация: files_matched

  - имя: "Файлы отладки_сопоставлены полностью"
    отлаживать:
       переменная: files_matched.files
       многословие: 1

  - название: "Каталоги найдены"
    отлаживать:
      сообщение: "{{ testdirnames }}"
    вары:
      # карта для извлечения атрибута
      # карта для применения фильтра
      # (может и то, и другое)
      # фильтр списка для использования любого объекта генератора, возвращаемого Jinja
      testdirnames: "{{ files_matched.files | map(attribute='path') | map('dirname') | list }}"

Вывод:

$ ansible-playbook sf1073762.yml

PLAY [базовое имя результатов поиска] ************************************************* *************************************************

ЗАДАНИЕ [tempfile] **************************************************** ******************************************************* ******
изменено: [локальный хост]

ЗАДАНИЕ [файл] **************************************************** ******************************************************* **********
изменено: [localhost] => (item=base/tool1/sub/test.log)
изменено: [localhost] => (item=base/tool2/abc/values.log)
изменено: [localhost] => (item=base/tool3/sub/test.log)

ЗАДАНИЕ [файл] **************************************************** ******************************************************* **********
изменено: [localhost] => (item=base/tool1/sub/test.log)
изменено: [localhost] => (item=base/tool2/abc/values.log)
изменено: [localhost] => (item=base/tool3/sub/test.log)

ЗАДАЧА [Отфильтровать совпадения файлов] *********************************************** ****************************************************
хорошо: [локальный хост]

ЗАДАЧА [Отладка файлов_сопоставление полное] ************************************************* ************************************************
пропуск: [локальный хост]

ЗАДАЧА [Каталоги найдены] *************************************************** ******************************************************* ******
хорошо: [локальный хост] => {
    "сообщение": [
        "/tmp/ansible.Nc0b6i/база/tool1/sub",
        "/tmp/ansible.Nc0b6i/база/tool3/sub"
    ]
}

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.