Skip to content

Commit 234a76f

Browse files
author
Denys Havrysh
committed
Manage PostgreSQL entities with client.sls states
1 parent 523d10c commit 234a76f

File tree

5 files changed

+186
-183
lines changed

5 files changed

+186
-183
lines changed

README.rst

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,26 @@ Available states
1616
``postgres``
1717
------------
1818

19-
Installs the PostgreSQL server package and prepares the DB cluster.
19+
Installs and configures both PostgreSQL server and client with creation of
20+
various DB objects in the cluster.
2021

2122
``postgres.client``
2223
-------------------
2324

2425
Installs the PostgreSQL client binaries and libraries.
26+
Allows to create such DB objects as: users, tablespaces, databases, schemas and
27+
extensions. See ``pillar.example`` file for details.
2528

2629
``postgres.python``
2730
-------------------
2831

2932
Installs the PostgreSQL adapter for Python.
3033

34+
``postgres.server``
35+
-------------------
36+
37+
Installs the PostgreSQL server package and prepares the DB cluster.
38+
3139
``postgres.upstream``
3240
---------------------
3341

pillar.example

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ postgres:
88
pkg: 'postgresql-9.3'
99
pkg_client: 'postgresql-client-9.3'
1010

11-
# Addtional packages to install, this should be in a list format
11+
# Additional packages to install with PostgreSQL server,
12+
# this should be in a list format
1213
pkgs_extra:
1314
- postgresql-contrib
1415
- postgresql-plpython

postgres/client.sls

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{%- from "postgres/map.jinja" import postgres with context -%}
2+
{%- from "postgres/macros.jinja" import format_state with context -%}
23
34
{%- set pkgs = [] %}
45
{%- for pkg in (postgres.pkg_client, postgres.pkg_libpq_dev) %}
@@ -7,13 +8,15 @@
78
{%- endif %}
89
{%- endfor -%}
910
10-
{%- if postgres.use_upstream_repo %}
11+
{%- if postgres.use_upstream_repo -%}
1112
1213
include:
1314
- postgres.upstream
1415
1516
{%- endif %}
1617
18+
# Install PostgreSQL client and libraries
19+
1720
postgresql-client-libs:
1821
pkg.installed:
1922
- pkgs: {{ pkgs }}
@@ -43,3 +46,78 @@ postgresql-client-libs:
4346
{%- endfor %}
4447
4548
{%- endif %}
49+
50+
# Ensure that Salt is able to use postgres modules
51+
# after installing client binaries
52+
53+
postgres-reload-modules:
54+
test.nop:
55+
- reload_modules: True
56+
57+
# User states
58+
59+
{%- for name, user in postgres.users|dictsort() %}
60+
61+
{{ format_state(name, 'postgres_user', user) }}
62+
- require:
63+
- pkg: postgresql-client-libs
64+
65+
{%- endfor %}
66+
67+
# Tablespace states
68+
69+
{%- for name, tblspace in postgres.tablespaces|dictsort() %}
70+
71+
{{ format_state(name, 'postgres_tablespace', tblspace) }}
72+
- require:
73+
- pkg: postgresql-client-libs
74+
{%- if 'owner' in tblspace %}
75+
- postgres_user: postgres_user-{{ tblspace.owner }}
76+
{%- endif %}
77+
78+
{%- endfor %}
79+
80+
# Database states
81+
82+
{%- for name, db in postgres.databases|dictsort() %}
83+
84+
{{ format_state(name, 'postgres_database', db) }}
85+
- require:
86+
- pkg: postgresql-client-libs
87+
{%- if 'owner' in db %}
88+
- postgres_user: postgres_user-{{ db.owner }}
89+
{%- endif %}
90+
{%- if 'tablespace' in db %}
91+
- postgres_tablespace: postgres_tablespace-{{ db.tablespace }}
92+
{%- endif %}
93+
94+
{%- endfor %}
95+
96+
# Schema states
97+
98+
{%- for name, schema in postgres.schemas|dictsort() %}
99+
100+
{{ format_state(name, 'postgres_schema', schema) }}
101+
- require:
102+
- pkg: postgresql-client-libs
103+
{%- if 'owner' in schema %}
104+
- postgres_user: postgres_user-{{ schema.owner }}
105+
{%- endif %}
106+
107+
{%- endfor %}
108+
109+
# Extension states
110+
111+
{%- for name, extension in postgres.extensions|dictsort() %}
112+
113+
{{ format_state(name, 'postgres_extension', extension) }}
114+
- require:
115+
- pkg: postgresql-client-libs
116+
{%- if 'maintenance_db' in extension %}
117+
- postgres_database: postgres_database-{{ extension.maintenance_db }}
118+
{%- endif %}
119+
{%- if 'schema' in extension %}
120+
- postgres_schema: postgres_schema-{{ extension.schema }}
121+
{%- endif %}
122+
123+
{%- endfor %}

postgres/init.sls

Lines changed: 2 additions & 180 deletions
Original file line numberDiff line numberDiff line change
@@ -1,181 +1,3 @@
1-
# -*- mode: yaml -*-
2-
3-
{%- from "postgres/map.jinja" import postgres with context -%}
4-
{%- from "postgres/macros.jinja" import format_state with context -%}
5-
6-
{%- if postgres.use_upstream_repo %}
7-
81
include:
9-
- postgres.upstream
10-
11-
{%- endif %}
12-
13-
### Installation states
14-
15-
postgresql-server:
16-
pkg.installed:
17-
- name: {{ postgres.pkg }}
18-
{%- if postgres.use_upstream_repo %}
19-
- refresh: True
20-
- require:
21-
- pkgrepo: postgresql-repo
22-
{%- endif %}
23-
24-
# make sure the data directory and contents have been initialized
25-
postgresql-cluster-prepared:
26-
cmd.run:
27-
- name: {{ postgres.prepare_cluster.command }}
28-
- cwd: /
29-
- runas: {{ postgres.prepare_cluster.user }}
30-
- env: {{ postgres.prepare_cluster.env|default({}) }}
31-
- unless:
32-
- {{ postgres.prepare_cluster.test }}
33-
- require:
34-
- pkg: postgresql-server
35-
36-
postgresql-config-dir:
37-
file.directory:
38-
- name: {{ postgres.conf_dir }}
39-
- user: {{ postgres.user }}
40-
- group: {{ postgres.group }}
41-
- makedirs: True
42-
- require:
43-
- cmd: postgresql-cluster-prepared
44-
45-
{%- if postgres.postgresconf %}
46-
47-
postgresql-conf:
48-
file.blockreplace:
49-
- name: {{ postgres.conf_dir }}/postgresql.conf
50-
- marker_start: "# Managed by SaltStack: listen_addresses: please do not edit"
51-
- marker_end: "# Managed by SaltStack: end of salt managed zone --"
52-
- content: |
53-
{{ postgres.postgresconf|indent(8) }}
54-
- show_changes: True
55-
- append_if_not_found: True
56-
- backup: {{ postgres.postgresconf_backup }}
57-
- watch_in:
58-
- service: postgresql-running
59-
- require:
60-
- file: postgresql-config-dir
61-
62-
{%- endif %}
63-
64-
postgresql-pg_hba:
65-
file.managed:
66-
- name: {{ postgres.conf_dir }}/pg_hba.conf
67-
- source: {{ postgres['pg_hba.conf'] }}
68-
- template: jinja
69-
- user: {{ postgres.user }}
70-
- group: {{ postgres.group }}
71-
- mode: 600
72-
- require:
73-
- file: postgresql-config-dir
74-
75-
postgresql-running:
76-
service.running:
77-
- name: {{ postgres.service }}
78-
- enable: True
79-
- reload: True
80-
- watch:
81-
- file: postgresql-pg_hba
82-
83-
postgresql-extra-pkgs-installed:
84-
pkg.installed:
85-
- pkgs: {{ postgres.pkgs_extra }}
86-
87-
### User states
88-
89-
{%- for name, user in postgres.users|dictsort() %}
90-
91-
{{ format_state(name, 'postgres_user', user) }}
92-
- require:
93-
- service: postgresql-running
94-
{%- if 'db_user' in user %}
95-
- postgres_user: postgres_user-{{ user.db_user }}
96-
{%- endif %}
97-
98-
{%- endfor %}
99-
100-
### Tablespace states
101-
102-
{%- for name, tblspace in postgres.tablespaces|dictsort() %}
103-
104-
postgres_tablespace-dir-{{ tblspace.directory}}:
105-
file.directory:
106-
- name: {{ tblspace.directory }}
107-
- user: {{ postgres.user }}
108-
- group: {{ postgres.group }}
109-
- mode: 700
110-
- makedirs: True
111-
- recurse:
112-
- user
113-
- group
114-
115-
{{ format_state(name, 'postgres_tablespace', tblspace) }}
116-
- require:
117-
- file: postgres_tablespace-dir-{{ tblspace.directory }}
118-
{%- if 'owner' in tblspace %}
119-
- postgres_user: postgres_user-{{ tblspace.owner }}
120-
{%- endif %}
121-
- service: postgresql-running
122-
123-
{%- endfor %}
124-
125-
### Database states
126-
127-
{%- for name, db in postgres.databases|dictsort() %}
128-
129-
{{ format_state(name, 'postgres_database', db) }}
130-
- require:
131-
- service: postgresql-running
132-
{%- if 'db_user' in db %}
133-
- postgres_user: postgres_user-{{ db.db_user }}
134-
{%- endif %}
135-
{%- if 'owner' in db %}
136-
- postgres_user: postgres_user-{{ db.owner }}
137-
{%- endif %}
138-
{%- if 'tablespace' in db %}
139-
- postgres_tablespace: postgres_tablespace-{{ db.tablespace }}
140-
{%- endif %}
141-
142-
{%- endfor %}
143-
144-
### Schema states
145-
146-
{%- for name, schema in postgres.schemas|dictsort() %}
147-
148-
{{ format_state(name, 'postgres_schema', schema) }}
149-
- require:
150-
- service: postgresql-running
151-
{%- if 'db_user' in schema %}
152-
- postgres_user: postgres_user-{{ schema.db_user }}
153-
{%- endif %}
154-
{%- if 'dbname' in schema %}
155-
- postgres_database: postgres_database-{{ schema.dbname }}
156-
{%- endif %}
157-
{%- if 'owner' in schema %}
158-
- postgres_user: postgres_user-{{ schema.owner }}
159-
{%- endif %}
160-
161-
{%- endfor %}
162-
163-
### Extension states
164-
165-
{%- for name, extension in postgres.extensions|dictsort() %}
166-
167-
{{ format_state(name, 'postgres_extension', extension) }}
168-
- require:
169-
- service: postgresql-running
170-
- pkg: postgresql-extra-pkgs-installed
171-
{%- if 'db_user' in extension %}
172-
- postgres_user: postgres_user-{{ extension.db_user }}
173-
{%- endif %}
174-
{%- if 'maintenance_db' in extension %}
175-
- postgres_database: postgres_database-{{ extension.maintenance_db }}
176-
{%- endif %}
177-
{%- if 'schema' in extension %}
178-
- postgres_schema: postgres_schema-{{ extension.schema }}
179-
{%- endif %}
180-
181-
{%- endfor %}
2+
- postgres.server
3+
- postgres.client

0 commit comments

Comments
 (0)