You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Ansible Find模块获取目录名报错,求正确实现方案

问题分析与解决

报错原因

你第三个任务里的拼接逻辑有误:namespaces是列表类型,而item | split('/') | last得到的是单个字符串,列表只能和列表拼接,不能直接与字符串相加,这才触发了can only concatenate list (not "str") to list的错误。

修复现有代码

把第三个任务的set_fact改成如下形式,将字符串包装成列表后再拼接:

- name: 提取文件夹名称
  set_fact:
    namespaces: "{{ namespaces + [item | split('/') | last] }}"
  with_items: "{{ Files }}"

更简便的实现方式

其实没必要先存完整路径再处理,find模块返回的output.files里每个目录项本身就带有basename字段,直接提取即可,省掉中间的Files列表:

--
- hosts: localhost
  gather_facts: no
  vars:
    namespaces: []
  tasks:
    - name: 查找/home/test下的一级目录
      ansible.builtin.find:
         paths: /home/test
         file_type: directory
         recurse: no
      register: output

    - name: 直接提取文件夹名称到列表
      set_fact:
        namespaces: "{{ output.files | map(attribute='basename') | list }}"

这样一步就能得到所有目标文件夹的名称列表,后续循环直接使用namespaces即可。

内容的提问来源于stack exchange,提问作者Eva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 12:45:47