ansible/roles/postgresql/tasks/configure.yml
# file: postgresql/tasks/configure.yml
- name: PostgreSQL | Drop the data directory | RedHat
file:
path: "{{ postgresql_data_directory }}"
state: absent
register: pgdata_dir_remove
when: ansible_os_family == "RedHat" and postgresql_cluster_reset
- name: PostgreSQL | Make sure the postgres data directory exists
file:
path: "{{postgresql_data_directory}}"
owner: "{{ postgresql_service_user }}"
group: "{{ postgresql_service_group }}"
state: directory
mode: 0700
register: pgdata_dir_exist
- name: PostgreSQL | Make sure the postgres WAL directory exists
file:
path: "{{ postgresql_wal_directory }}"
owner: "{{ postgresql_service_user }}"
group: "{{ postgresql_service_group }}"
state: directory
mode: 0700
register: pgwal_dir_exist
when: postgresql_wal_directory != ""
- name: PostgreSQL | Make sure the postgres log directory exists
file:
path: "{{ postgresql_log_directory }}"
owner: "{{ postgresql_service_user }}"
group: "{{ postgresql_service_group }}"
state: directory
mode: 0700
register: pglog_dir_exist
when: postgresql_log_directory != "pg_log"
- name: PostgreSQL | Ensure the locale for lc_collate and lc_ctype is generated | Debian
become: yes
locale_gen: name="{{ item }}" state=present
with_items:
- "{{ postgresql_locale }}"
- "{{ postgresql_ctype }}"
when: ansible_os_family == "Debian" and item != "C.UTF-8"
- name: PostgreSQL | Ensure the locale is generated | RedHat
become: yes
command: localedef -c -i {{ item.parts[0] }} -f {{ item.parts[1] }} {{ item.locale_name }}
changed_when: false
with_items:
- { parts: "{{ postgresql_locale_parts }}", locale_name: "{{ postgresql_locale }}" }
- { parts: "{{ postgresql_ctype_parts }}", locale_name: "{{ postgresql_ctype }}" }
when: ansible_os_family == "RedHat"
ignore_errors: yes
- name: PostgreSQL | Stop PostgreSQL | Debian
service:
name: "{{ postgresql_service_name }}"
state: stopped
become: yes
when: ansible_os_family == "Debian" and postgresql_cluster_reset and pgdata_dir_exist.changed
- name: PostgreSQL | Reset the cluster - drop the existing one | Debian
shell: pg_dropcluster {{ postgresql_version }} {{ postgresql_cluster_name }}
become: yes
become_user: "{{ postgresql_service_user }}"
when: ansible_os_family == "Debian" and postgresql_cluster_reset and pgdata_dir_exist.changed
- name: PostgreSQL | Reset the cluster - create a new one (with specified encoding and locale) | Debian
shell: >
pg_createcluster --locale {{ postgresql_locale }}
-e {{ postgresql_encoding }} -d {{ postgresql_data_directory }}
{{ postgresql_version }} {{ postgresql_cluster_name }}
--
{% if postgresql_data_checksums and postgresql_version is version_compare('9.3', '>=') %}--data-checksums{% endif %}
{% if postgresql_pwfile != "" %}--pwfile={{ postgresql_pwfile }} {% endif %}
{% if postgresql_wal_directory != "" and postgresql_version is version_compare('10', '<') %}--xlogdir={{ postgresql_wal_directory }} {% endif %}
{% if postgresql_wal_directory != "" and postgresql_version is version_compare('10', '>=') %}--waldir={{ postgresql_wal_directory }} {% endif %}
become: yes
become_user: "{{ postgresql_service_user }}"
when: ansible_os_family == "Debian" and postgresql_cluster_reset and pgdata_dir_exist.changed
- name: PostgreSQL | Update systemd | Debian
command: systemctl daemon-reload
become: yes
when: ansible_os_family == "Debian" and postgresql_cluster_reset and pgdata_dir_exist.changed
- name: PostgreSQL | Start PostgreSQL | Debian
service:
name: "{{ postgresql_service_name }}"
state: started
become: yes
when: ansible_os_family == "Debian" and postgresql_cluster_reset and pgdata_dir_exist.changed
- name: PostgreSQL | Check whether the postgres data directory is initialized | RedHat
stat:
path: "{{ postgresql_data_directory }}/PG_VERSION"
when: ansible_os_family == "RedHat" and not postgresql_cluster_reset
register: pgdata_dir_initialized
- name: PostgreSQL | Initialize the database | RedHat
command: >
{{ postgresql_bin_directory }}/initdb -D {{ postgresql_data_directory }}
--locale={{ postgresql_locale }} --encoding={{ postgresql_encoding }}
{% if postgresql_data_checksums and postgresql_version is version_compare('9.3', '>=') %}--data-checksums{% endif %}
{% if postgresql_pwfile != "" %}--pwfile={{ postgresql_pwfile }} {% endif %}
{% if postgresql_wal_directory != "" and postgresql_version is version_compare('10', '<') %}--xlogdir={{ postgresql_wal_directory }} {% endif %}
{% if postgresql_wal_directory != "" and postgresql_version is version_compare('10', '>=') %}--waldir={{ postgresql_wal_directory }} {% endif %}
become: yes
become_user: "{{ postgresql_service_user }}"
when: ansible_os_family == "RedHat" and
(postgresql_cluster_reset or
pgdata_dir_exist.changed or
not pgdata_dir_initialized.stat.exists)
- name: PostgreSQL | Verify postgresql cluster version
command: grep ^{{ postgresql_version }}$ {{ postgresql_data_directory }}/PG_VERSION
changed_when: false
- name: PostgreSQL | Ensure configuration directory exists
file:
path: "{{ postgresql_conf_directory }}"
owner: "{{ postgresql_service_user }}"
group: "{{ postgresql_service_group }}"
mode: 0700
state: directory
- name: PostgreSQL | Update configuration - pt. 1 (pg_hba.conf)
template:
src: pg_hba.conf.j2
dest: "{{postgresql_conf_directory}}/pg_hba.conf"
owner: "{{ postgresql_service_user }}"
group: "{{ postgresql_service_group }}"
mode: 0640
register: postgresql_configuration_pt1
- name: PostgreSQL | Update configuration - pt. 2 (postgresql.conf)
template:
src: "postgresql.conf-{{ postgresql_version }}.j2"
# if using pgtune, save the template to ".untuned"
dest: "{{postgresql_conf_directory}}/postgresql.conf{% if postgresql_pgtune %}.untuned{% endif %}"
owner: "{{ postgresql_service_user }}"
group: "{{ postgresql_service_group }}"
mode: 0640
register: postgresql_configuration_pt2
- name: PostgreSQL | Update configuration - pt. 3 (pgtune)
become: true
become_user: "{{ postgresql_service_user }}"
shell: |
set -e
TMPDIR=$(mktemp -d)
pgtune --input-config=postgresql.conf.untuned\
--output-config=$TMPDIR/postgresql.conf\
{% if postgresql_pgtune_memory %}--memory {{postgresql_pgtune_memory|int}}{% endif %}\
--type {{postgresql_pgtune_type|quote}}\
{% if postgresql_pgtune_connections %}--connections {{postgresql_pgtune_connections|int}}{% endif %}\
# Compare the current config with the one procuded by pgtune (ignoring comments/blanks)
if diff --ignore-blank-lines \
<(sed -e 's/#.*//' postgresql.conf) \
<(sed -e 's/#.*//' $TMPDIR/postgresql.conf)
then
echo '_OK_'
else
cp $TMPDIR/postgresql.conf postgresql.conf
fi
# Cleanup
rm $TMPDIR/postgresql.conf
rmdir $TMPDIR
args:
chdir: "{{postgresql_conf_directory}}"
executable: "/bin/bash"
when: postgresql_pgtune
register: postgresql_configuration_pt3
changed_when: "'_OK_' not in postgresql_configuration_pt3.stdout"
- name: PostgreSQL | Update configuration - pt. 4 (pg_ident.conf)
template:
src: pg_ident.conf.j2
dest: "{{ postgresql_ident_file }}"
owner: "{{ postgresql_service_user }}"
group: "{{ postgresql_service_group }}"
mode: 0640
register: postgresql_configuration_pt4
notify: restart postgresql
- name: PostgreSQL | Create folder for additional configuration files
file:
name: "{{postgresql_conf_directory}}/conf.d"
state: directory
owner: "{{ postgresql_service_user }}"
group: "{{ postgresql_service_group }}"
mode: 0755
- name: PostgreSQL | Ensure the systemd directory for PostgreSQL exists | RedHat
file:
name: "/etc/systemd/system/postgresql-{{ postgresql_version }}.service.d"
state: directory
mode: 0755
when: ansible_os_family == "RedHat"
notify: restart postgresql
- name: PostgreSQL | Use the conf directory when starting the Postgres service | RedHat
template:
src: etc_systemd_system_postgresql.service.d_custom.conf.j2
dest: "/etc/systemd/system/postgresql-{{ postgresql_version }}.service.d/custom.conf"
when: ansible_os_family == "RedHat"
register: postgresql_systemd_custom_conf
- name: PostgreSQL | Ensure the pid directory for PostgreSQL exists
file:
name: "{{ postgresql_pid_directory }}"
state: directory
owner: "{{ postgresql_service_user }}"
group: "{{ postgresql_service_group }}"
mode: u=rwX,g=rwXs,o=rx
notify: restart postgresql
- name: PostgreSQL | Reload all conf files
service:
name: "{{ postgresql_service_name }}"
state: reloaded
when: postgresql_configuration_pt1.changed or postgresql_configuration_pt2.changed or postgresql_configuration_pt3.changed or postgresql_systemd_custom_conf.changed