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 {
|
return {
|
||||||
'list_prefix_suffix': self.list_prefix_suffix,
|
'list_prefix_suffix': self.list_prefix_suffix,
|
||||||
'list_prefix_path_suffix': self.list_prefix_path_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):
|
def list_prefix_suffix(self, values, prefix, suffix):
|
||||||
|
@ -17,3 +18,9 @@ class FilterModule(object):
|
||||||
for value in values:
|
for value in values:
|
||||||
result.append(f"{prefix}{value}{suffix}")
|
result.append(f"{prefix}{value}{suffix}")
|
||||||
return result
|
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"
|
echo " done"
|
||||||
done
|
done
|
||||||
|
|
||||||
echo "dumping all"
|
echo -n "dumping all ..."
|
||||||
sudo -u postgres pg_dumpall | gzip >"pg_dumpall.sql.gz"
|
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() {
|
||||||
install --owner=postgres --group=postgres --mode=600 \
|
install --owner=postgres --group=postgres --mode=600 \
|
||||||
"$CERTIFICATES_PATH/$domain.$1" \
|
"$CERTIFICATES_PATH/$domain.$1" \
|
||||||
"/var/lib/postgres/data/server.$1"
|
"/etc/postgresql/cert.$1"
|
||||||
}
|
}
|
||||||
|
|
||||||
_install crt
|
_install crt
|
||||||
_install key
|
_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
|
# 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" = {
|
"postgresql" = {
|
||||||
host = "node002"
|
host = "node001"
|
||||||
dns = [{
|
dns = [{
|
||||||
domain = "db.serguzim.me"
|
domain = "db.serguzim.me"
|
||||||
}]
|
}]
|
||||||
|
|
Loading…
Reference in a new issue