Ansible使用regex环视匹配成功但replace模块无法替换目标内容
问题原因
你的正则匹配规则对空白字符数量做了严格限制:(?<=disable\s{9}\S\s)yes要求disable后必须跟9个空白符、再跟1个非空白符(即等号=)、再跟1个空白符才能命中目标。但实际xinetd配置文件中等号两侧的空格/制表符数量不固定,几乎不可能刚好符合9个空白符的要求,因此Ansible的replace模块找不到匹配项,自然返回ok状态但不会修改内容。
解决方案
将正则改为宽松匹配空白符的规则,不用严格限制空格数量:
hosts: all gather_facts: False become: true tasks: - name: 修改chargen服务的disable配置 ansible.builtin.replace: path: /etc/xinetd.d/chargen regexp: '(?<=disable\s*=\s*)yes' replace: 'no' backup: yes # 可选配置,修改前自动备份原文件,避免配置出错 register: test - name: 输出修改结果 ansible.builtin.debug: msg: "{{ test }}"
验证方法
- 执行playbook后查看debug输出中的
changed字段,值为true则说明修改成功,值为false说明未匹配到对应行 - 可以提前在目标节点执行命令验证配置是否存在:
grep -E 'disable\s*=\s*yes' /etc/xinetd.d/chargen,如果有输出说明存在可匹配的配置行
内容的提问来源于stack exchange,提问作者Ana Marie De Vera
相关产品推荐
相关产品推荐

