63 lines
2.2 KiB
YAML
63 lines
2.2 KiB
YAML
---
|
|
- name: Create PostgreSQL init script directory
|
|
ansible.builtin.file:
|
|
path: /opt/church-website/postgres-init
|
|
state: directory
|
|
mode: "0755"
|
|
|
|
- name: Deploy database init script
|
|
ansible.builtin.template:
|
|
src: init-databases.sh.j2
|
|
dest: /opt/church-website/postgres-init/init-databases.sh
|
|
mode: "0755"
|
|
|
|
- name: Check if PostgreSQL container exists
|
|
ansible.builtin.shell: docker ps -a --filter name=^{{ postgres_container_name }}$ --format '{{ '{{' }}.Status{{ '}}' }}'
|
|
register: postgres_status
|
|
changed_when: false
|
|
|
|
- name: Start PostgreSQL container
|
|
ansible.builtin.shell: |
|
|
docker run -d \
|
|
--name {{ postgres_container_name }} \
|
|
--restart unless-stopped \
|
|
--network {{ docker_network }} \
|
|
-v {{ postgres_volume }}:/var/lib/postgresql/data \
|
|
-v /opt/church-website/postgres-init:/docker-entrypoint-initdb.d:ro \
|
|
-e POSTGRES_USER=postgres \
|
|
-e POSTGRES_PASSWORD={{ vault_postgres_root_password }} \
|
|
-p 127.0.0.1:5432:5432 \
|
|
{{ postgres_image }}
|
|
when: postgres_status.stdout == ""
|
|
|
|
- name: Wait for PostgreSQL to be ready
|
|
ansible.builtin.shell: docker exec {{ postgres_container_name }} pg_isready -U postgres
|
|
register: pg_ready
|
|
retries: 10
|
|
delay: 3
|
|
until: pg_ready.rc == 0
|
|
changed_when: false
|
|
|
|
- name: Create databases and users
|
|
ansible.builtin.shell: |
|
|
docker exec {{ postgres_container_name }} psql -U postgres -c "
|
|
DO \$\$
|
|
BEGIN
|
|
IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = '{{ item.user }}') THEN
|
|
CREATE ROLE {{ item.user }} WITH LOGIN PASSWORD '{{ item.password }}';
|
|
END IF;
|
|
END
|
|
\$\$;
|
|
"
|
|
docker exec {{ postgres_container_name }} psql -U postgres -tc "SELECT 1 FROM pg_database WHERE datname = '{{ item.name }}'" | grep -q 1 || \
|
|
docker exec {{ postgres_container_name }} psql -U postgres -c "CREATE DATABASE {{ item.name }} OWNER {{ item.user }}"
|
|
loop: "{{ databases }}"
|
|
loop_control:
|
|
label: "{{ item.name }}"
|
|
|
|
- name: Enable PostGIS extension on each database
|
|
ansible.builtin.shell: |
|
|
docker exec {{ postgres_container_name }} psql -U postgres -d {{ item.name }} -c "CREATE EXTENSION IF NOT EXISTS postgis;"
|
|
loop: "{{ databases }}"
|
|
loop_control:
|
|
label: "{{ item.name }}"
|