Ansible将stdout_lines写入文件时格式变为单行问题求助
问题原因
stdout_lines是Ansible将原始输出按换行切割后生成的列表类型变量,直接写入文件时会被序列化为Python列表的字符串格式(带[]、单引号的单行结构),自然不会保留换行。- 你选择的
lineinfile模块本身设计为写入单行内容,就算传入带换行的字符串,也只会保留第一行内容,不符合多行写入的需求。
解决方案
方案1:直接使用原生stdout变量(最简单)
register返回的结果中自带stdout字段,就是kubectl命令输出的完整带换行的原始字符串,配合copy模块直接写入即可:
- name: Verify the health of pods shell: 'kubectl get pods -n {{NAMESPACE}}' register: kubectl_pods1 # 覆盖写入日志文件 - name: 写入pod状态到日志 copy: content: "{{ kubectl_pods1.stdout }}" dest: '/tmp/sample.log' force: yes
如果需要追加内容到现有日志末尾,改用blockinfile模块:
- name: 追加pod状态到日志末尾 blockinfile: path: '/tmp/sample.log' block: "{{ kubectl_pods1.stdout }}" create: yes marker: "" # 不需要blockinfile默认的首尾标记可以加这行,避免额外内容插入
方案2:需要处理stdout_lines时用join拼接
如果你需要先对stdout_lines做过滤、调整等处理,再写入文件,可以用join过滤器将列表元素用换行符拼接为完整字符串:
# 示例:仅过滤Running状态的Pod写入日志 - name: 过滤后写入日志 copy: content: "{{ kubectl_pods1.stdout_lines | select('search', 'Running') | join('\n') }}" dest: '/tmp/sample.log'
内容的提问来源于stack exchange,提问作者Raghu
相关产品推荐
相关产品推荐

