求助:如何用Ansible读取本地文件到变量并逐行循环处理?
这问题我之前也碰到过!你用lookup('file')拿到的是整个文件的字符串内容(包含换行符),直接用with_item这类指令的话,会把整个字符串当成单个元素处理,自然没法逐行遍历。下面给你几个靠谱的解决方案:
方法1:用splitlines()拆分字符串为列表,配合loop遍历
这是最直观且符合Ansible新版本推荐的方式:先把文件内容拆成每行的列表,再用loop(替代旧的with_*系列指令)遍历:
--- - name: 逐行处理本地文件内容 hosts: localhost vars: # 读取文件内容到变量 file_contents: "{{ lookup('file', './myfile.txt') }}" # 将字符串按换行符拆分为每行的列表 file_lines: "{{ file_contents.splitlines() }}" tasks: - name: 遍历每一行并输出内容 debug: msg: "当前处理行: {{ item }}" loop: "{{ file_lines }}"
如果你的文件里存在空行,想过滤掉的话,可以加个过滤器优化:
file_lines: "{{ file_contents.splitlines() | reject('equalto', '') | list }}"
方法2:直接用with_lines读取并遍历
with_lines本身就支持直接读取文件内容并逐行返回,甚至不需要提前用lookup。它的参数是shell命令,所以用cat读取文件即可:
--- - name: 用with_lines逐行处理文件 hosts: localhost tasks: - name: 遍历文件每一行 debug: msg: "当前行内容: {{ item }}" with_lines: cat ./myfile.txt
不过要注意,with_lines属于旧版循环指令,Ansible 2.5之后官方更推荐用loop配合列表的方式,灵活性更高。
为什么你之前的尝试没生效?
with_file:这个指令是用来读取多个文件的完整内容,每个文件作为一个循环元素,不是用来逐行读取单个文件的with_item:你直接传入了file_contents这个完整字符串,它会把整个字符串当成单个元素,只会执行一次任务with_lines:如果你之前传的是file_contents变量,它会把整个字符串当成shell命令去执行,自然得不到正确的逐行结果
内容的提问来源于stack exchange,提问作者Komar Patel
相关产品推荐
相关产品推荐

