aboutsummaryrefslogblamecommitdiff
path: root/modules/profile/manifests/postgresql/backup_replication.pp
blob: 1526123b2b8d854ff173401e88afb26e7cf50617 (plain) (tree)






























































                                                                          

                           




































































                                                                                                           


                                                                  

 
define profile::postgresql::backup_replication (
  String $base_path,
  Hash   $pg_infos,
  String $pg_user  = "postgres",
  String $pg_group = "postgres",
) {
  $host_cn = $title

  $host = find_host($facts["ldapvar"]["other"], $host_cn)
  if empty($host) {
    $pg_backup_host = $host_cn
  } elsif has_key($host["vars"], "host") {
    $pg_backup_host = $host["vars"]["host"][0]
  } else {
    $pg_backup_host = $host["vars"]["real_hostname"][0]
  }

  $pg_path = "$base_path/$pg_backup_host/postgresql"

  # Replication folder
  ensure_resource("file", "$base_path/$pg_backup_host", {
    ensure => directory,
  })

  file { $pg_path:
    ensure  => directory,
    owner   => $pg_user,
    group   => $pg_group,
    mode    => "0700",
    require => File["$base_path/$pg_backup_host"],
  }

  # pg_hba.conf
  profile::postgresql::base_pg_hba_rules { $pg_backup_host:
    pg_path => $pg_path
  }

  # postgresql.conf file and ssl
  concat { "$pg_path/postgresql.conf":
    owner => $pg_user,
    group => $pg_group,
    mode  => '0640',
    warn  => true,
  }

  if !empty($host) and has_key($host["vars"], "postgresql_backup_port") {
    $pg_listen_port = $host["vars"]["postgresql_backup_port"][0]

    profile::postgresql::ssl { $pg_path:
      certname             => $host_cn,
      handle_concat_config => true,
      before               => Service["postgresql_backup@$pg_backup_host"]
    }

    concat::fragment { "$pg_path/postgresql.conf listen":
      target  => "$pg_path/postgresql.conf",
      content => "listen_addresses = '*'\nport = $pg_listen_port\n",
    }

    profile::postgresql::replication { $host_cn:
      target => "$pg_path/pg_hba.conf",
    }
  } else {
    $pg_listen_port = undef

    concat::fragment { "$pg_path/postgresql.conf listen":
      target  => "$pg_path/postgresql.conf",
      content => "listen_addresses = ''\n",
    }
  }

  concat::fragment { "$pg_path/postgresql.conf paths":
    target  => "$pg_path/postgresql.conf",
    content => "unix_socket_directories = '$pg_path'\ndata_directory = '$pg_path'\nwal_level = logical\n",
  }

  $password_seed = lookup("base_installation::puppet_pass_seed")
  $pg_host = $pg_backup_host
  $pg_port = $pg_infos["dbport"]
  $ldap_cn = lookup("base_installation::ldap_cn")
  $ldap_password = generate_password(24, $password_seed, "ldap")
  $pg_slot = regsubst($ldap_cn, '-', "_", "G")

  # recovery.conf file
  $primary_conninfo  = "host=$pg_host port=$pg_port user=$ldap_cn password=$ldap_password sslmode=require"
  $primary_slot_name = $pg_slot
  $standby_mode      = "on"

  file { "$pg_path/recovery.conf":
    owner   => $pg_user,
    group   => $pg_group,
    mode    => '0640',
    content => template('postgresql/recovery.conf.erb'),
  }

  # Initial replication
  exec { "pg_basebackup $pg_path":
    cwd         => $pg_path,
    user        => $pg_user,
    creates     => "$pg_path/PG_VERSION",
    environment => ["PGPASSWORD=$ldap_password"],
    command     => "/usr/bin/pg_basebackup -w -h $pg_host -p $pg_port -U $ldap_cn -D $pg_path -S $pg_slot",
    before      => [
      Concat["$pg_path/pg_hba.conf"],
      File["$pg_path/recovery.conf"],
      Concat["$pg_path/postgresql.conf"],
    ]
  }

  # Service
  ensure_resource("file", "/etc/systemd/system/postgresql_backup@.service", {
    mode    => "0644",
    owner   => "root",
    group   => "root",
    content => template("profile/postgresql/postgresql_backup@.service.erb"),
  })

  service { "postgresql_backup@$pg_backup_host":
    enable  => true,
    ensure  => "running",
    require => [
      File["/etc/systemd/system/postgresql_backup@.service"],
      Concat["$pg_path/pg_hba.conf"],
      File["$pg_path/recovery.conf"],
      Concat["$pg_path/postgresql.conf"],
    ],
    subscribe => [
      Concat["$pg_path/pg_hba.conf"],
      File["$pg_path/recovery.conf"],
      Concat["$pg_path/postgresql.conf"],
    ]
  }

  # Dumps
  profile::postgresql::backup_dump { "$base_path/$pg_backup_host":
    pg_port => $pg_listen_port,
  }

}