Список имен каталогов с помощью модуля Ansible Find

Мне нужно найти имена папок в каталоге /home/test. Когда у меня есть список имен папок, мне нужно перебрать задачу. Я могу получить полный путь, но не могу получить имя папки. мой подход неверен, или есть ли простой способ получить имена папок?

--
- hosts: localhost
  gather_facts: no
  vars:
    Files: []
    namespaces: []
  tasks:
    - name: Recursively find folders under /home/test
      ansible.builtin.find:
         paths: /home/test
         file_type: directory
         recurse: no
      register: output

    - name: Adding Files to the LIST
      set_fact:
        Files: "{{ Files + [item.path]  }}"
      with_items: "{{ output.files }}"

    - name: Remove the path to only and retrieve folder name only
      set_fact:
        namespaces: "{{ namespaces + item | split('/') | last}}"
      with_items: "{{ Files }}"

Ошибка:

fatal: [localhost]: FAILED! => {"msg": "Unexpected templating type error occurred on ({{ namespaces + item | split('/') | last}}): can only concatenate list (not \"str\") to list"}

Для управления именами файлов и путями вы также можете заглянуть в файл | basename.

U880D 12.10.2022 12:02
Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
1
1
86
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваше выражение item | split('/') | last в настоящее время возвращает строку, которую вы пытаетесь соединить со списком namespaces. Однако это не разрешено, и поэтому вам также нужно привести его к списку, просто поместив его в фигурные скобки []:

    - name: Remove the path to only and retrieve folder name only
      set_fact:
        namespaces: "{{namespaces + [item | split('/') | last]}}"
      with_items: "{{ Files }}"
Ответ принят как подходящий

Поместите приведенное ниже объявление в vars

namespaces: "{{ output.files|map(attribute='path')|map('basename')|list }}"

Example of a complete playbook for testing

Given the tree

shell> tree /tmp/test/
/tmp/test/
├── dir_A
├── dir_B
├── file_1
└── file_2

the playbook

- hosts: localhost

  vars:

    namespaces: "{{ output.files|map(attribute='path')|map('basename')|list }}"

  tasks:

    - find:
        paths: /tmp/test
        file_type: directory
      register: output
    - debug:
        var: namespaces

gives (abridged)

namespaces:
  - dir_B
  - dir_A

Другие вопросы по теме