目前正在开发用于 postgresql 安装的 ansible playbook。
尝试向
shared_preload_libraries
插入多个值。想法是能够有条件地插入它们,并且不同的角色必须能够附加到这一行而不覆盖它。
目前的解决方案:
- name: Check whether postgresql.conf contains "pg_stat_statements"
command: grep "pg_stat_statements" "{{ pg_data }}/postgresql.conf"
register: check_shared_libs
check_mode: no
ignore_errors: yes
changed_when: no
- name: Modify postgresql.conf add pg_stat_statements shared library.
replace:
backup: yes
dest: "{{ pg_data }}/postgresql.conf"
regexp: "^#?(shared_preload_libraries = '.*)(')"
replace: '\1,pg_stat_statements\2'
when: check_shared_libs.rc != 0
notify: restart postgres
这给了我这样的东西:
shared_preload_libraries = ',pg_stat_statements,powa,pg_stat_kcache,pg_qualstats,pg_wait_sampling'
工作正常,但我想知道是否有更好的方法。
避免使用
command
任务的一种方法如下。它包含 2 个任务,因为无法使用查找插件将 remote 文件读取到变量中..
因此,第 1 步我们将整个文件读入变量,第 2 步我们检查变量是否包含
pg_stat_statements
:
代码:
---
- name: test play
hosts: localhost
connection: local
gather_facts: false
become: yes
vars:
pg_stat_statements_exists: false
tasks:
- name: read file
slurp:
src: /tmp/postgresql.conf
register: postgresql_file
- name: check pg_stat_statements exists
set_fact:
pg_stat_statements_exists: true
when: postgresql_file['content'] | b64decode is search('pg_stat_statements') == true
- name: print variable that will control the replace task that follows
debug:
var: pg_stat_statements_exists
并使用修改后的
replace
条件添加您的 when
任务:
- name: Modify postgresql.conf add pg_stat_statements shared library.
replace:
backup: yes
dest: "{{ pg_data }}/postgresql.conf"
regexp: "^#?(shared_preload_libraries = '.*)(')"
replace: '\1,pg_stat_statements\2'
when: pg_stat_statements_exists == true
notify: restart postgres
希望有帮助
很抱歉在旧主题中提出问题,但我需要相同的解决方案。
同上例,如果属性只有一个值,如何去掉逗号?
最终结果示例:
shared_preload_libraries = 'pg_stat_statements' #(更改需要重新启动)
shared_preload_libraries = 'a1,pg_stat_statements' #(更改需要重新启动)