regexp 매개변수의 Ansible 변수 값에서 대괄호를 인용하는 방법은 무엇입니까?

regexp 매개변수의 Ansible 변수 값에서 대괄호를 인용하는 방법은 무엇입니까?

이 모듈을 사용하여 ansible.builtin.lineinfilePHP-FPM 풀 구성 파일을 수정합니다. 정규 표현식 매개변수의 변수 값에 대괄호(주석: 또는 기타 특수 문자)를 어떻게 인용해야 합니까?

따옴표가 없으면 대괄호는 일치할 문자 목록인 대괄호 표현식으로 해석됩니다. Ansible이 없으면 sed를 사용하여 백슬래시를 추가합니다.

다음 예는 Debian 기본 풀 conf 파일에 대한 것입니다.

- name: Change PHP-FPM pool parameters
  become: true
  ansible.builtin.lineinfile:
    path: "/etc/php/{{ php_fpm_version }}/fpm/pool.d/www.conf"
    regexp: "^;?{{ item.para }} ="
    line: '{{ item.para }} = {{ item.value }}'
  loop: "{{ php_fpm_pool_parameters }}"
  vars:
    php_fpm_pool_parameters:
    - para: 'pm.max_spare_servers'
      value: '7'
    - para: 'pm.max_requests'
      value: '500'
    - para: 'env[PATH]'
      value: '/usr/bin:/bin'
    - para: 'php_admin_value[memory_limit]'
      value: '4096M'
    - para: 'php_admin_value[max_input_time]'
      value: '600'

답변1

문자 그대로 해석되도록 문자열에서 정규식 특수 문자를 이스케이프해야 합니다. 참고로 이스케이프는 외부와 다르지 않습니다(즉, 이스케이프 문자를 추가합니다 \).

다행히도regex_escape필터그것이 바로 그 목적입니다.

다음(테스트되지 않은)은 귀하의 요구에 적합해야 합니다. 참고: 추가 보안을 위해 기호 앞의 공백을 =선택 사항으로 표시하고 전체 줄과 일치하도록 정규식을 확장했습니다.

- name: Change PHP-FPM pool parameters
  become: true
  ansible.builtin.lineinfile:
    path: "/etc/php/{{ php_fpm_version }}/fpm/pool.d/www.conf"
    regexp: "^;?{{ item.para | regex_escape }} ?=.*$"
    line: '{{ item.para }} = {{ item.value }}'
  loop: "{{ php_fpm_pool_parameters }}"
  vars:
    php_fpm_pool_parameters:
    - para: 'pm.max_spare_servers'
      value: '7'
    - para: 'pm.max_requests'
      value: '500'
    - para: 'env[PATH]'
      value: '/usr/bin:/bin'
    - para: 'php_admin_value[memory_limit]'
      value: '4096M'
    - para: 'php_admin_value[max_input_time]'
      value: '600'

관련 정보