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

Ansible:shell输出传入lineinfile模块无法生成有效换行的问题排查

问题

在Shell中直接执行find命令能得到每行一条的预期输出,通过debug模块查看注册变量ps的stdout_lines也是每行一条的格式,但运行编写的Ansible任务时,输出到audit.rules的内容混乱,无论在find命令中添加多少换行都无效。

原任务代码如下:

- ansible.builtin.shell:
    cmd: find / -xdev \( -perm -4000 -o -perm -2000 \) -type f | awk '{print "-a always,exit -F path=" $1 " -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged" }'
  register: ps

- name: Put them into the rules file
  ansible.builtin.lineinfile:
    path: "/etc/audit/rules.d/audit.rules"
    insertafter: EOF
    line: "{{ ps.stdout_lines }}" 

原代码无效的原因

  • lineinfile模块的line参数仅接受单个字符串,而ps.stdout_lines是列表类型变量。直接传入列表时,Ansible会将其转换为类似['规则1', '规则2']的字符串格式写入文件,导致内容混乱。
  • 你之前在find命令中添加换行无效,因为问题根源不在Shell命令的输出格式,而是Ansible变量的使用方式错误。

修复方案

有两种常用解决方法:

方法1:用loop遍历列表写入单行规则

通过循环遍历stdout_lines列表,将每条规则单独写入文件:

- ansible.builtin.shell:
    cmd: find / -xdev \( -perm -4000 -o -perm -2000 \) -type f | awk '{print "-a always,exit -F path=" $1 " -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged" }'
  register: ps

- name: Put them into the rules file
  ansible.builtin.lineinfile:
    path: "/etc/audit/rules.d/audit.rules"
    insertafter: EOF
    line: "{{ item }}"
  loop: "{{ ps.stdout_lines }}"

方法2:用join转换列表为换行字符串,配合blockinfile批量写入

将列表通过join('\n')转换为带换行的字符串,再用blockinfile模块一次性写入(可避免重复执行时多次添加):

- ansible.builtin.shell:
    cmd: find / -xdev \( -perm -4000 -o -perm -2000 \) -type f | awk '{print "-a always,exit -F path=" $1 " -F perm=x -F auid>=1000 -F auid!=4294967295 -k privileged" }'
  register: ps

- name: Put them into the rules file
  ansible.builtin.blockinfile:
    path: "/etc/audit/rules.d/audit.rules"
    insertafter: EOF
    block: "{{ ps.stdout_lines | join('\n') }}"
    marker: "# {mark} ANSIBLE MANAGED PRIVILEGED RULES"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:57:39