Ansible lineinfileの問題

Ansible lineinfileの問題

ansibleを使用してファイルの複数の構成行を置き換える必要があります。これを行うには、regexpでlineinfileモジュールを使用しました。

演劇のプロットは次のとおりです。

- name: Changing parameters in {{ rt_2_dir }}/config.xml
  lineinfile:
    path: "{{ ais_dir }}/Instances/{{ rt_2_dir }}/config.xml"
    regexp: '{{item.From}}'
    line: '{{item.To}}'
    state: present
  with_items:
    - { From: '  <Configuration_Entry Key="Java Max Heap Size (MB)" Value="4096"/>', To: '  <Configuration_Entry Key="Java Max Heap Size (MB)" Value="16384"/>' }
    - { From: '  <Configuration_Entry Key="Maximum number of queue listener threads (dialogs)" Value="20"/>', To: '  <Configuration_Entry Key="Maximum number of queue listener threads (dialogs)" Value="60"/>' }
    - { From: '  <Configuration_Entry Key="Additional JVM Settings" Value="-Xms512M;-Xss256K;-XX:+UseConcMarkSweepGC;-XX:+UseTLAB;-Xrs"/>', To: '  <Configuration_Entry Key="Additional JVM Settings" Value="-Xms8192M;-Xss1024K;-XX:+UseParallelGC;-XX:+UseCMSInitiatingOccupancyOnly;-XX:CMSInitiatingOccupancyFraction=80;-XX:+UseTLAB;-Xrs;-Dorg.apache.activemq.SERIALIZABLE_PACKAGES=*;-XX:-UseGCLogFileRotation;-XX:GCLogFileSize=8M;-XX:-PrintGCTimeStamps;-verbose:gc;-Xloggc:/path/to/server/instance/logs/gclog.out;"/>' }

ただし、プレイの実行時に行を置き換えるのではなく、設定ファイルの最後に情報を追加します。

この3行を下の行に置き換えると置き換えられます。

- { From: '  <Configuration_Entry Key="Add-On - Enable Geographic Add-On" Value="0"/>', To: '  <Configuration_Entry Key="Add-On - Enable Geographic Add-On" Value="1"/>' }
- { From: '  <Configuration_Entry Key="Add-On - Enable Financial Institutions" Value="0"/>', To: '  <Configuration_Entry Key="Add-On - Enable Financial Institutions" Value="1"/>' }
- { From: '  <Configuration_Entry Key="Add-On - Enable IP Enrichment" Value="0"/>', To: '  <Configuration_Entry Key="Add-On - Enable IP Enrichment" Value="1"/>' }

まず、From:に書かれたパラメータに問題があるかもしれないという考えが入っていて、configファイルで同じではないかもしれないと思いましたが、configファイルを見るとそこにあり、値もコピーまでしました。

From:に似た文字がないと、他の行は影響を受けないため、特定の文字(マイナス記号、セミコロン、プラス記号など)がここで問題になる可能性があると考え始めました。

誰かがこれらの3行が正しく置き換えられるようにコードを少し変更するのに役立ちますか?

ありがとうございます!

ベストアンサー1

問題は、From文字列が正規表現として解釈されたときに一致させたいすべての文字列に特殊文字が含まれることです。

最初と2番目の文字列にはとが(含まれ)、3番目の文字列にはが含まれます+\文字列を正規表現として使用する場合、各文字を文字通り解釈するにはエスケープする必要があります。

多くの場合、これらの文字列を正規表現ではなくリテラル文字列として使用して一致させる方法を使用しようとします。 Ansible 2.11以降では、モジュールの代わりにsearch_stringinを使用してregexpこれを達成できますansible.builtin.lineinfile(参照:関連Ansibleドキュメント)。

使用しているAnsibleのバージョンが古すぎる必要上記のように文字列regexpの特殊文字を使用してエスケープします(文字列は変更する必要はありません)。FromTo

with_items:
    - { From: '  <Configuration_Entry Key="Java Max Heap Size \(MB\)" Value="4096"/>', To: '  <Configuration_Entry Key="Java Max Heap Size (MB)" Value="16384"/>' }
    - { From: '  <Configuration_Entry Key="Maximum number of queue listener threads \(dialogs\)" Value="20"/>', To: '  <Configuration_Entry Key="Maximum number of queue listener threads (dialogs)" Value="60"/>' }
    - { From: '  <Configuration_Entry Key="Additional JVM Settings" Value="-Xms512M;-Xss256K;-XX:\+UseConcMarkSweepGC;-XX:\+UseTLAB;-Xrs"/>', To: '  <Configuration_Entry Key="Additional JVM Settings" Value="-Xms8192M;-Xss1024K;-XX:+UseParallelGC;-XX:+UseCMSInitiatingOccupancyOnly;-XX:CMSInitiatingOccupancyFraction=80;-XX:+UseTLAB;-Xrs;-Dorg.apache.activemq.SERIALIZABLE_PACKAGES=*;-XX:-UseGCLogFileRotation;-XX:GCLogFileSize=8M;-XX:-PrintGCTimeStamps;-verbose:gc;-Xloggc:/path/to/server/instance/logs/gclog.out;"/>' }

問題は、grep有効な正規表現であるリテラル文字列を含む行を見つけるのと似ています.*。したがって、ユーティリティが特定のパターンを正規表現として解釈するのを防ぐオプションがgrepあります。-F

おすすめ記事