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:에 비슷한 문자가 없으면 다른 줄은 영향을 받지 않기 때문에 특정 문자(예: 빼기 기호, 세미콜론, 더하기 기호)가 여기서 문제가 될 수 있다고 생각하기 시작했습니다.

누군가 이 세 줄이 올바르게 대체되도록 코드를 약간 수정하는 데 도움을 줄 수 있습니까?

감사합니다!

답변1

문제는 From문자열이 정규식으로 해석될 때 일치시키려는 모든 문자열에 특수 문자가 포함된다는 것입니다.

첫 번째와 두 번째 문자열에는 (및 가 포함되고 ), 세 번째 문자열에는 가 포함됩니다 +. \문자열을 정규식으로 사용하는 경우 각 문자를 문자 그대로 해석하려면 이스케이프해야 합니다.

종종 이러한 문자열을 정규 표현식이 아닌 리터럴 문자열로 사용하여 일치시키는 방법을 사용하려고 합니다. Ansible 2.11 이상에서는 모듈 search_string대신 in을 사용하여 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

관련 정보