SLES 12环境下Ansible如何向配置指定行末尾追加条目
解决方法
原有playbook中修改pam_winbind.conf的逻辑存在三个核心问题,无法实现通用追加效果:
- 正则表达式
(^*2185915*)$语法非法,且没有锚定require_membership_of配置键,可能误改文件中其他无关行 - 没有判断目标SID是否已经存在,重复执行playbook会反复追加同一个SID,导致配置格式错误
- 没有兼容配置文件中不存在
require_membership_of配置行的场景
要实现无论原有配置是什么内容,都能正确追加目标SID且保证幂等性,替换原有修改pam_winbind.conf的任务为以下两个任务即可:
- name: 追加目标SID到已存在的require_membership_of配置行末尾(不存在重复值时才修改) lineinfile: path: /etc/security/pam_winbind.conf regexp: '^require_membership_of=(?!.*S-1-5-21-84296906-944397292-530207130-587119)(.*)$' line: 'require_membership_of=\1,S-1-5-21-84296906-944397292-530207130-587119' backrefs: yes - name: 配置文件不存在require_membership_of行时直接新增配置 lineinfile: path: /etc/security/pam_winbind.conf regexp: '^require_membership_of=' line: 'require_membership_of=S-1-5-21-84296906-944397292-530207130-587119' state: present
逻辑说明
- 第一个任务通过负向预查
(?!.*目标SID)匹配所有已存在、且未包含目标SID的require_membership_of行,将原有配置值作为捕获组\1,在末尾拼接逗号和目标SID;如果行内已经存在目标SID,正则不会匹配,不会做任何修改,避免重复追加。 - 第二个任务检测文件中是否存在
require_membership_of开头的配置行,如果完全不存在该配置,就直接插入值为目标SID的配置行;如果已存在该行,不会做任何改动。 - 该写法兼容所有场景:无论原有
require_membership_of的值是空、单个SID、还是多个逗号分隔的SID,都能正确追加,且多次执行playbook不会产生脏配置。
原有备份配置、sudoers修改、winbind服务重启的任务不需要调整,保留即可。
内容的提问来源于stack exchange,提问作者user19310105
相关产品推荐
相关产品推荐

