在ansible中使用regexp来替换word

时间:2017-07-12 09:24:03

标签: ansible

我实际上是ansible的新手。任何人都可以帮我用原始系统ip使用regexp更改文件中的IP地址。假设我想替换“Djgroups.bind_address =< * / WHATEVER / BLANK>”到“Djgroups.bind_address = 10.0.0.45”

这将是一个tomcat实例。需要更换的线路:

JAVA_OPTS="-Xms6144m -Xmx6144m -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Djgroups.bind_address="

我写了如下的ansible:

  - name: Verifying Instance IP Address
    shell: grep Djgroups.bind_address /apache-tomcat-8.5.15_1/bin/catalina.sh|grep -v ^#|tr -s '=' '"'|cut -d '"' -f5
    register: tomcat_instance_ip
  - debug: msg='Tomcat instance has {{ tomcat_instance_ip.stdout }} set.'

  - name: Updating Tomcat Instance with valid local IP address
    replace:
      dest: /apache-tomcat-8.5.15_1/bin/catalina.sh
      regexp: '^(Djgroups.bind_address(?!.*\b{{ tomcat_instance_ip.stdout }}\b).*)$'
      replace: '\1 {{ ip_address }}'
    when: tomcat_instance_ip.stdout != ip_address

谢谢,Sam

2 个答案:

答案 0 :(得分:0)

我看到正则表达式至少有4个问题:

  1. 您的.未转义,因此会被解释为特殊字符。
  2. 为什么要将^放在开头。好像你试图在字符串中间找到一些东西,而不是在开头。
  3. 你应该在负面查找中对。*使用延迟评估。现在它将匹配任何东西。
  4. 你正试图匹配字符串的Djgroups.bind_address部分,而我相信你的意思是匹配后来发生的事情。
  5. 尝试:Djgroups\.bind_address=(?!.*?{{ tomcat_instance_ip.stdout }}.*?)(.*)$

    请先测试你的正则表达式。 https://regex101.com/确保它与您想象的实际匹配。

答案 1 :(得分:0)

删除shell任务,这不是必需的。

试试这个:

- name: Updating Tomcat Instance with valid local IP address
  replace:
    path: /apache-tomcat-8.5.15_1/bin/catalina.sh
    regexp: 'JAVA_OPTS="(.* )?-Djgroups.bind_address=[^ "]*(.*)"'
    replace: 'JAVA_OPTS="\1-Djgroups.bind_address={{ ip_address }}\2"'

由于when模块是幂等的,因此也不需要replace

编辑:有关此示例中使用的正则表达式的一些解释

'JAVA_OPTS="(.* )?-Djgroups.bind_address=[^ "]*(.*)"'
            ^___^                              ^__^
 ^_________^ (1) ^______________________^       (2)
      (3)                     (4)
                                         ^__^
                                          (5)
  • 1 2 是"未知"部分。这可以是任何事情,我们不希望在申请替换时失去这一点。所以我们用括号捕捉它们。我们可以通过\1\2引用它们来重新使用它们。
  • 3 4 是"已知"部分。它们用于标识要修改的行。因为我们确实知道它们的内容,所以我们并不需要捕获它们。
  • 5 是有趣的部分,这是我们想要用新内容替换的内容。我们不关心它的实际内容。

Regular expressions起初有些令人生畏,这种奇怪的语法。这并不像看起来那么复杂。你可以找到很多tutorials来帮助你理解它。