aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorPaul B <paul@bonaud.fr>2020-06-05 14:39:43 +0200
committerPaul B <paul@bonaud.fr>2020-06-05 14:39:43 +0200
commit0ca1cf044b84bdae8c47e2d764715dbd5e7e9d69 (patch)
treec76ddecb3b0434e45f481e8b0585e3b62ae31bb0
parent9e6f9658fbf5db657a2dd8465bf0ae4f41da161e (diff)
parentb722248ed7c4a7aba2b047855b983d72a9725209 (diff)
downloadansible-postgresql-role-master.tar.gz
ansible-postgresql-role-master.tar.zst
ansible-postgresql-role-master.zip
Merge branch 'standby-clone-pg_basebackup'HEADmaster
-rw-r--r--tasks/postgres-cluster.yml6
-rw-r--r--tasks/postgres-standby-barman.yml4
-rw-r--r--tasks/postgres-standby-basebackup.yml4
-rwxr-xr-xtemplates/standby-barman-clone.sh.j2 (renamed from templates/standby-clone.sh.j2)0
-rwxr-xr-xtemplates/standby-pg_basebackup-clone.sh.j249
5 files changed, 60 insertions, 3 deletions
diff --git a/tasks/postgres-cluster.yml b/tasks/postgres-cluster.yml
index a8e96c1..4f62d31 100644
--- a/tasks/postgres-cluster.yml
+++ b/tasks/postgres-cluster.yml
@@ -60,7 +60,11 @@
60 60
61- name: Add standby clone from barman script 61- name: Add standby clone from barman script
62 include: postgres-standby-barman.yml 62 include: postgres-standby-barman.yml
63 when: postgres_barman_server is defined 63 when: postgres_barman_server is defined and postgres_primary.restore_barman_directory is defined
64
65- name: Add standby clone from pg_basebackup
66 include: postgres-standby-basebackup.yml
67 when: postgres_primary and postgres_primary.pg_basebackup is defined
64 68
65- name: Determine SSD or rotational disks 69- name: Determine SSD or rotational disks
66 raw: 'lsblk --noheadings --nodeps --raw --output=rota | grep -q 1' 70 raw: 'lsblk --noheadings --nodeps --raw --output=rota | grep -q 1'
diff --git a/tasks/postgres-standby-barman.yml b/tasks/postgres-standby-barman.yml
index 6a94b75..fb71d32 100644
--- a/tasks/postgres-standby-barman.yml
+++ b/tasks/postgres-standby-barman.yml
@@ -11,8 +11,8 @@
11 path: "{{ postgres_barman_path_prefix | default('~') }}" 11 path: "{{ postgres_barman_path_prefix | default('~') }}"
12 rsync_password_file: "{{ postgres_barman_rsync_enabled | ternary(' --password-file=/var/lib/postgresql/.rsync_pass ', '') }}" 12 rsync_password_file: "{{ postgres_barman_rsync_enabled | ternary(' --password-file=/var/lib/postgresql/.rsync_pass ', '') }}"
13 13
14- name: Copy secondary script 14- name: Copy secondary barman clone script
15 template: src=standby-clone.sh.j2 dest=/root/standby-clone-{{ postgres_version }}-{{ postgres_cluster_name }}.sh mode=0755 15 template: src=standby-barman-clone.sh.j2 dest=/root/standby-clone-{{ postgres_version }}-{{ postgres_cluster_name }}.sh mode=0755
16 16
17- name: Copy rsync password file 17- name: Copy rsync password file
18 copy: 18 copy:
diff --git a/tasks/postgres-standby-basebackup.yml b/tasks/postgres-standby-basebackup.yml
new file mode 100644
index 0000000..db52d55
--- /dev/null
+++ b/tasks/postgres-standby-basebackup.yml
@@ -0,0 +1,4 @@
1---
2- name: Copy secondary pg_basebackup clone script
3 template: src=standby-pg_basebackup-clone.sh.j2 dest=/root/standby-clone-{{ postgres_version }}-{{ postgres_cluster_name }}.sh mode=0755
4 no_log: true
diff --git a/templates/standby-clone.sh.j2 b/templates/standby-barman-clone.sh.j2
index 2db44b6..2db44b6 100755
--- a/templates/standby-clone.sh.j2
+++ b/templates/standby-barman-clone.sh.j2
diff --git a/templates/standby-pg_basebackup-clone.sh.j2 b/templates/standby-pg_basebackup-clone.sh.j2
new file mode 100755
index 0000000..ca34a05
--- /dev/null
+++ b/templates/standby-pg_basebackup-clone.sh.j2
@@ -0,0 +1,49 @@
1#!/usr/bin/env bash
2# {{ ansible_managed }}
3
4set -eo pipefail
5
6CLUSTER_VERSION="{{ postgres_version }}"
7CLUSTER_NAME="{{ postgres_cluster_name }}"
8PRIMARY_CLUSTER_HOST="{{ postgres_primary.host }}"
9PRIMARY_CLUSTER_PORT="{{ postgres_primary.port }}"
10PRIMARY_CLUSTER_USER="{{ postgres_primary.replication_user }}"
11PRIMARY_CLUSTER_PASSWORD="{{ postgres_primary.replication_password }}"
12{% if postgres_primary.replication_dbname is defined %}
13PRIMARY_CLUSTER_DBNAME=" dbname='{{ postgres_primary.replication_dbname }}'"
14{% endif %}
15
16read -p "You are about to clone the primary cluster (${PRIMARY_CLUSTER_HOST}:${PRIMARY_CLUSTER_PORT}) with pg_basebackup. This will replace the local ${CLUSTER_VERSION}/${CLUSTER_NAME} cluster. Are you sure? [y/n] " -r go
17
18if [ "$go" != "y" ]; then
19 echo "Aborted."
20 exit 1
21fi
22
23BACKUP_DATE=$(date +%s)
24
25echo "Stopping PostgreSQL"
26pg_ctlcluster "${CLUSTER_VERSION}" "${CLUSTER_NAME}" stop || true
27
28echo "Cleaning up old cluster directory"
29sudo -u postgres mv "/var/lib/postgresql/${CLUSTER_VERSION}/${CLUSTER_NAME}"{,"_${BACKUP_DATE}"}
30
31echo "Creating new directory"
32sudo -u postgres mkdir -p "/var/lib/postgresql/${CLUSTER_VERSION}/${CLUSTER_NAME}"
33
34echo "Get backup from primary server"
35sudo -u postgres \
36 time "/usr/lib/postgresql/${CLUSTER_VERSION}/bin/pg_basebackup" --format=p -R \
37 -d "host='${PRIMARY_CLUSTER_HOST}' port='${PRIMARY_CLUSTER_PORT}' user='${PRIMARY_CLUSTER_USER}' password='${PRIMARY_CLUSTER_PASSWORD}' ${PRIMARY_CLUSTER_DBNAME} sslmode=require" \
38 -D "/var/lib/postgresql/${CLUSTER_VERSION}/${CLUSTER_NAME}/"
39
40echo "Restoring .conf and server certificate"
41sudo -u postgres cp -a "/var/lib/postgresql/${CLUSTER_VERSION}/${CLUSTER_NAME}_${BACKUP_DATE}/"{*.conf,server.crt,server.key} "/var/lib/postgresql/${CLUSTER_VERSION}/${CLUSTER_NAME}/"
42
43echo "Ensure rights are correcly set"
44chown -R postgres:postgres "/var/lib/postgresql/${CLUSTER_VERSION}/"
45chmod 0700 "/var/lib/postgresql/${CLUSTER_VERSION}/"
46chmod -R o-rwx "/var/lib/postgresql/${CLUSTER_VERSION}/"
47
48echo "Starting PostgreSQL"
49sudo pg_ctlcluster "${CLUSTER_VERSION}" "${CLUSTER_NAME}" start