我实际上是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
答案 0 :(得分:0)
我看到正则表达式至少有4个问题:
.
未转义,因此会被解释为特殊字符。^
放在开头。好像你试图在字符串中间找到一些东西,而不是在开头。Djgroups.bind_address
部分,而我相信你的意思是匹配后来发生的事情。尝试: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
引用它们来重新使用它们。Regular expressions起初有些令人生畏,这种奇怪的语法。这并不像看起来那么复杂。你可以找到很多tutorials来帮助你理解它。