[英]using regexp in ansible to replace word
我實際上是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="
我寫了如下:
- 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
謝謝山姆
我看到正則表達式至少有四個問題:
.
不會轉義,因此將其解釋為特殊字符。 ^
放在開頭。 似乎您正在嘗試在字符串的中間而不是在開頭查找內容。 Djgroups.bind_address
部分,而我相信您的意思是匹配之后出現的所有內容。 嘗試: Djgroups\\.bind_address=(?!.*?{{ tomcat_instance_ip.stdout }}.*?)(.*)$
並且請先測試您的正則表達式。 https://regex101.com/確保它確實與您想像的輸入相匹配。
刪除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"'
由於replace
模塊是冪等的when
因此也不需要when
。
編輯:有關此示例中使用的正則表達式的一些說明
'JAVA_OPTS="(.* )?-Djgroups.bind_address=[^ "]*(.*)"'
^___^ ^__^
^_________^ (1) ^______________________^ (2)
(3) (4)
^__^
(5)
\\1
和\\2
引用它們來替換它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.