diff --git a/pillar.example b/pillar.example index 4aece09..eb34251 100644 --- a/pillar.example +++ b/pillar.example @@ -1,7 +1,7 @@ postgres: pg_hba.conf: salt://postgres/pg_hba.conf - use_upstream_repo: True + use_upstream_repo: False lookup: pkg: 'postgresql-9.3' diff --git a/postgres/client.sls b/postgres/client.sls index d171f9a..84b9e07 100644 --- a/postgres/client.sls +++ b/postgres/client.sls @@ -1,6 +1,6 @@ {% from "postgres/map.jinja" import postgres with context %} -{% if salt['pillar.get']('postgres:use_upstream_repo') %} +{% if postgres.use_upstream_repo %} include: - postgres.upstream {% endif %} @@ -8,7 +8,7 @@ include: install-postgresql-client: pkg.installed: - name: {{ postgres.pkg_client }} - - refresh: {{ salt['pillar.get']('postgres:use_upstream_repo', False) }} + - refresh: {{ postgres.use_upstream_repo }} {% if postgres.pkg_libpq_dev != False %} install-postgres-libpq-dev: diff --git a/postgres/codenamemap.yaml b/postgres/codenamemap.yaml new file mode 100644 index 0000000..8759e4c --- /dev/null +++ b/postgres/codenamemap.yaml @@ -0,0 +1,9 @@ +wheezy: + pkg_repo: deb http://apt.postgresql.org/pub/repos/apt/ wheezy-pgdg main +jessie: + version: 9.4 + pkg_repo: deb http://apt.postgresql.org/pub/repos/apt/ jessie-pgdg main +trusty: + version: 9.3 +utopic: + version: 9.4 diff --git a/postgres/defaults.yaml b/postgres/defaults.yaml new file mode 100644 index 0000000..fe9c3fa --- /dev/null +++ b/postgres/defaults.yaml @@ -0,0 +1,18 @@ +postgres: + pkg: postgresql + pkg_dev: postgresql-devel + pkg_libpq_dev: postgresql-libs + pkg_client: postgresql-client + pkg_contrib: postgresql-contrib + python: python-psycopg2 + service: postgresql + conf_dir: /var/lib/pgsql/data + create_cluster: False + init_db: False + version: 9.1 + use_upstream_repo: False + users: {} + acls: [] + databases: {} + postgresconf: "" + pg_hba.conf: salt://postgres/pg_hba.conf diff --git a/postgres/init.sls b/postgres/init.sls index f1a2009..2d444ed 100644 --- a/postgres/init.sls +++ b/postgres/init.sls @@ -1,6 +1,6 @@ {% from "postgres/map.jinja" import postgres with context %} -{% if salt['pillar.get']('postgres:use_upstream_repo') %} +{% if postgres.use_upstream_repo %} include: - postgres.upstream {% endif %} @@ -8,7 +8,7 @@ include: install-postgresql: pkg.installed: - name: {{ postgres.pkg }} - - refresh: {{ salt['pillar.get']('postgres:use_upstream_repo', False) }} + - refresh: {{ postgres.use_upstream_repo }} {% if postgres.create_cluster != False %} create-postgresql-cluster: @@ -57,25 +57,24 @@ install-postgres-contrib: - name: {{ postgres.pkg_contrib }} {% endif %} -{% if 'postgresconf' in pillar.get('postgres', {}) %} +{% if postgres.postgresconf %} postgresql-conf: file.blockreplace: - name: {{ postgres.conf_dir }}/postgresql.conf - marker_start: "# Managed by SaltStack: listen_addresses: please do not edit" - marker_end: "# Managed by SaltStack: end of salt managed zone --" - content: | - {{ salt['pillar.get']('postgres:postgresconf') | indent(8) }} + {{ postgres.postgresconf|indent(8) }} - show_changes: True - append_if_not_found: True - watch_in: - service: postgresql {% endif %} -{% if 'pg_hba.conf' in pillar.get('postgres', {}) %} pg_hba.conf: file.managed: - name: {{ postgres.conf_dir }}/pg_hba.conf - - source: {{ salt['pillar.get']('postgres:pg_hba.conf', 'salt://postgres/pg_hba.conf') }} + - source: {{ postgres['pg_hba.conf'] }} - template: jinja - user: postgres - group: postgres @@ -84,37 +83,32 @@ pg_hba.conf: - pkg: {{ postgres.pkg }} - watch_in: - service: postgresql -{% endif %} -{% if 'users' in pillar.get('postgres', {}) %} -{% for name, user in salt['pillar.get']('postgres:users').items() %} +{% for name, user in postgres.users.items() %} postgres-user-{{ name }}: postgres_user.present: - name: {{ name }} - - createdb: {{ salt['pillar.get']('postgres:users:' + name + ':createdb', False) }} - - password: {{ salt['pillar.get']('postgres:users:' + name + ':password', 'changethis') }} - - runas: postgres + - createdb: {{ user.get('createdb', False) }} + - password: {{ user.get('password', 'changethis') }} + - user: {{ user.get('runas', 'postgres') }} - require: - service: {{ postgres.service }} {% endfor%} -{% endif %} -{% if 'databases' in pillar.get('postgres', {}) %} -{% for name, db in salt['pillar.get']('postgres:databases').items() %} +{% for name, db in postgres.databases.items() %} postgres-db-{{ name }}: postgres_database.present: - name: {{ name }} - - encoding: {{ salt['pillar.get']('postgres:databases:'+ name +':encoding', 'UTF8') }} - - lc_ctype: {{ salt['pillar.get']('postgres:databases:'+ name +':lc_ctype', 'en_US.UTF8') }} - - lc_collate: {{ salt['pillar.get']('postgres:databases:'+ name +':lc_collate', 'en_US.UTF8') }} - - template: {{ salt['pillar.get']('postgres:databases:'+ name +':template', 'template0') }} - {% if salt['pillar.get']('postgres:databases:'+ name +':owner') %} - - owner: {{ salt['pillar.get']('postgres:databases:'+ name +':owner') }} + - encoding: {{ db.get('encoding', 'UTF8') }} + - lc_ctype: {{ db.get('lc_ctype', 'en_US.UTF8') }} + - lc_collate: {{ db.get('lc_collate', 'en_US.UTF8') }} + - template: {{ db.get('template', 'template0') }} + {% if db.get('owner') %} + - owner: {{ db.get('owner') }} {% endif %} - - runas: {{ salt['pillar.get']('postgres:databases:'+ name +':runas', 'postgres') }} - {% if salt['pillar.get']('postgres:databases:'+ name +':user') %} + - user: {{ db.get('runas', 'postgres') }} + {% if db.get('user') %} - require: - - postgres_user: postgres-user-{{ salt['pillar.get']('postgres:databases:'+ name +':user') }} + - postgres_user: postgres-user-{{ db.get('user') }} {% endif %} {% endfor%} -{% endif %} diff --git a/postgres/map.jinja b/postgres/map.jinja index 543b4ab..415e344 100644 --- a/postgres/map.jinja +++ b/postgres/map.jinja @@ -1,54 +1,22 @@ -{% set pg_version = salt['grains.filter_by']({ - 'RedHat' : { 'id': '9.1' }, - 'Arch' : { 'id': '9.1' }, - 'Debian' : { 'id': '9.3' }, -}, merge=salt['grains.filter_by']({ - '14.04' : { 'id': '9.3' }, - '14.10' : { 'id': '9.4' }, -}, grain='lsb_distrib_release', merge=salt['grains.filter_by']({ - 'jessie' : { 'id': '9.4' }, - 'wheezy' : { 'id': '9.1' }, -}, grain='lsb_distrib_codename', merge=salt['pillar.get']('postgres:lookup')))) %} +{% import_yaml "postgres/defaults.yaml" as defaults %} +{% import_yaml "postgres/osmap.yaml" as osmap %} +{% import_yaml "postgres/codenamemap.yaml" as codemap %} -{% set postgres = salt['grains.filter_by']({ - 'RedHat': { - 'pkg' : 'postgresql-server', - 'pkg_dev' : 'postgresql-devel', - 'pkg_libpq_dev' : 'postgresql-libs', - 'pkg_client' : 'postgresql-client', - 'python' : 'python-psycopg2', - 'service' : 'postgresql', - 'conf_dir' : '/var/lib/pgsql/data', - 'create_cluster' : False, - 'init_db' : True, - 'version' : pg_version.id, - }, - 'Arch': { - 'pkg' : 'postgresql', - 'pkg_dev' : 'postgresql-devel', - 'pkg_libpq_dev' : 'postgresql-libs', - 'pkg_client' : 'postgresql-client', - 'python' : 'python-psycopg2', - 'service' : 'postgresql', - 'conf_dir' : '/var/lib/pgsql/data', - 'create_cluster' : False, - 'init_db' : True, - 'version' : pg_version.id, - }, - 'Debian': { - 'pkg' : 'postgresql-' + pg_version.id, - 'pkg_dev' : 'postgresql-server-dev-' + pg_version.id, - 'pkg_libpq_dev' : 'libpq-dev', - 'pkg_client' : 'postgresql-client-'+ pg_version.id, - 'pkg_contrib' : 'postgresql-contrib-' + pg_version.id, - 'pkg_repo' : 'deb http://apt.postgresql.org/pub/repos/apt/ ' + grains['lsb_distrib_codename'] + '-pgdg main', - 'pkg_repo_file' : '/etc/apt/sources.list.d/pgdg.list', - 'python' : 'python-pygresql', - 'service' : 'postgresql', - 'pg_hba' : '/etc/postgresql/' + pg_version.id + '/main/pg_hba.conf', - 'conf_dir' : '/etc/postgresql/' + pg_version.id + '/main', - 'create_cluster' : False, - 'init_db' : False, - 'version' : pg_version.id, - }, -}, merge=salt['pillar.get']('postgres:lookup')) %} +{# get the settings for the os_family grain #} +{% set osfam = salt['grains.filter_by'](osmap) or {} %} +{# get the settings for the oscodename grain, os_family data will override + oscodename data #} +{% set oscode = salt['grains.filter_by'](codemap, + grain='oscodename', + merge=osfam) or {} %} + +{# merge the os family/codename specific data over the defaults #} +{% do defaults.postgres.update(oscode) %} + +{# merge the pillar:lookup dict into the defaults/os specific dict #} +{% set lookup = salt['pillar.get']('postgres:lookup', + default=defaults.postgres, + merge=True) %} + +{# merge the actual postgres pillar into the above combined dict #} +{% set postgres = salt['pillar.get']('postgres', default=lookup, merge=True) %} diff --git a/postgres/osmap.yaml b/postgres/osmap.yaml new file mode 100644 index 0000000..dc4224e --- /dev/null +++ b/postgres/osmap.yaml @@ -0,0 +1,6 @@ +RedHat: + pkg_repo: pgdg94 + repo_baseurl: http://yum.postgresql.org/9.4/redhat/rhel-$releasever-$basearch +Arch: {} +Debian: + pkg_repo_file: /etc/apt/sources.list.d/pgdg.list diff --git a/postgres/upstream.sls b/postgres/upstream.sls index d5da6da..14ec148 100644 --- a/postgres/upstream.sls +++ b/postgres/upstream.sls @@ -1,11 +1,14 @@ {% from "postgres/map.jinja" import postgres with context %} -{% if grains['os'] == 'Ubuntu' %} # Other distro support should be added here +{% if grains['os_family'] == 'Debian' %} install-postgresql-repo: pkgrepo.managed: - humanname: PostgreSQL Official Repository - - name: {{ postgres.pkg_repo }} + - name: {{ postgres.pkg_repo }} {{ postgres.version }} - keyid: B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8 - keyserver: keyserver.ubuntu.com - file: {{ postgres.pkg_repo_file }} + - require_in: + - pkg: {{ postgres.pkg }} {% endif %} +