Add postgresql role
This commit is contained in:
parent
4f97b66c3d
commit
56885d70b6
7 changed files with 152 additions and 4 deletions
|
@ -3,6 +3,7 @@ class FilterModule(object):
|
|||
return {
|
||||
'list_prefix_suffix': self.list_prefix_suffix,
|
||||
'list_prefix_path_suffix': self.list_prefix_path_suffix,
|
||||
'postgresql_restart_required': self.postgresql_restart_required,
|
||||
}
|
||||
|
||||
def list_prefix_suffix(self, values, prefix, suffix):
|
||||
|
@ -17,3 +18,9 @@ class FilterModule(object):
|
|||
for value in values:
|
||||
result.append(f"{prefix}{value}{suffix}")
|
||||
return result
|
||||
|
||||
def postgresql_restart_required(self, results):
|
||||
for result in results:
|
||||
if result.get('restart_required') and result.get('changed'):
|
||||
return True
|
||||
return False
|
||||
|
|
|
@ -11,5 +11,6 @@ do
|
|||
echo " done"
|
||||
done
|
||||
|
||||
echo "dumping all"
|
||||
echo -n "dumping all ..."
|
||||
sudo -u postgres pg_dumpall | gzip >"pg_dumpall.sql.gz"
|
||||
echo " done"
|
||||
|
|
29
playbooks/roles/backup/files/recovery/postgresql
Executable file
29
playbooks/roles/backup/files/recovery/postgresql
Executable file
|
@ -0,0 +1,29 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
target="$1"
|
||||
recovery_file="pg_dumpall.sql.gz"
|
||||
if [ -n "$target" ]; then
|
||||
recovery_file="pg_dump_$target.sql.gz"
|
||||
fi
|
||||
|
||||
tmp_dir=$(mktemp -d)
|
||||
recovery_file_path="$tmp_dir/opt/services/_backup/postgresql/$recovery_file"
|
||||
|
||||
cd /opt/services/backup/
|
||||
|
||||
echo "Restoring backup..."
|
||||
autorestic -c .autorestic.all.yml restore -l postgresql --from borgbase --to "$tmp_dir"
|
||||
echo "Backup restored."
|
||||
|
||||
echo "Recovery file: $recovery_file"
|
||||
|
||||
echo "Restoring database..."
|
||||
cat "$recovery_file_path" \
|
||||
| gunzip \
|
||||
| sudo -u postgres psql
|
||||
echo "Database restored."
|
||||
|
||||
echo "Removing temporary files..."
|
||||
rm -rf "$tmp_dir"
|
|
@ -5,12 +5,13 @@ domain="db.serguzim.me"
|
|||
_install() {
|
||||
install --owner=postgres --group=postgres --mode=600 \
|
||||
"$CERTIFICATES_PATH/$domain.$1" \
|
||||
"/var/lib/postgres/data/server.$1"
|
||||
"/etc/postgresql/cert.$1"
|
||||
}
|
||||
|
||||
_install crt
|
||||
_install key
|
||||
|
||||
sudo -u postgres pg_ctl -D /var/lib/postgres/data/ reload
|
||||
#sudo -u postgres pg_ctl -D /var/lib/postgres/data/ reload
|
||||
systemctl reload postgresql
|
||||
|
||||
# vim: ft=sh
|
||||
|
|
90
playbooks/roles/postgresql/tasks/main.yml
Normal file
90
playbooks/roles/postgresql/tasks/main.yml
Normal file
|
@ -0,0 +1,90 @@
|
|||
- name: Ensure directory for postgresql repo key exists
|
||||
ansible.builtin.file:
|
||||
path: "{{ postgresql_repo_key_dir }}"
|
||||
state: directory
|
||||
mode: "0755"
|
||||
become: true
|
||||
- name: Add postgresql repo key
|
||||
ansible.builtin.get_url:
|
||||
url: https://www.postgresql.org/media/keys/ACCC4CF8.asc
|
||||
dest: "{{ postgresql_repo_key_file }}"
|
||||
mode: "0644"
|
||||
become: true
|
||||
|
||||
- name: Add postgresql repo into sources list
|
||||
ansible.builtin.apt_repository:
|
||||
repo: deb [signed-by={{ postgresql_repo_key_file }}] https://apt.postgresql.org/pub/repos/apt {{ ansible_distribution_release }}-pgdg main
|
||||
state: present
|
||||
become: true
|
||||
|
||||
- name: Install postgresql
|
||||
ansible.builtin.apt:
|
||||
pkg:
|
||||
- postgresql-16
|
||||
- python3-psycopg
|
||||
state: present
|
||||
update_cache: true
|
||||
become: true
|
||||
|
||||
- name: Check out if postgresql is initialized
|
||||
ansible.builtin.stat:
|
||||
path: "{{ postgresql_data_dir }}"
|
||||
register: postgresql_data_stat
|
||||
become: true
|
||||
|
||||
- name: Initialize postgresql
|
||||
ansible.builtin.command: "{{ postgresql_bin_initdb }} -D {{ postgresql_data_dir }}"
|
||||
when: not postgresql_data_stat.stat.exists
|
||||
changed_when: true
|
||||
|
||||
- name: Replace everything with a new set of rules
|
||||
community.postgresql.postgresql_pg_hba:
|
||||
dest: "{{ postgresql_conf_pg_hba }}"
|
||||
overwrite: true # remove pre-existing rules
|
||||
|
||||
# defaults
|
||||
rules_behavior: combine
|
||||
contype: hostssl
|
||||
users: all
|
||||
databases: all
|
||||
method: scram-sha-256
|
||||
|
||||
rules:
|
||||
- contype: local
|
||||
users: postgres
|
||||
method: trust
|
||||
- contype: hostssl
|
||||
address: "0.0.0.0/0"
|
||||
- contype: hostssl
|
||||
address: "::/0"
|
||||
become: true
|
||||
register: pg_hba_reg
|
||||
|
||||
- name: Restart postgresql on pg_hba change
|
||||
ansible.builtin.systemd_service:
|
||||
state: restarted
|
||||
name: postgresql
|
||||
when: pg_hba_reg.changed # noqa: no-handler TODO can we add a handler here?
|
||||
become: true
|
||||
|
||||
- name: Start postgresql
|
||||
ansible.builtin.systemd_service:
|
||||
state: started
|
||||
name: postgresql
|
||||
become: true
|
||||
|
||||
- name: Set parameters
|
||||
community.postgresql.postgresql_set:
|
||||
login_unix_socket: /var/run/postgresql
|
||||
login_user: postgres
|
||||
name: "{{ item.name }}"
|
||||
value: "{{ item.value }}"
|
||||
loop: "{{ postgresql_set_vars | dict2items(key_name='name', value_name='value') }}"
|
||||
register: set
|
||||
|
||||
- name: Restart postgresql
|
||||
ansible.builtin.systemd_service:
|
||||
state: restarted
|
||||
name: postgresql
|
||||
when: set.results | postgresql_restart_required
|
||||
become: true
|
20
playbooks/roles/postgresql/vars/main.yml
Normal file
20
playbooks/roles/postgresql/vars/main.yml
Normal file
|
@ -0,0 +1,20 @@
|
|||
postgresql_version: 16
|
||||
|
||||
postgresql_repo_key_dir: /usr/share/postgresql-common/pgdg
|
||||
postgresql_repo_key_file: "{{ (postgresql_repo_key_dir, 'apt.postgresql.org.asc') | path_join }}"
|
||||
|
||||
postgresql_conf_dir: /etc/postgresql/{{ postgresql_version }}/main
|
||||
postgresql_conf_pg_hba: "{{ (postgresql_conf_dir, 'pg_hba.conf') | path_join }}"
|
||||
|
||||
postgresql_data_dir: /var/lib/postgresql/{{ postgresql_version }}/main
|
||||
|
||||
postgresql_bin_dir: /usr/lib/postgresql/{{ postgresql_version }}/bin
|
||||
postgresql_bin_initdb: "{{ (postgresql_bin_dir, 'initdb') | path_join }}"
|
||||
|
||||
postgresql_set_vars:
|
||||
listen_addresses: '*'
|
||||
ssl: true
|
||||
ssl_cert_file: /etc/postgresql/cert.crt
|
||||
ssl_key_file: /etc/postgresql/cert.key
|
||||
log_timezone: '{{ timezone }}'
|
||||
TimeZone: '{{ timezone }}'
|
|
@ -339,7 +339,7 @@ services = {
|
|||
},
|
||||
|
||||
"postgresql" = {
|
||||
host = "node002"
|
||||
host = "node001"
|
||||
dns = [{
|
||||
domain = "db.serguzim.me"
|
||||
}]
|
||||
|
|
Loading…
Reference in a new issue