---
- name: Install postgresql and psycopg2
  apt:
    update_cache: true
    pkg:
      - postgresql
      - python3-psycopg2
    state: present
  register: apt_result
  retries: 3
  until: apt_result is succeeded

- name: Ensure main postgresql directory exists
  file:
    path: /etc/postgresql/{{ postgresql.version }}/main/
    state: directory
    owner: postgres
    group: postgres
    mode: 0755

- name: Ensure configuration directory exists
  file:
    path: /etc/postgresql/{{ postgresql.version }}/main/conf.d
    state: directory
    owner: postgres
    group: postgres
    mode: 0755

- name: Configuration of postgresql {{ postgresql.version }}
  template:
    src: postgresql/{{ item }}.j2
    dest: /etc/postgresql/{{ postgresql.version }}/main/{{ item }}
    mode: 0640
    owner: postgres
    group: postgres
  loop:
    - pg_hba.conf
    - pg_ident.conf
    - postgresql.conf
  notify:
    - Reload postgresql

- name: Enable and start PostgreSQL
  systemd:
    name: postgresql.service
    state: started
    enabled: true

- name: Create databases
  become: true
  become_user: postgres
  postgresql_db:
    name: "{{ item }}"
    encoding: UTF-8
    lc_collate: en_US.UTF-8
    lc_ctype: en_US.UTF-8
    template: template0
  loop: "{{ postgresql.databases | default([]) }}"

- name: Create users
  become: true
  become_user: postgres
  postgresql_user:
    db: "{{ item.database }}"
    name: "{{ item.name }}"
    password: "{{ item.password }}"
  no_log: true
  loop: "{{ postgresql.users | default([]) }}"

- name: Grant privileges to users
  become: true
  become_user: postgres
  postgresql_privs:
    db: postgres
    type: database
    role: "{{ item.name }}"
    privs: "{{ item.privs | join(',') }}"
    obj: "{{ item.database }}"
  no_log: true
  loop: "{{ postgresql.users | default([]) }}"
...