Ansible:有条件地将项添加到单个字符串

时间:2018-06-18 13:56:40

标签: postgresql ansible

目前正致力于安装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'

工作正常,但我想知道是否有更好的方法可以做到。

1 个答案:

答案 0 :(得分:0)

以下是避免使用command任务的一种方法。它包含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

希望有帮助