![Ansible lineinfile 问题](https://linux22.com/image/209096/Ansible%20lineinfile%20%E9%97%AE%E9%A2%98.png)
我需要使用 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: 中写入的参数可能存在问题,认为它们在配置文件中可能不相同,但是当我查看配置文件时,它们存在,并且我什至复制了来自的值配置文件原样。
我开始认为某些字符(例如减号、分号、加号)可能是这里的问题,因为如果 From: 中没有类似的字符,其他行不会受到影响。
有人可以帮我稍微调整一下代码,以便正确替换这 3 行吗?
谢谢你!
答案1
问题在于,From
您尝试匹配的每个字符串都包含在字符串被解释为正则表达式时的特殊字符。
第一个和第二个字符串包含(
和)
,而第三个字符串包含+
。\
当使用字符串作为正则表达式时,每个字符都需要进行转义才能按字面意思理解。
通常,人们希望使用一种匹配这些字符串的方式,即不将它们用作正则表达式,而是用作文字字符串。在 Ansible 2.11 及更高版本中,可以通过使用search_string
in 代替regexp
模块来实现这一点ansible.builtin.lineinfile
(请参阅相关 Ansible 文档)。
如果您使用的 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
选项可以阻止实用程序将给定模式解释为正则表达式。