Ansible

Ansible lineinfile 問題

  • August 5, 2022

我需要使用 ansible 替換一個文件中的多個配置行。為此,我使用了帶有正則表達式的 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;"/>' }

但是,在執行 play 時,它不會替換行,而是在配置文件的末尾添加資訊。

如果我將這 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: 的參數可能有問題,認為它們在配置文件中可能不完全相同,但是當我查看配置文件時,它們存在,我什至從配置文件原樣。

我開始認為某些字元(例如減號、分號和加號)可能是這裡的問題,因為如果 From: 中沒有此類字元,其他行不會受到影響。

有人可以幫我稍微調整一下程式碼,以便正確替換這 3 行嗎?

謝謝!

問題是From您嘗試匹配的每個字元串都包含在字元串被解釋為正則表達式時的特殊字元。

第一個和第二個字元串包含(and ),而第三個字元串包含+\在將字元串用作正則表達式時,這些字元中的每一個都需要進行轉義才能按字面意思理解。

通常,人們會希望使用一種匹配這些字元串的方式,這種方式不將它們用作正則表達式,而是用作文字字元串。在 Ansible 2.11 及更高版本中,通過使用代替模組來做到這一點(search_string請參閱相關的 Ansible 文件)。regexp``ansible.builtin.lineinfile

如果您使用的 Ansible 版本太舊,因此需要使用,然後如上所述regexp轉義字元串中的特殊字元(注意字元串不需要更改):From``To

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選項可以阻止實用程序將給定模式解釋為正則表達式。

引用自:https://unix.stackexchange.com/questions/712512