Skip to content

Commit 3b1821a

Browse files
committed
Attempt to make restore PuppetDB work on replicas
Because the PuppetDB database exists separately on two PostgreSQL hosts in a DR configuration, adapt the restore plan to restore the data to BOTH locations, if they exist
1 parent 4b13c57 commit 3b1821a

File tree

1 file changed

+42
-27
lines changed

1 file changed

+42
-27
lines changed

plans/restore.pp

+42-27
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,20 @@
2727
$primary_target = peadm::get_targets(getvar('cluster.params.primary_host'), 1)
2828
$replica_target = peadm::get_targets(getvar('cluster.params.replica_host'), 1)
2929
$compiler_targets = peadm::get_targets(getvar('cluster.params.compiler_hosts'))
30-
$puppetdb_postgresql_target = getvar('cluster.params.primary_postgresql_host') ? {
31-
undef => $primary_target,
32-
default => peadm::get_targets(getvar('cluster.params.primary_postgresql_host'), 1),
33-
}
30+
31+
# Determine the array of targets to which the PuppetDB PostgreSQL database
32+
# should be restored to. This could be as simple as just the primary server,
33+
# or it could be two separate PostgreSQL servers.
34+
$puppetdb_postgresql_targets = peadm::flatten_compact([
35+
getvar('cluster.params.primary_postgresql_host') ? {
36+
undef => $primary_target,
37+
default => peadm::get_targets(getvar('cluster.params.primary_postgresql_host'), 1),
38+
},
39+
getvar('cluster.params.replica_postgresql_host') ? {
40+
undef => $replica_target,
41+
default => peadm::get_targets(getvar('cluster.params.replica_postgresql_host'), 1),
42+
},
43+
])
3444

3545
$puppetdb_targets = peadm::flatten_compact([
3646
$primary_target,
@@ -46,11 +56,13 @@
4656
&& tar -xzf ${shellquote($input_file)}
4757
| CMD
4858

59+
# Map of recovery option name to array of database hosts to restore the
60+
# relevant .dump content to.
4961
$restore_databases = {
50-
'orchestrator' => $primary_target,
51-
'activity' => $primary_target,
52-
'rbac' => $primary_target,
53-
'puppetdb' => $puppetdb_postgresql_target,
62+
'orchestrator' => [$primary_target],
63+
'activity' => [$primary_target],
64+
'rbac' => [$primary_target],
65+
'puppetdb' => $puppetdb_postgresql_targets,
5466
}.filter |$key,$_| {
5567
$recovery_opts[$key] == true
5668
}
@@ -106,65 +118,68 @@
106118
}
107119

108120
#$database_to_restore.each |Integer $index, Boolean $value | {
109-
$restore_databases.each |$name,$database_target| {
121+
$restore_databases.each |$name,$database_targets| {
110122
out::message("# Restoring ${name} database")
111123
$dbname = "pe-${shellquote($name)}"
112124

113125
# Drop pglogical extensions and schema if present
114-
run_command(@("CMD"/L), $database_target)
126+
run_command(@("CMD"/L), $database_targets)
115127
su - pe-postgres -s /bin/bash -c \
116128
"/opt/puppetlabs/server/bin/psql \
117129
--tuples-only \
118130
-d '${dbname}' \
119131
-c 'DROP SCHEMA IF EXISTS pglogical CASCADE;'"
120132
| CMD
121133

122-
run_command(@("CMD"/L), $database_target)
134+
run_command(@("CMD"/L), $database_targets)
123135
su - pe-postgres -s /bin/bash -c \
124136
"/opt/puppetlabs/server/bin/psql \
125137
-d '${dbname}' \
126138
-c 'DROP SCHEMA public CASCADE; CREATE SCHEMA public;'"
127139
| CMD
128140

129141
# To allow db user to restore the database grant temporary privileges
130-
run_command(@("CMD"/L), $database_target)
142+
run_command(@("CMD"/L), $database_targets)
131143
su - pe-postgres -s /bin/bash -c \
132144
"/opt/puppetlabs/server/bin/psql \
133145
-d '${dbname}' \
134146
-c 'ALTER USER \"${dbname}\" WITH SUPERUSER;'"
135147
| CMD
136148

137-
# Restore database
138-
run_command(@("CMD"/L), $primary_target)
139-
/opt/puppetlabs/server/bin/pg_restore \
140-
-d "sslmode=verify-ca \
141-
host=${shellquote($database_target.peadm::certname())} \
142-
sslcert=/etc/puppetlabs/puppetdb/ssl/${shellquote($primary_target.peadm::certname())}.cert.pem \
143-
sslkey=/etc/puppetlabs/puppetdb/ssl/${shellquote($primary_target.peadm::certname())}.private_key.pem \
144-
sslrootcert=/etc/puppetlabs/puppet/ssl/certs/ca.pem \
145-
dbname=${dbname} \
146-
user=${dbname}" \
147-
-Fd ${recovery_directory}/${name}/${dbname}.dump.d
148-
| CMD
149+
# Restore database. If there are multiple database restore targets, perform
150+
# the restore(s) in parallel.
151+
parallelize($database_targets) |$database_target| {
152+
run_command(@("CMD"/L), $primary_target)
153+
/opt/puppetlabs/server/bin/pg_restore \
154+
-d "sslmode=verify-ca \
155+
host=${shellquote($database_target.peadm::certname())} \
156+
sslcert=/etc/puppetlabs/puppetdb/ssl/${shellquote($primary_target.peadm::certname())}.cert.pem \
157+
sslkey=/etc/puppetlabs/puppetdb/ssl/${shellquote($primary_target.peadm::certname())}.private_key.pem \
158+
sslrootcert=/etc/puppetlabs/puppet/ssl/certs/ca.pem \
159+
dbname=${dbname} \
160+
user=${dbname}" \
161+
-Fd ${recovery_directory}/${name}/${dbname}.dump.d
162+
| CMD
163+
}
149164

150165
# Remove db user privileges post restore
151-
run_command(@("CMD"/L), $database_target)
166+
run_command(@("CMD"/L), $database_targets)
152167
su - pe-postgres -s /bin/bash -c \
153168
"/opt/puppetlabs/server/bin/psql \
154169
-d '${dbname}' \
155170
-c 'ALTER USER \"${dbname}\" WITH NOSUPERUSER;'"
156171
| CMD
157172

158173
# Drop pglogical extension and schema (again) if present after db restore
159-
run_command(@("CMD"/L), $database_target)
174+
run_command(@("CMD"/L), $database_targets)
160175
su - pe-postgres -s /bin/bash -c \
161176
"/opt/puppetlabs/server/bin/psql \
162177
--tuples-only \
163178
-d '${dbname}' \
164179
-c 'DROP SCHEMA IF EXISTS pglogical CASCADE;'"
165180
| CMD
166181

167-
run_command(@("CMD"/L), $database_target)
182+
run_command(@("CMD"/L), $database_targets)
168183
su - pe-postgres -s /bin/bash -c \
169184
"/opt/puppetlabs/server/bin/psql \
170185
-d '${dbname}' \

0 commit comments

Comments
 (0)