使用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
相关产品推荐
相关产品推荐

