diff --git a/README.md b/README.md index 12d108a..e073db8 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,13 @@ Objects are configured via the following variables: - `postgresql_objects_databases`: A list of databases to create or drop. List items are dictionaries, keys match the [`postgresql_db`][pgdb] module parameters. +- `postgresql_objects_schemas`: A list of schemas to create or drop. List + items are dictionaries, keys are: + - `name`: name of schema (required) + - `authorization`: user to own schema (optional) + - `state`: `present` (default) or `absent` + - `database`: database to create schema in (required) + parameters. - `postgresql_objects_privileges`: A list of privileges to grant or revoke. List items are dictionaries, keys match the [`postgresql_privs`][pgprivs] module parameters. diff --git a/defaults/main.yml b/defaults/main.yml index 6186c91..36ca605 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -26,4 +26,5 @@ postgresql_objects_ignore_revoke_failure: true postgresql_objects_users: [] postgresql_objects_groups: [] postgresql_objects_databases: [] +postgresql_objects_schemas: [] postgresql_objects_privileges: [] diff --git a/tasks/main.yml b/tasks/main.yml index 14c7b62..1ddb7ef 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -20,6 +20,14 @@ failed_when: "postgresql_objects_ignore_revoke_failure and revoke.failed is defined and ((revoke.failed and 'does not exist' not in revoke.msg) or (revoke.failed and ',' in item.roles))" when: item.state is defined and item.state == 'absent' +- name: Drop Schemas + shell: echo DROP SCHEMA IF EXISTS '{{ item.name }}' | psql -w {{ '-h ' ~ postgresql_objects_login_host if postgresql_objects_login_host is defined else '' }} {{ '-U ' ~ postgresql_objects_login_user if postgresql_objects_login_user is defined else '' }} {{ '-p ' ~ postgresql_objects_port if postgresql_objects_port is defined else '' }} {{ item.database }} + register: psql + failed_when: psql.stderr.startswith( 'ERROR:' ) + changed_when: psql.stderr == '' + with_items: ' {{ postgresql_objects_schemas }}' + when: item.database is defined and item.name is defined and item.state is defined and item.state == 'absent' + # Drop databases first so later user drop can succeed - name: Drop databases postgresql_db: @@ -104,6 +112,14 @@ with_items: "{{ postgresql_objects_databases }}" when: item.state is not defined or (item.state is defined and item.state == 'present') +- name: Create Schemas + shell: echo CREATE SCHEMA IF NOT EXISTS '{{ item.name }}' {{ 'AUTHORIZATION '+item.authorization if item.authorization is defined}} | psql -w {{ '-h ' ~ postgresql_objects_login_host if postgresql_objects_login_host is defined else '' }} {{ '-U ' ~ postgresql_objects_login_user if postgresql_objects_login_user is defined else '' }} {{ '-p ' ~ postgresql_objects_port if postgresql_objects_port is defined else '' }} {{ item.database }} + register: psql + failed_when: psql.stderr.startswith( 'ERROR:' ) + changed_when: psql.stderr == '' + with_items: '{{ postgresql_objects_schemas }}' + when: item.database is defined and item.name is defined and item.state is not defined or item.state != 'absent' + - name: Grant user database privileges postgresql_user: name: "{{ item.name }}"