====== PostgreSQL ====== Anleitung für den Fall, dass eine Postgres Datenbank zum lokalen Speichern von ''shibpid'' und ''storagerecords'' verwendet werden soll. ===== Installation der Abhängigkeiten ===== - 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 ===== Erstellen der Datenbank ===== ==== Leere Datenbank ==== 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 ==== Vorhandene Postgres DB übernehmen ==== 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.