我使用该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'