roles::postgresql::server now sets up postgres::cluster for all clusters
[mirror/dsa-puppet.git] / modules / postgres / manifests / cluster.pp
1 # postgresql cluster configuration
2 #
3 # @param pg_version      pg version of the cluster
4 # @param pg_cluster      cluster name
5 # @param pg_port         port of the postgres cluster
6 # @param manage_hba      manage pg_hba
7 # @param confdir         directory where the configuration resides
8 # @param backups         make backups of this cluster (unless it is recovering/a replication target)
9 define postgres::cluster(
10   Optional[Integer] $pg_port = undef,
11   Optional[String] $pg_cluster = undef,
12   Optional[String] $pg_version = undef,
13   Boolean $manage_hba = false,
14   String $confdir = "/etc/postgresql/${pg_version}/${pg_cluster}",
15   Boolean $backups = true,
16 ) {
17   # get remaining cluster info and verify consistency
18   ###
19   $clusters = $facts['postgresql_clusters']
20   if $pg_port {
21     $filtered = $clusters.filter |$cluster| { $cluster['port'] == $pg_port }
22     if $filtered.length != 1 {
23       fail("Did not find exactly one cluster with port ${pg_port}")
24     }
25     $cluster = $filtered[0]
26   } elsif $pg_cluster and $pg_version {
27     $filtered = $clusters.filter |$cluster| { $cluster['version'] == $pg_version and $cluster['cluster'] == $pg_cluster}
28     if $filtered.length != 1 {
29       fail("Did not find exactly one cluster ${pg_version}/${pg_cluster}")
30     }
31     $cluster = $filtered[0]
32   } else {
33     fail('postgres::cluster::hba_entry needs either the port of both a pg version and cluster name')
34   }
35   $real_port    = $cluster['port']
36   $real_version = $cluster['version']
37   $real_cluster = $cluster['cluster']
38   if $pg_version and $pg_version != $real_version {
39     fail("Inconsisten cluster version information: ${pg_version} != ${real_version}")
40   }
41   if $pg_cluster and $pg_cluster != $real_cluster {
42     fail("Inconsisten cluster name information: ${pg_cluster} != ${real_cluster}")
43   }
44   ###
45
46   # basic infra
47   ###
48   $reload = "postgresql ${real_version}/${real_cluster} reload"
49   exec { $reload:
50     command     => "systemctl reload postgresql@${real_version}-${real_cluster}.service",
51     refreshonly => true,
52   }
53   ferm::rule::simple { "postgres::cluster::hba_entry::${real_version}::${real_cluster}":
54     description => "check access to pg${real_version}/${real_cluster}",
55     port        => $real_port,
56     target      => "pg-${real_port}",
57   }
58   ###
59
60   if $backups and !$cluster['status']['recovery'] {
61     postgres::backup_cluster { "${real_version}::${real_cluster}":
62       pg_version => $real_version,
63       pg_cluster => $real_cluster,
64       pg_port    => $real_port,
65     }
66   }
67
68   # hba entries and firewall rules
69   Postgres::Cluster::Hba_entry <<| tag == "postgres::cluster::${real_version}::${real_cluster}::hba::${::fqdn}" |>>
70   Postgres::Cluster::Hba_entry <<| tag == "postgres::cluster::${real_port}::hba::${::fqdn}" |>>
71
72   if $manage_hba {
73     concat { "postgres::cluster::${real_version}::${real_cluster}::hba":
74       path           => "${confdir}/pg_hba.conf",
75       mode           => '0440',
76       group          => 'postgres',
77       ensure_newline => true,
78       notify         => Exec[$reload],
79     }
80     concat::fragment{ "postgres::cluster::pg_hba-head::${real_version}::${real_cluster}":
81       target  => "postgres::cluster::${real_version}::${real_cluster}::hba",
82       order   => '00',
83       content => template('postgres/cluster/pg_hba.conf-head.erb'),
84     }
85     Concat::Fragment <| tag == "postgres::cluster::${real_version}::${real_cluster}::hba" |>
86   }
87 }