使用lineinfile函数和regexp

时间:2018-10-28 14:05:45

标签: regex ansible

我要添加参数

  

-log-opt max-size = 5M

到文件中的现有行,首先要检查此参数是否已设置:

regexp: "^OPTIONS=(?!.*?(--log-opt max-size).*)"

我已经使用该测试字符串在3个不同的在线测试仪上进行了测试,并根据需要进行匹配:

OPTIONS='--log-opt max-size=5M --selinux-enabled --signature-verification=False'

这是完整的剧本:

  - name: "adding limiting parameter for container log-sizes"
    lineinfile:
      path: /etc/sysconfig/docker
      backrefs: true
      state: present
      regexp: "^OPTIONS=(?!.*?(--log-opt max-size).*)"
      line: "OPTIONS='--log-opt max-size=5M \\1'"

Ansible打破了例外,在Ansible 2.6.5和2.7中进行了尝试,猜测它是一个合奏而不是二进制问题。 已经尝试了很长时间:/

还希望在OPTIONS =之后获得报价,以在正则表达式中进行检查 (应该是OPTIONS ='任何内容')

有什么想法吗?预先感谢

2 个答案:

答案 0 :(得分:0)

(?<=')[^']+

此模式将获得OPTIONS =上引号之后的所有行。

  • (?<='):搜索',找到后定位。
  • [^'] +:匹配所有内容一次至无限次,除非找到'。

说,如果要检查行是否正确,可以尝试使用另一个正则表达式,例如 /-log-opt max-size = / 测试从上面的匹配项得到的输出行。

答案 1 :(得分:0)

发现第1组不匹配,唯一的原因是这样。 也许不是最聪明的方法,但是可以解决它,并将正则表达式更新为:^OPTIONS='(?!.*?(--log-opt max-size))(.*)也必须适应替换行:OPTIONS='--log-opt max-size=5M\\2

立即完成剧本部分:

- name: "adding limiting parameter for container log-sizes" lineinfile: path: /etc/sysconfig/docker backrefs: true state: present regexp: "^OPTIONS='(?!.*?(--log-opt max-size))(.*)" line: "OPTIONS='--log-opt max-size=5M \\2"