X-Git-Url: https://git.adam-barratt.org.uk/?a=blobdiff_plain;f=modules%2Fpostgres%2Fmanifests%2Fcluster.pp;h=92f87d1608e1c26bbf1963189980b2ce89ab764b;hb=961cef0eaa20ab1fc2bf6f770432d1e8a31be274;hp=a57f5433f9cd6d434bc36c5b968e33e165a8d9df;hpb=6d314df91bf2f73b895e096dde7eb882d4653904;p=mirror%2Fdsa-puppet.git diff --git a/modules/postgres/manifests/cluster.pp b/modules/postgres/manifests/cluster.pp index a57f5433f..92f87d160 100644 --- a/modules/postgres/manifests/cluster.pp +++ b/modules/postgres/manifests/cluster.pp @@ -5,38 +5,87 @@ # @param pg_port port of the postgres cluster # @param manage_hba manage pg_hba # @param confdir directory where the configuration resides +# @param backups make backups of this cluster (unless it is recovering/a replication target) define postgres::cluster( - String $pg_version, - String $pg_cluster = 'main', - Integer $pg_port = 5432, + Optional[Integer] $pg_port = undef, + Optional[String] $pg_cluster = undef, + Optional[String] $pg_version = undef, Boolean $manage_hba = false, String $confdir = "/etc/postgresql/${pg_version}/${pg_cluster}", + Boolean $backups = true, ) { - $reload = "postgresql ${pg_version}/${pg_cluster} reload" + # get remaining cluster info and verify consistency + ### + $clusters = $facts['postgresql_clusters'] + if $pg_port { + $filtered = $clusters.filter |$cluster| { $cluster['port'] == $pg_port } + if $filtered.length != 1 { + fail("Did not find exactly one cluster with port ${pg_port}") + } + $cluster = $filtered[0] + } elsif $pg_cluster and $pg_version { + $filtered = $clusters.filter |$cluster| { $cluster['version'] == $pg_version and $cluster['cluster'] == $pg_cluster} + if $filtered.length != 1 { + fail("Did not find exactly one cluster ${pg_version}/${pg_cluster}") + } + $cluster = $filtered[0] + } else { + fail('postgres::cluster::hba_entry needs either the port of both a pg version and cluster name') + } + $real_port = $cluster['port'] + $real_version = $cluster['version'] + $real_cluster = $cluster['cluster'] + if $pg_version and $pg_version != $real_version { + fail("Inconsisten cluster version information: ${pg_version} != ${real_version}") + } + if $pg_cluster and $pg_cluster != $real_cluster { + fail("Inconsisten cluster name information: ${pg_cluster} != ${real_cluster}") + } + ### + + # basic infra + ### + $reload = "postgresql ${real_version}/${real_cluster} reload" exec { $reload: - command => "systemctl reload postgresql@${pg_version}-${pg_cluster}.service", + command => "systemctl reload postgresql@${real_version}-${real_cluster}.service", refreshonly => true, } + ferm::rule::chain { "postgres::cluster::hba_entry::chain::pg-${real_port}": + description => "chain for pg${real_version}/${real_cluster}", + chain => "pg-${real_port}", + } + ferm::rule::simple { "postgres::cluster::hba_entry::${real_version}::${real_cluster}": + description => "check access to pg${real_version}/${real_cluster}", + port => $real_port, + target => "pg-${real_port}", + } + ### - ferm::rule::simple { "postgres::cluster::hba_entry::${pg_version}::${pg_cluster}": - description => "check access to pg${pg_version}/${pg_cluster}", - port => $pg_port, - target => "pg-${pg_port}", + if $backups and !$cluster['status']['recovery'] { + postgres::backup_cluster { "${real_version}::${real_cluster}": + pg_version => $real_version, + pg_cluster => $real_cluster, + pg_port => $real_port, + } } + # hba entries and firewall rules + Postgres::Cluster::Hba_entry <<| tag == "postgres::cluster::${real_version}::${real_cluster}::hba::${::fqdn}" |>> + Postgres::Cluster::Hba_entry <<| tag == "postgres::cluster::${real_port}::hba::${::fqdn}" |>> + if $manage_hba { - concat { "postgres::cluster::${pg_version}::${pg_cluster}::hba": + concat { "postgres::cluster::${real_version}::${real_cluster}::hba": path => "${confdir}/pg_hba.conf", mode => '0440', group => 'postgres', ensure_newline => true, notify => Exec[$reload], } - concat::fragment{ "postgres::cluster::pg_hba-head::${pg_version}::${pg_cluster}": - target => "postgres::cluster::${pg_version}::${pg_cluster}::hba", + concat::fragment{ "postgres::cluster::pg_hba-head::${real_version}::${real_cluster}": + target => "postgres::cluster::${real_version}::${real_cluster}::hba", order => '00', content => template('postgres/cluster/pg_hba.conf-head.erb'), } - Concat::Fragment <| tag == "postgres::cluster::${pg_version}::${pg_cluster}::hba" |> + Concat::Fragment <| tag == "postgres::cluster::${real_version}::${real_cluster}::hba" |> } }