Merge pull request #191 from noelmcloughlin/postgresApp

PostgresApp and Homebrew Postgres on MacOS
This commit is contained in:
N 2018-03-09 01:03:07 +00:00 committed by GitHub
commit 8031f745c4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 253 additions and 31 deletions

View file

@ -17,12 +17,12 @@ Available states
------------ ------------
Installs and configures both PostgreSQL server and client with creation of various DB objects in Installs and configures both PostgreSQL server and client with creation of various DB objects in
the cluster. the cluster. This state applies to both Linux and MacOS.
``postgres.client`` ``postgres.client``
------------------- -------------------
Installs the PostgreSQL client binaries and libraries. Installs the PostgreSQL client binaries and libraries on Linux.
``postgres.manage`` ``postgres.manage``
------------------- -------------------
@ -33,18 +33,18 @@ See ``pillar.example`` file for details.
``postgres.python`` ``postgres.python``
------------------- -------------------
Installs the PostgreSQL adapter for Python. Installs the PostgreSQL adapter for Python on Linux.
``postgres.server`` ``postgres.server``
------------------- -------------------
Installs the PostgreSQL server package, prepares the DB cluster and starts the server using Installs the PostgreSQL server package on Linux, prepares the DB cluster and starts the server using
packaged init script, job or unit. packaged init script, job or unit.
``postgres.server.image`` ``postgres.server.image``
------------------------- -------------------------
Installs the PostgreSQL server package, prepares the DB cluster and starts the server by issuing Installs the PostgreSQL server package on Linux, prepares the DB cluster and starts the server by issuing
raw ``pg_ctl`` command. The ``postgres:bake_image`` Pillar toggles this behaviour. For example: raw ``pg_ctl`` command. The ``postgres:bake_image`` Pillar toggles this behaviour. For example:
.. code:: yaml .. code:: yaml
@ -77,12 +77,15 @@ The state relies on the ``postgres:use_upstream_repo`` Pillar value which could
* ``True`` (default): adds the upstream repository to install packages from * ``True`` (default): adds the upstream repository to install packages from
* ``False``: makes sure that the repository configuration is absent * ``False``: makes sure that the repository configuration is absent
* ``'postgresapp'`` (MacOS) uses upstream PostgresApp package repository.
* ``'homebrew'`` (MacOS) uses Homebrew postgres
The ``postgres:version`` Pillar controls which version of the PostgreSQL packages should be The ``postgres:version`` Pillar controls which version of the PostgreSQL packages should be
installed from the upstream repository. Defaults to ``9.5``. installed from the upstream Linux repository. Defaults to ``9.5``.
Testing Testing
======= =======
The postgres state was tested on MacOS (El Capitan 10.11.6)
Testing is done with the ``kitchen-salt``. Testing is done with the ``kitchen-salt``.

View file

@ -5,6 +5,11 @@ postgres:
# Version to install from upstream repository (if upstream_repo: True) # Version to install from upstream repository (if upstream_repo: True)
version: '9.6' version: '9.6'
### MACOS
# Set to 'postgresapp' OR 'homebrew' for MacOS
#use_upstream_repo: 'postgresapp'
#use_upstream_repo: 'homebrew'
# PACKAGE # PACKAGE
# These pillars are typically never required. # These pillars are typically never required.
# pkg: 'postgresql' # pkg: 'postgresql'
@ -14,11 +19,15 @@ postgres:
- postgresql-contrib - postgresql-contrib
- postgresql-plpython - postgresql-plpython
#'Alternatives system' priority incremental. 0 disables feature. #'Alternatives system' priority incremental. 0 disables feature.
linux: linux:
altpriority: 30 altpriority: 30
# macos limits
limits:
soft: 64000
hard: 64000
# POSTGRES # POSTGRES
# Append the lines under this item to your postgresql.conf file. # Append the lines under this item to your postgresql.conf file.
# Pay attention to indent exactly with 4 spaces for all lines. # Pay attention to indent exactly with 4 spaces for all lines.

View file

@ -7,7 +7,7 @@
{%- endif %} {%- endif %}
{%- endfor %} {%- endfor %}
{%- if postgres.use_upstream_repo %} {%- if postgres.use_upstream_repo == true %}
include: include:
- postgres.upstream - postgres.upstream
{%- endif %} {%- endif %}
@ -16,7 +16,7 @@ include:
postgresql-client-libs: postgresql-client-libs:
pkg.installed: pkg.installed:
- pkgs: {{ pkgs }} - pkgs: {{ pkgs }}
{%- if postgres.use_upstream_repo %} {%- if postgres.use_upstream_repo == true %}
- refresh: True - refresh: True
- require: - require:
- pkgrepo: postgresql-repo - pkgrepo: postgresql-repo

View file

@ -16,7 +16,7 @@
#} #}
{# use upstream version if configured #} {# use upstream version if configured #}
{% if repo.use_upstream_repo %} {% if repo.use_upstream_repo == true %}
{% set version = repo.version %} {% set version = repo.version %}
{% endif %} {% endif %}
@ -49,7 +49,7 @@
#} #}
{# use upstream version if configured #} {# use upstream version if configured #}
{% if repo.use_upstream_repo %} {% if repo.use_upstream_repo == true %}
{% set version = repo.version %} {% set version = repo.version %}
{% endif %} {% endif %}

View file

@ -9,6 +9,8 @@ postgres:
pkg_dev: postgresql-devel pkg_dev: postgresql-devel
pkg_libpq_dev: postgresql-libs pkg_libpq_dev: postgresql-libs
python: python-psycopg2 python: python-psycopg2
userhomes: /home
systemuser:
user: postgres user: postgres
group: postgres group: postgres
@ -21,6 +23,21 @@ postgres:
conf_dir: /var/lib/pgsql/data conf_dir: /var/lib/pgsql/data
postgresconf: "" postgresconf: ""
macos:
archive: postgres.dmg
tmpdir: /tmp/postgrestmp
postgresapp:
#See: https://github.com/PostgresApp/PostgresApp/releases/
url: https://github.com/PostgresApp/PostgresApp/releases/download/v2.1.1/Postgres-2.1.1.dmg
sum: sha256=ac0656b522a58fd337931313f09509c09610c4a6078fe0b8e469e69af1e1750b
homebrew:
url:
sum:
dl:
opts: -s -L
interval: 60
retries: 2
pg_hba.conf: salt://postgres/templates/pg_hba.conf.j2 pg_hba.conf: salt://postgres/templates/pg_hba.conf.j2
acls: acls:
# "local" is for Unix domain socket connections only # "local" is for Unix domain socket connections only

View file

@ -1,13 +1,59 @@
{% from "postgres/map.jinja" import postgres with context %} {% from "postgres/map.jinja" import postgres with context %}
{% if postgres.pkg_dev %} {% if grains.os not in ('Windows', 'MacOS',) %}
{% if postgres.pkg_dev %}
install-postgres-dev-package: install-postgres-dev-package:
pkg.installed: pkg.installed:
- name: {{ postgres.pkg_dev }} - name: {{ postgres.pkg_dev }}
{% endif %} {% endif %}
{% if postgres.pkg_libpq_dev %} {% if postgres.pkg_libpq_dev %}
install-postgres-libpq-dev: install-postgres-libpq-dev:
pkg.installed: pkg.installed:
- name: {{ postgres.pkg_libpq_dev }} - name: {{ postgres.pkg_libpq_dev }}
{% endif %}
{% endif %}
{% if grains.os == 'MacOS' %}
# Darwin maxfiles limits
{% if postgres.limits.soft or postgres.limits.hard %}
postgres_maxfiles_limits_conf:
file.managed:
- name: /Library/LaunchDaemons/limit.maxfiles.plist
- source: salt://postgres/templates/limit.maxfiles.plist
- context:
soft_limit: {{ postgres.limits.soft or postgres.limits.hard }}
hard_limit: {{ postgres.limits.hard or postgres.limits.soft }}
- group: {{ postgres.group }}
{% endif %}
{% if postgres.use_upstream_repo == 'postgresapp' %}
# Shortcut for PostgresApp
postgres-desktop-shortcut-clean:
file.absent:
- name: '{{ postgres.userhomes }}/{{ postgres.user }}/Desktop/Postgres ({{ postgres.use_upstream_repo }})'
- require_in:
- file: postgres-desktop-shortcut-add
postgres-desktop-shortcut-add:
file.managed:
- name: /tmp/mac_shortcut.sh
- source: salt://postgres/templates/mac_shortcut.sh
- mode: 755
- template: jinja
- context:
user: {{ postgres.user }}
homes: {{ postgres.userhomes }}
cmd.run:
- name: '/tmp/mac_shortcut.sh "Postgres ({{ postgres.use_upstream_repo }})"'
- runas: {{ postgres.user }}
- require:
- file: postgres-desktop-shortcut-add
{% endif %}
{% endif %} {% endif %}

View file

@ -1,4 +1,9 @@
include: include:
{% if grains.os == 'MacOS' %}
- postgres.macos
{% else %}
- postgres.server - postgres.server
- postgres.client - postgres.client
- postgres.manage - postgres.manage
{% endif %}

10
postgres/macos/init.sls Normal file
View file

@ -0,0 +1,10 @@
{% from "postgres/map.jinja" import postgres with context %}
include:
{% if postgres.use_upstream_repo == 'postgresapp' %}
- postgres.macos.postgresapp
{% elif postgres.use_upstream_repo == 'homebrew' %}
- postgres.server
- postgres.client
{% endif %}
- postgres.dev

View file

@ -0,0 +1,64 @@
{% from "postgres/map.jinja" import postgres as pg with context %}
# Cleanup first
pg-remove-prev-archive:
file.absent:
- name: '{{ pg.macos.tmpdir }}/{{ pg.macos.archive }}'
- require_in:
- pg-extract-dirs
pg-extract-dirs:
file.directory:
- names:
- '{{ pg.macos.tmpdir }}'
- makedirs: True
- clean: True
- require_in:
- pg-download-archive
pg-download-archive:
pkg.installed:
- name: curl
cmd.run:
- name: curl {{ pg.macos.dl.opts }} -o '{{ pg.macos.tmpdir }}/{{ pg.macos.archive }}' {{ pg.macos.postgresapp.url }}
{% if grains['saltversioninfo'] >= [2017, 7, 0] %}
- retry:
attempts: {{ pg.macos.dl.retries }}
interval: {{ pg.macos.dl.interval }}
{% endif %}
{%- if pg.macos.postgresapp.sum %}
pg-check-archive-hash:
module.run:
- name: file.check_hash
- path: '{{ pg.macos.tmpdir }}/{{ pg.macos.archive }}'
- file_hash: {{ pg.macos.postgresapp.sum }}
- onchanges:
- cmd: pg-download-archive
- require_in:
- archive: pg-package-install
{%- endif %}
pg-package-install:
macpackage.installed:
- name: '{{ pg.macos.tmpdir }}/{{ pg.macos.archive }}'
- store: True
- dmg: True
- app: True
- force: True
- allow_untrusted: True
- onchanges:
- cmd: pg-download-archive
- require_in:
- file: pg-package-install
- file: pg-remove-archive
file.append:
- name: {{ pg.userhomes }}/{{ pg.user }}/.bash_profile
- text: 'export PATH=$PATH:/Applications/Postgres.app/Contents/Versions/latest/bin'
pg-remove-archive:
file.absent:
- name: '{{ pg.macos.tmpdir }}'
- onchanges:
- macpackage: pg-package-install

View file

@ -33,7 +33,7 @@ RedHat:
gpgcheck: 1 gpgcheck: 1
gpgkey: 'https://download.postgresql.org/pub/repos/yum/RPM-GPG-KEY-PGDG-{{ release }}' gpgkey: 'https://download.postgresql.org/pub/repos/yum/RPM-GPG-KEY-PGDG-{{ release }}'
{% if repo.use_upstream_repo %} {% if repo.use_upstream_repo == true %}
{% set data_dir = '/var/lib/pgsql/' ~ repo.version ~ '/data' %} {% set data_dir = '/var/lib/pgsql/' ~ repo.version ~ '/data' %}
@ -104,7 +104,7 @@ Suse:
gpgcheck: 1 gpgcheck: 1
gpgautoimport: True gpgautoimport: True
{% if repo.use_upstream_repo %} {% if repo.use_upstream_repo == true %}
{# Pillars needed are 'use_upstream_repo: True' and 'version: n.n'. #} {# Pillars needed are 'use_upstream_repo: True' and 'version: n.n'. #}
{# Avoid setting package names as pillars, as may corrupt postgres. #} {# Avoid setting package names as pillars, as may corrupt postgres. #}
{% set lib_dir = '/var/lib/pgsql/' ~ repo.version ~ '/data' %} {% set lib_dir = '/var/lib/pgsql/' ~ repo.version ~ '/data' %}
@ -133,18 +133,26 @@ Suse:
{% endif %} {% endif %}
{%- if grains.os == 'MacOS' %}
## jinja check avoids rendering noise/failure on Linux
MacOS: MacOS:
service: postgresql {%- if repo.use_upstream_repo == 'homebrew' %}
service: homebrew.mxcl.postgresql
{%- elif repo.use_upstream_repo == 'postgresapp' %}
service: com.postgresapp.Postgres2
{%- endif %}
pkg: postgresql pkg: postgresql
pkg_client: pkg_client:
pkg_libpq_dev: pkg_libpq_dev:
conf_dir: /usr/local/var/postgres userhomes: /Users
user: _postgres user: {{ repo.user }}
group: _postgres group: {{ repo.group }}
conf_dir: /Users/{{ repo.user }}/Library/AppSupport/postgres_{{ repo.use_upstream_repo }}
prepare_cluster: prepare_cluster:
command: initdb -D /usr/local/var/postgres/ command: initdb -D /Users/{{ repo.user }}/Library/AppSupport/postgres_{{ repo.use_upstream_repo }}
test: test -f /usr/local/var/postgres/PG_VERSION test: test -f /Users/{{ repo.user }}/Library/AppSupport/postgres_{{ repo.use_upstream_repo }}/PG_VERSION
user: _postgres user: {{ repo.user }}
group: _postgres group: {{ repo.group }}
{%- endif %}
# vim: ft=sls # vim: ft=sls

View file

@ -8,4 +8,12 @@ use_upstream_repo: {{ salt['pillar.get']('postgres:use_upstream_repo',
version: {{ salt['pillar.get']('postgres:version', version: {{ salt['pillar.get']('postgres:version',
defaults.postgres.version) }} defaults.postgres.version) }}
#Early lookup for system user on MacOS
{% if grains.os == 'MacOS' %}
{% set sysuser = salt['pillar.get']('postgres.user') or salt['cmd.run']("stat -f '%Su' /dev/console") %}
{% set sysgroup = salt['pillar.get']('postgres.group') or salt['cmd.run']("stat -f '%Sg' /dev/console") %}
user: {{ sysuser }}
group: {{ sysgroup }}
{% endif %}
# vim: ft=sls # vim: ft=sls

View file

@ -4,7 +4,7 @@
{%- if postgres.bake_image %} {%- if postgres.bake_image %}
{%- do includes.append('postgres.server.image') %} {%- do includes.append('postgres.server.image') %}
{%- endif %} {%- endif %}
{%- if postgres.use_upstream_repo -%} {%- if postgres.use_upstream_repo == true -%}
{%- do includes.append('postgres.upstream') %} {%- do includes.append('postgres.upstream') %}
{%- endif %} {%- endif %}
@ -18,14 +18,25 @@ include:
postgresql-server: postgresql-server:
pkg.installed: pkg.installed:
- pkgs: {{ pkgs }} - pkgs: {{ pkgs }}
{%- if postgres.use_upstream_repo %} {%- if postgres.use_upstream_repo == true %}
- refresh: True - refresh: True
- require: - require:
- pkgrepo: postgresql-repo - pkgrepo: postgresql-repo
{%- endif %} {%- endif %}
{%- if grains.os == 'MacOS' %}
#Register as Launchd LaunchAgent for system users
- require_in:
- file: postgresql-server
file.managed:
- name: /Library/LaunchAgents/{{ postgres.service }}.plist
- source: /usr/local/opt/postgres/{{ postgres.service }}.plist
- group: wheel
- require_in:
- service: postgresql-running
{%- else %}
# Alternatives system. Make server binaries available in $PATH # Alternatives system. Make server binaries available in $PATH
{%- if 'bin_dir' in postgres and postgres.linux.altpriority %} {%- if 'bin_dir' in postgres and postgres.linux.altpriority %}
{%- for bin in postgres.server_bins %} {%- for bin in postgres.server_bins %}
{%- set path = salt['file.join'](postgres.bin_dir, bin) %} {%- set path = salt['file.join'](postgres.bin_dir, bin) %}
@ -41,6 +52,8 @@ postgresql-server:
- cmd: postgresql-cluster-prepared - cmd: postgresql-cluster-prepared
{%- endfor %} {%- endfor %}
{%- endif %}
{%- endif %} {%- endif %}
postgresql-cluster-prepared: postgresql-cluster-prepared:
@ -59,6 +72,12 @@ postgresql-config-dir:
- name: {{ postgres.conf_dir }} - name: {{ postgres.conf_dir }}
- user: {{ postgres.user }} - user: {{ postgres.user }}
- group: {{ postgres.group }} - group: {{ postgres.group }}
- dir_mode: 775
- force: True
- file_mode: 644
- recurse:
- user
- group
- makedirs: True - makedirs: True
- require: - require:
- cmd: postgresql-cluster-prepared - cmd: postgresql-cluster-prepared
@ -134,7 +153,9 @@ postgresql-running:
service.running: service.running:
- name: {{ postgres.service }} - name: {{ postgres.service }}
- enable: True - enable: True
{% if grains.os not in ('MacOS',) %}
- reload: True - reload: True
{% endif %}
- watch: - watch:
- file: postgresql-pg_hba - file: postgresql-pg_hba

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>limit.maxfiles</string>
<key>ProgramArguments</key>
<array>
<string>/bin/launchctl</string>
<string>limit</string>
<string>maxfiles</string>
<string>{{ soft_limit }}</string>
<string>{{ hard_limit }}</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>

View file

@ -0,0 +1,8 @@
#!/usr/bin/env bash
shortcutName='${1}'
app="postgres.app"
Source="/Applications/$app"
Destination="{{ homes }}/{{ user }}/Desktop/${shortcutName}"
/usr/bin/osascript -e "tell application \"Finder\" to make alias file to POSIX file \"$Source\" at POSIX file \"$Destination\""

View file

@ -3,7 +3,7 @@
{%- if 'pkg_repo' in postgres -%} {%- if 'pkg_repo' in postgres -%}
{%- if postgres.use_upstream_repo -%} {%- if postgres.use_upstream_repo == true -%}
# Add upstream repository for your distro # Add upstream repository for your distro
postgresql-repo: postgresql-repo:
@ -25,9 +25,11 @@ postgresql-repo:
{%- else -%} {%- else -%}
# Notify that we don't manage this distro # Notify that we don't manage this distro
{% if grains.os not in ('Windows', 'MacOS',) %}
postgresql-repo: postgresql-repo:
test.show_notification: test.show_notification:
- text: | - text: |
PostgreSQL does not provide package repository for {{ grains['osfinger'] }} PostgreSQL does not provide package repository for {{ grains['osfinger'] }}
{% endif %}
{%- endif %} {%- endif %}