2017-07-12 8 views
0

私は元気な私のシステムipとregexpを使ってファイルのIPアドレスを変更するのを手伝ってください。 "Djgroups.bind_address = < */WHATEVER/BLANK>"を "Djgroups.bind_address = 10.0.0.45"に置き換えたいとしましょう。単語を置き換えることが可能なregexpを使用して

これは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 

おかげで、サム

+0

ソリューションの実際の結果はどのようなものですか?あなたはそれが正確に動作しないものについて具体的にしようとする必要があります。正規表現を試してみることもできます:https://regex101.com/ –

+0

実際に私が書いた以下の行は、システムのIPアドレスを使ってip addressセクションを変更しません。 '\ 1 {{ip_address}}'は何か不足していますか? '、' regexp: '^(Djgroups.bind_address(?!。* \ b {{tomcat_instance_ip.stdout}}¥b)。*)$' –

答えて

0

shellタスクを削除する必要はありません。 replaceモジュールが冪等であることからwhenは、いずれかの必要はありません

- 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"' 

はこれを試してみてください。

編集:

'JAVA_OPTS="(.*)?-Djgroups.bind_address=[^ "]*(.*)"' 
      ^___^        ^__^ 
^_________^ (1) ^______________________^  (2) 
     (3)      (4) 
             ^__^ 
              (5) 
  • とこの例で使用する正規表現についていくつかの説明が "不明" の部分です。これは何でもかまいませんし、交換を適用している間にこれを失いたくはありません。だから私たちはかっこでそれらをキャプチャします。置き換え時に\1\2を参照して再利用することができます。
  • およびは「既知の」部分です。それらは、変更される行を識別するために使用されます。私たちは実際にその内容を知っているので、実際にそれらを取り込む必要はありません。
  • は興味深い部分ですが、これは新しいコンテンツに置き換えたいものです。私たちはその実際の内容には気をつけません。

Regular expressionsは、この奇妙な構文ではやや威圧的です。これはそれほど複雑ではないようです。あなたはそれを理解するのに役立つたくさんのtutorialsを見つけることができます。

+0

これはEricを働いた。本当にありがとう。 –

+0

私の学習のために、正規表現を説明し、セクションを置き換えてください。前もって感謝します。 –

+0

@SamironMallick私は簡単な説明で私の答えを編集しました。お役に立てれば。乾杯。 –

0

私は正規表現と、少なくとも4つの問題を参照してください。

  1. .はエスケープされないため、特殊文字として解釈されます。
  2. なぜ最初に^を入れますか?あなたが文字列の真ん中で何かを見つけようとしているように見えます。最初ではありません。
  3. 負のルックアップで。*に遅延評価を使用する必要があります。今、それは何にもマッチします。
  4. あなたは文字列のDjgroups.bind_address部分と一致させようとしていますが、私はあなたがその後に来るものにマッチすることを意味すると信じています。

試し:Djgroups\.bind_address=(?!.*?{{ tomcat_instance_ip.stdout }}.*?)(.*)$

そして、最初にあなたの正規表現をテストしてください。 https://regex101.com/あなたの想像通りに実際にあなたの入力と一致していることを確認してください。

関連する問題