如何在 regexp 参数的 Ansible 变量值中引用方括号?

如何在 regexp 参数的 Ansible 变量值中引用方括号?

我使用该ansible.builtin.lineinfile模块来修改 PHP-FPM 池配置文件。我应该如何在 regexp 参数的变量值中引用方括号(注释:或其他特殊字符)?

如果不加引号,方括号将被解释为方括号表达式 - 要匹配的字符列表。如果没有 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

您需要转义字符串中的正则表达式特殊字符,以便按字面意思理解它们。仅供参考,转义在 ansible 中与在外部没有什么不同(即您添加转义字符,即\)。

幸运的是,有一个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'

相关内容