PostgreSQL

Anleitung für den Fall, dass eine Postgres Datenbank zum lokalen Speichern von shibpid und storagerecords verwendet werden soll.

- name: "Install postgres"
  apt:
    name: "{{ item }}"
  loop:
    - postgresql
    - libpostgresql-jdbc-java
    - libpq-dev
    - python-psycopg2
  tags:
    - postgres

- name: Ensure german locale exists
  community.general.locale_gen:
    name: de_DE.UTF-8
    state: present
  tags:
    - postgres
  notify: restart postgresql

Der Handler ist einfach:

- name: restart postgresql
  service: name=postgresql state=restarted

Der folgende Block von Tasks erstellt eine geeignete Datenbank mit den entsprechenden Tabellen. Variablen: postgresql_username: shibboleth, postgresql_password: SETZMICH

- name: Create and initialize Postgres DB
  block:
    - name: Postgres - CREATE ROLE
      postgresql_user:
        name: "{{ postgresql_username }}"
        password: "{{ postgresql_password }}"
        role_attr_flags: CREATEROLE
        expires: infinity

    - name: Postgres - CREATE DATABASE
      community.postgresql.postgresql_db:
        name: "{{ postgresql_username }}"
        owner: "{{ postgresql_username }}"
        encoding: UTF-8
        lc_collate: de_DE.UTF-8
        lc_ctype: de_DE.UTF-8
        template: template0

    - name: Postgres - CREATE TABLE shibpid
      postgresql_table:
        db: "{{ postgresql_username }}"
        name: shibpid
        columns:
        - localEntity VARCHAR(1024) NOT NULL
        - peerEntity VARCHAR(1024) NOT NULL
        - principalName VARCHAR(255) NOT NULL
        - localId VARCHAR(255) NOT NULL
        - persistentId VARCHAR(36) NOT NULL
        - peerProvidedId VARCHAR(255) NULL
        - creationDate TIMESTAMP NOT NULL DEFAULT LOCALTIMESTAMP
        - deactivationDate TIMESTAMP NULL DEFAULT NULL
        - PRIMARY KEY (localEntity, peerEntity, persistentId)
        owner: "{{ postgresql_username }}"
        storage_params:
        - autovacuum_vacuum_scale_factor = 0.002  # fraction of table size before vacuum
        - autovacuum_analyze_scale_factor = 0.001 # fraction of table size before analyze

    - name: CREATE INDEX shibpid_getbysourcevalue_index
      postgresql_idx:
        db: "{{ postgresql_username }}"
        idxname: shibpid_getbysourcevalue_index
        table: shibpid
        columns:
        - localEntity
        - peerEntity
        - localId
        - deactivationDate

    - name: Postgres - CREATE TABLE storagerecords
      postgresql_table:
        db: "{{ postgresql_username }}"
        name: storagerecords
        columns:
        - context VARCHAR(255) NOT NULL
        - id VARCHAR(255) NOT NULL
        - expires BIGINT DEFAULT NULL
        - value TEXT NOT NULL
        - version BIGINT NOT NULL
        - PRIMARY KEY (context, id)
        owner: "{{ postgresql_username }}"
        storage_params:
        - autovacuum_vacuum_scale_factor = 0.002  # fraction of table size before vacuum
        - autovacuum_analyze_scale_factor = 0.001 # fraction of table size before analyze

    - name: CREATE INDEX storagerecords_expires_index
      postgresql_idx:
        db: "{{ postgresql_username }}"
        idxname: storagerecords_expires_index
        table: storagerecords
        columns:
        - expires

    - name: grant privileges to postgresql_user
      postgresql_privs:
        database: "{{ postgresql_username }}"
        roles: "{{ postgresql_username }}"
        privs: TEMPORARY,CONNECT,CREATE
        type: database

  when: new_postgres_db|default(false)|bool
  become: yes
  become_method: su
  become_user: postgres
  tags:
    - postgres

Soll eine vorhandene DB übertragen werden, benötigt man den oberen Block nicht, sondern kann einmalig auf dem Quellsystem einen Dump erstellen:

root@idp:~# su - postgres
postgres@idp:~$ psql
postgres@idp /tmp % pg_dumpall -c -f dump.out

Zwei Kniffe:

  • pg_dumpall arbeitet nicht mit pg_restore zusammen
  • Locale und Ctype werden nicht exportiert

Import auf Zielsystem:

dump.out editieren und die Zeile:

CREATE DATABASE shibboleth WITH TEMPLATE = template0 OWNER = shibboleth;

ergänzen zu:

CREATE DATABASE shibboleth WITH TEMPLATE = template0 OWNER = shibboleth LC_COLLATE = 'de_DE.UTF-8' LC_CTYPE = 'de_DE.UTF-8';

Dann DB auf Zielsystem einspielen:

postgres@idp-dev:~$ psql -f /tmp/dump.out

Da dies für gewöhnlich nur einmalig gemacht wird, existiert bisher keine Ansible Rolle. Falls jemand eine erstellt, gerne ergänzen / ersetzen.

  • Zuletzt geändert: vor 3 Jahren