diff --git a/roles/postgresql-server/files/postgresql-upgrade.service b/roles/postgresql-server/files/postgresql-upgrade.service new file mode 100644 index 0000000..82de021 --- /dev/null +++ b/roles/postgresql-server/files/postgresql-upgrade.service @@ -0,0 +1,18 @@ +[Unit] +Description=Upgrade PostgreSQL database cluster +Before=postgresql.service +Before=systemd-update-done.service +After=local-fs.target +RequiresMountsFor=/var/lib/pgsql +DefaultDependencies=no +ConditionNeedsUpdate=/var + +[Service] +Type=oneshot +User=postgres +ExecStart=+/usr/local/libexec/postgresql-upgrade +Environment=PG_COLOR=always +WorkingDirectory=~ + +[Install] +RequiredBy=postgresql.service diff --git a/roles/postgresql-server/files/postgresql-upgrade.sh b/roles/postgresql-server/files/postgresql-upgrade.sh new file mode 100644 index 0000000..b7e145e --- /dev/null +++ b/roles/postgresql-server/files/postgresql-upgrade.sh @@ -0,0 +1,40 @@ +#!/bin/sh +# vim: set sw=4 ts=4 sts=4 et : + +set -e + +CONFIG_DIR=/etc/postgresql + +data_directory=$( + runuser -u postgres -- postgres -D "${CONFIG_DIR}" -C data_directory +) +old_version=$(cat "${data_directory}"/PG_VERSION) +current_version=$(postgres --version | sed -r 's/.*\s+([0-9]+).*/\1/') + +if [ "${old_version}" = "${current_version}" ]; then + exit 0 +fi + +config_dir_old="${CONFIG_DIR}.${old_version}" +rm -rf "${config_dir_old}" +cp -a "${CONFIG_DIR}" "${config_dir_old}" + +sed -ri.orig \ + -e 's/data_directory\s*=\s*'\''(.*?)'\''/data_directory = '\''\1.'"${old_version}"\''/' \ + -e 's/^(\s*ssl\s*=\s*)(.*)$/\1off/' \ + "${config_dir_old}"/postgresql.conf +sed -i.orig \ + -e '$alocal all postgres peer' \ + -e d \ + "${config_dir_old}"/pg_hba.conf +mv "${data_directory}" "${data_directory}.${old_version}" +runuser -u postgres -- initdb -A peer --no-instructions "${data_directory}" + +runuser -u postgres -- pg_upgrade \ + -b "/usr/lib64/pgsql/postgresql-${old_version}"/bin \ + -B /usr/bin \ + -d "${config_dir_old}" \ + -D "${CONFIG_DIR}" \ + -o '-c restore_command= -c archive_command=' \ + -O '-c restore_command= -c archive_command=' \ + -k diff --git a/roles/postgresql-server/meta/main.yml b/roles/postgresql-server/meta/main.yml new file mode 100644 index 0000000..e2827fe --- /dev/null +++ b/roles/postgresql-server/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: +- systemd-base diff --git a/roles/postgresql-server/tasks/main.yml b/roles/postgresql-server/tasks/main.yml index 4b10045..e6cb8ae 100644 --- a/roles/postgresql-server/tasks/main.yml +++ b/roles/postgresql-server/tasks/main.yml @@ -1,6 +1,8 @@ - name: ensure postgresql-server is installed package: - name: postgresql-server + name: + - postgresql-server + - postgresql-upgrade state: present tags: - install @@ -130,6 +132,35 @@ tags: - systemd +- name: ensure postgresql-upgrade script is installed + copy: + src: postgresql-upgrade.sh + dest: /usr/local/libexec/postgresql-upgrade + owner: root + group: root + mode: u=rwx,go=rx + tags: + - postgresql-upgrade +- name: ensure postgresql-upgrade systemd unit is installed + copy: + src: postgresql-upgrade.service + dest: /etc/systemd/system/postgresql-upgrade.service + owner: root + group: root + mode: u=rw,go=r + notify: + - reload systemd + tags: + - postgresql-upgrade + - systemd + +- name: ensure postgresql-upgrade service starts when needed + service: + name: postgresql-upgrade + enabled: true + tags: + - postgresql-upgrade + - service - name: ensure postgresql starts at boot service: name: postgresql