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

