如何在Ansible角色默认文件中将多文件内容定义为列表变量?
在Ansible角色默认文件中生成包含多文件内容的列表变量
直接在变量定义中实现(推荐)
可以通过以下写法直接在角色的defaults/main.yml中定义变量,无需额外任务:
myvar: "{{ lookup('fileglob', 'dir/*.txt', wantlist=True) | map('lookup', 'file') | list }}"
逻辑说明:
lookup('fileglob', 'dir/*.txt', wantlist=True):给fileglob添加wantlist=True参数,使其返回文件路径列表(而非默认的逗号分隔字符串)map('lookup', 'file'):对列表中的每个文件路径,调用filelookup读取对应文件的原始内容| list:确保最终输出为标准列表类型
执行后,myvar的值会是["one", "two"],即使文件内容包含逗号,也不会被错误拆分。
兼容旧版本的set_fact方案
如果你的Ansible版本较低(2.5及以前),可通过set_fact结合循环构建列表:
- name: 构建文件内容列表 ansible.builtin.set_fact: myvar: "{{ myvar | default([]) + [lookup('file', item)] }}" loop: "{{ lookup('fileglob', 'dir/*.txt', wantlist=True) }}"
此方法会逐个遍历匹配到的文件,将每个文件内容追加到myvar列表中,最终得到同样的结果。
错误原因回顾
你之前的写法失败有两个核心问题:
fileglob默认返回逗号分隔的字符串,传给filelookup时会被当作单个文件路径,导致找不到文件报错filelookup接收多个文件参数时,会将所有内容用逗号拼接成字符串,而非返回列表
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

