Merge pull request #119 from vutny/use-state-arguments-in-pillar

Map Pillar dicts for PostgreSQL entities to the Salt state arguments
This commit is contained in:
Javier Bértoli 2016-09-12 05:55:33 -03:00 committed by GitHub
commit 1cfa7e0085
6 changed files with 152 additions and 200 deletions

View file

@ -31,11 +31,39 @@ postgres:
# METHOD could be omitted, 'md5' will be appended by default. # METHOD could be omitted, 'md5' will be appended by default.
acls: acls:
- ['local', 'db1', 'localUser'] - ['local', 'db1', 'localUser']
- ['host', 'db2', 'remoteUser', '123.123.0.0/24'] - ['host', 'db2', 'remoteUser', '192.168.33.0/24']
# PostgreSQL service name # PostgreSQL service name
service: postgresql service: postgresql
# Create/remove users, tablespaces, databases, schema and extensions.
# Each of these dictionaries contains PostgreSQL entities which
# mapped to the `postgres_*` Salt states with arguments. See the Salt
# documentaion to get all supported argument for a particular state.
#
# Format is the following:
#
#<users|tablespaces|databases|schemas|extensions>:
# NAME:
# ensure: <present|absent> # 'present' is the default
# ARGUMENT: VALUE
# ...
#
# where 'NAME' is the state name, 'ARGUMENT' is the kwarg name, and
# 'VALUE' is kwarg value.
#
# For example, the Pillar:
#
#users:
# testUser:
# password: test
#
# will render such state:
#
#postgres_user-testUser:
# postgres_user.present:
# - name: testUser
# - password: test
users: users:
localUser: localUser:
ensure: present ensure: present
@ -57,12 +85,6 @@ postgres:
absentUser: absentUser:
ensure: absent ensure: absent
password: '98ruj923h4rf'
createdb: False
createroles: False
createuser: False
inherit: True
replication: False
tablespaces: tablespaces:
my_space: my_space:
@ -75,26 +97,27 @@ postgres:
template: 'template0' template: 'template0'
lc_ctype: 'en_US.UTF-8' lc_ctype: 'en_US.UTF-8'
lc_collate: 'en_US.UTF-8' lc_collate: 'en_US.UTF-8'
# optional schemas to enable on database
schemas:
uuid_ossp:
owner: localUser
# optional extensions to enable on database
extensions:
uuid-ossp:
schema: uuid_ossp
db2: db2:
owner: 'localUser' owner: 'remoteUser'
user: 'remoteUser'
template: 'template0' template: 'template0'
lc_ctype: 'en_US.UTF-8' lc_ctype: 'en_US.UTF-8'
lc_collate: 'en_US.UTF-8' lc_collate: 'en_US.UTF-8'
tablespace: 'my_space' tablespace: 'my_space'
# optional extensions to enable on database
# extensions:
# postgis:
# backup extension defaults to .bak if postgresconf_backup is True. # optional schemas to enable on database
schemas:
uuid_ossp:
dbname: db1
owner: localUser
# optional extensions to install in schema
extensions:
uuid-ossp:
schema: uuid_ossp
maintenance_db: db1
#postgis: {}
# Backup extension defaults to .bak if postgresconf_backup is True.
# Set to False to stop creation of backup on postgresql.conf changes. # Set to False to stop creation of backup on postgresql.conf changes.
postgresconf_backup: True postgresconf_backup: True
# This section will append your configuration to postgresql.conf. # This section will append your configuration to postgresql.conf.

View file

@ -1,8 +1,8 @@
{% macro ubuntu_block(name, version) %} {% macro ubuntu_block(name, version) %}
{% if salt['pillar.get']('postgres:use_upstream_repo', False) %} {% if salt['pillar.get']('postgres:use_upstream_repo', False) %}
{% set version = salt['pillar.get']('postgres:version', '9.5') %} {% set version = salt['pillar.get']('postgres:version', '9.5') %}
{% endif %} {% endif %}
{{ name }}: {{ name }}:
pkg_repo: deb http://apt.postgresql.org/pub/repos/apt/ {{ name }}-pgdg main pkg_repo: deb http://apt.postgresql.org/pub/repos/apt/ {{ name }}-pgdg main

View file

@ -19,8 +19,10 @@ postgres:
- ['host', 'all', 'all', '::1/128', 'md5'] - ['host', 'all', 'all', '::1/128', 'md5']
service: postgresql service: postgresql
users: {} users: {}
databases: {}
tablespaces: {} tablespaces: {}
databases: {}
schemas: {}
extensions: {}
postgresconf_backup: True postgresconf_backup: True
postgresconf: "" postgresconf: ""

View file

@ -1,6 +1,7 @@
# -*- mode: yaml -*- # -*- mode: yaml -*-
{%- from "postgres/map.jinja" import postgres with context -%} {%- from "postgres/map.jinja" import postgres with context -%}
{%- from "postgres/macros.jinja" import format_state with context -%}
{%- if postgres.use_upstream_repo %} {%- if postgres.use_upstream_repo %}
@ -9,6 +10,8 @@ include:
{%- endif %} {%- endif %}
### Installation states
postgresql-installed: postgresql-installed:
pkg.installed: pkg.installed:
- name: {{ postgres.pkg }} - name: {{ postgres.pkg }}
@ -77,195 +80,98 @@ postgresql-extra-pkgs-installed:
pkg.installed: pkg.installed:
- pkgs: {{ postgres.pkgs_extra }} - pkgs: {{ postgres.pkgs_extra }}
{% for name, user in postgres.users.items() %} ### User states
postgresql-user-{{ name }}:
{% if user.get('ensure', 'present') == 'absent' %} {%- for name, user in postgres.users|dictsort() %}
postgres_user.absent:
- name: {{ name }} {{ format_state(name, 'postgres_user', user) }}
- user: {{ user.get('runas', postgres.user) }}
{% if user.get('user') %}
- db_user: {{ user.user }}
{% endif %}
{% else %}
postgres_user.present:
- name: {{ name }}
- createdb: {{ user.get('createdb', False) }}
- createroles: {{ user.get('createroles', False) }}
- createuser: {{ user.get('createuser', False) }}
- inherit: {{ user.get('inherit', True) }}
- replication: {{ user.get('replication', False) }}
- password: {{ user.password }}
- superuser: {{ user.get('superuser', False) }}
- user: {{ user.get('runas', postgres.user) }}
{% if user.get('user') %}
- db_user: {{ user.get('runas', postgres.user) }}
{% endif %}
{% endif %}
- require: - require:
- service: postgresql-running - service: postgresql-running
{% if user.get('user') %} {%- if 'db_user' in user %}
- postgres_user: postgresql-user-{{ user.user }} - postgres_user: postgres_user-{{ user.db_user }}
{% endif %} {%- endif %}
{% endfor %}
{% for name, tblspace in postgres.tablespaces.items() %} {%- endfor %}
postgresql-tablespace-dir-perms-{{ tblspace.directory}}:
### Tablespace states
{%- for name, tblspace in postgres.tablespaces|dictsort() %}
postgres_tablespace-dir-{{ tblspace.directory}}:
file.directory: file.directory:
- name: {{ tblspace.directory }} - name: {{ tblspace.directory }}
- user: {{ postgres.user }} - user: {{ postgres.user }}
- group: {{ postgres.group }} - group: {{ postgres.group }}
- mode: 700
- makedirs: True - makedirs: True
- recurse: - recurse:
- user - user
- group - group
postgresql-tablespace-{{ name }}: {{ format_state(name, 'postgres_tablespace', tblspace) }}
postgres_tablespace.present:
- name: {{ name }}
- directory: {{ tblspace.directory }}
- user: {{ tblspace.get('runas', postgres.user) }}
{% if tblspace.get('db_user') %}
- db_user: {{ tblspace.db_user }}
{% endif %}
{% if tblspace.get('db_password') %}
- db_password: {{ tblspace.db_password }}
{% endif %}
{% if tblspace.get('db_host') %}
- db_host: {{ tblspace.db_host }}
{% endif %}
{% if tblspace.get('db_port') %}
- db_port: {{ tblspace.db_port }}
{% endif %}
{% if tblspace.get('owner') %}
- owner: {{ tblspace.owner }}
{% endif %}
- require: - require:
- file: postgres_tablespace-dir-{{ tblspace.directory }}
{%- if 'owner' in tblspace %}
- postgres_user: postgres_user-{{ tblspace.owner }}
{%- endif %}
- service: postgresql-running - service: postgresql-running
- file: postgresql-tablespace-dir-perms-{{ tblspace.directory}}
{% endfor %}
{% for name, db in postgres.databases.items() %} {%- endfor %}
postgresql-db-{{ name }}:
{% if db.get('ensure', 'present') == 'absent' %}
postgres_database.absent:
- name: {{ name }}
- user: {{ db.get('runas', postgres.user) }}
{% if db.get('user') %}
- db_user: {{ db.user }}
{% endif %}
- require:
- service: postgresql-running
{% else %}
postgres_database.present:
- name: {{ name }}
{% if 'encoding' in db %}
- encoding: {{ db.encoding }}
{% endif %}
{% if 'lc_ctype' in db %}
- lc_ctype: {{ db.lc_ctype }}
{% endif %}
{% if 'lc_collate' in db %}
- lc_collate: {{ db.lc_collate }}
{% endif %}
- template: {{ db.get('template', 'template0') }}
- tablespace: {{ db.get('tablespace', 'pg_default') }}
{% if db.get('owner') %}
- owner: {{ db.owner }}
{% endif %}
- user: {{ db.get('runas', postgres.user) }}
{% if db.get('db_user') %}
- db_user: {{ db.db_user }}
{% endif %}
{% if db.get('db_password') %}
- db_password: {{ db.db_password }}
{% endif %}
{% if db.get('db_host') %}
- db_host: {{ db.db_host }}
{% endif %}
{% if db.get('db_port') %}
- db_port: {{ db.db_port }}
{% endif %}
- require:
- service: postgresql-running
{% if db.get('user') %}
- postgres_user: postgresql-user-{{ db.user }}
{% endif %}
{% if db.get('owner') %}
- postgres_user: postgresql-user-{{ db.owner }}
{% endif %}
{% if db.get('tablespace') %}
- postgres_tablespace: postgresql-tablespace-{{ db.get('tablespace') }}
{% endif %}
{# NOTE: postgres_schema doesn't have a 'runas' equiv. at all #} ### Database states
{% for schema_name, schema in db.get('schemas', dict()).items() %}
postgresql-schema-{{ schema_name }}-for-db-{{ name }}:
{% if schema.get('ensure', 'present') == 'absent' %}
postgres_schema.absent:
- name: {{ schema_name }}
{% if schema.get('user') %}
- db_user: {{ schema.user }}
{% endif %}
- require:
- service: postgresql-running
{% else %}
postgres_schema.present:
- name: {{ schema_name }}
- dbname: {{ name }}
{% if schema.get('user') %}
- db_user: {{ schema.user }}
{% endif %}
{% if schema.get('owner') %}
- owner: {{ schema.owner }}
{% endif %}
- require:
- service: postgresql-running
- postgres_database: postgresql-db-{{ name }}
{% if schema.get('user') %}
- postgres_user: postgresql-user-{{ schema.user }}
{% endif %}
{% if schema.get('owner') %}
- postgres_user: postgresql-user-{{ schema.owner }}
{% endif %}
{% endif %}
{% endfor %}
{% for ext_name, ext in db.get('extensions', dict()).items() %} {%- for name, db in postgres.databases|dictsort() %}
postgresql-ext-{{ ext_name }}-for-db-{{ name }}:
{% if ext.get('ensure', 'present') == 'absent' %}
postgres_extension.absent:
- name: {{ ext_name }}
- user: {{ ext.get('runas', postgres.user) }}
{% if ext.get('user') %}
- db_user: {{ ext.user }}
{% endif %}
- require:
- service: postgresql-running
{% else %}
postgres_extension.present:
- name: {{ ext_name }}
- user: {{ ext.get('runas', postgres.user) }}
{% if ext.get('user') %}
- db_user: {{ ext.user }}
{% endif %}
{% if ext.get('version') %}
- ext_version: {{ ext.version }}
{% endif %}
{% if ext.get('schema') %}
- schema: {{ ext.schema }}
{% endif %}
- maintenance_db: {{ name }}
- require:
- service: postgresql-running
- postgres_database: postgresql-db-{{ name }}
{% if ext.get('user') %}
- postgres_user: postgresql-user-{{ ext.user }}
{% endif %}
{% if ext.get('schema') %}
- postgres_schema: postgresql-schema-{{ ext.schema }}-for-db-{{ name }}
{% endif %}
{% endif %}
{% endfor %}
{% endif %} {{ format_state(name, 'postgres_database', db) }}
{% endfor %} - require:
- service: postgresql-running
{%- if 'db_user' in db %}
- postgres_user: postgres_user-{{ db.db_user }}
{%- endif %}
{%- if 'owner' in db %}
- postgres_user: postgres_user-{{ db.owner }}
{%- endif %}
{%- if 'tablespace' in db %}
- postgres_tablespace: postgres_tablespace-{{ db.tablespace }}
{%- endif %}
{%- endfor %}
### Schema states
{%- for name, schema in postgres.schemas|dictsort() %}
{{ format_state(name, 'postgres_schema', schema) }}
- require:
- service: postgresql-running
{%- if 'db_user' in schema %}
- postgres_user: postgres_user-{{ schema.db_user }}
{%- endif %}
{%- if 'dbname' in schema %}
- postgres_database: postgres_database-{{ schema.dbname }}
{%- endif %}
{%- if 'owner' in schema %}
- postgres_user: postgres_user-{{ schema.owner }}
{%- endif %}
{%- endfor %}
### Extension states
{%- for name, extension in postgres.extensions|dictsort() %}
{{ format_state(name, 'postgres_extension', extension) }}
- require:
- service: postgresql-running
- pkg: postgresql-extra-pkgs-installed
{%- if 'db_user' in extension %}
- postgres_user: postgres_user-{{ extension.db_user }}
{%- endif %}
{%- if 'maintenance_db' in extension %}
- postgres_database: postgres_database-{{ extension.maintenance_db }}
{%- endif %}
{%- if 'schema' in extension %}
- postgres_schema: postgres_schema-{{ extension.schema }}
{%- endif %}
{%- endfor %}

21
postgres/macros.jinja Normal file
View file

@ -0,0 +1,21 @@
{%- from "postgres/map.jinja" import postgres with context -%}
{%- macro format_state(name, state, kwarg) %}
{%- do kwarg.update({'name': name}) %}
{%- if 'ensure' in kwarg %}
{%- set ensure = kwarg.pop('ensure') %}
{%- endif %}
{%- if 'user' not in kwarg and state != 'postgres_schema' %}
{%- do kwarg.update({'user': postgres.user}) %}
{%- endif -%}
{{ state }}-{{ name }}:
{{ state }}.{{ ensure|default('present') }}:
{%- for k, v in kwarg|dictsort() %}
- {{ k }}: {{ v }}
{%- endfor %}
{%- endmacro %}
# vim: ft=sls

View file

@ -19,5 +19,5 @@ describe file('/srv/my_tablespace') do
end end
describe command(%q{su - postgres -c 'psql -qtc "\l+ db2"'}) do describe command(%q{su - postgres -c 'psql -qtc "\l+ db2"'}) do
its(:stdout) { should match(/db2.*localUser.*UTF8.*en_US\.UTF-8.*en_US\.UTF-8.*my_space/) } its(:stdout) { should match(/db2.*remoteUser.*UTF8.*en_US\.UTF-8.*en_US\.UTF-8.*my_space/) }
end end