Skip to content

PostgresApp and Homebrew Postgres on MacOS #191

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Mar 9, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 9 additions & 6 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,12 @@ Available states
------------

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``
-------------------

Installs the PostgreSQL client binaries and libraries.
Installs the PostgreSQL client binaries and libraries on Linux.

``postgres.manage``
-------------------
Expand All @@ -33,18 +33,18 @@ See ``pillar.example`` file for details.
``postgres.python``
-------------------

Installs the PostgreSQL adapter for Python.
Installs the PostgreSQL adapter for Python on Linux.

``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.

``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:

.. code:: yaml
Expand Down Expand Up @@ -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
* ``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
installed from the upstream repository. Defaults to ``9.5``.
installed from the upstream Linux repository. Defaults to ``9.5``.

Testing
=======
The postgres state was tested on MacOS (El Capitan 10.11.6)

Testing is done with the ``kitchen-salt``.

Expand Down
11 changes: 10 additions & 1 deletion pillar.example
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ postgres:
# Version to install from upstream repository (if upstream_repo: True)
version: '9.6'

### MACOS
# Set to 'postgresapp' OR 'homebrew' for MacOS
#use_upstream_repo: 'postgresapp'
#use_upstream_repo: 'homebrew'

# PACKAGE
# These pillars are typically never required.
# pkg: 'postgresql'
Expand All @@ -14,11 +19,15 @@ postgres:
- postgresql-contrib
- postgresql-plpython


#'Alternatives system' priority incremental. 0 disables feature.
linux:
altpriority: 30

# macos limits
limits:
soft: 64000
hard: 64000

# POSTGRES
# Append the lines under this item to your postgresql.conf file.
# Pay attention to indent exactly with 4 spaces for all lines.
Expand Down
4 changes: 2 additions & 2 deletions postgres/client.sls
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
{%- endif %}
{%- endfor %}

{%- if postgres.use_upstream_repo %}
{%- if postgres.use_upstream_repo == true %}
include:
- postgres.upstream
{%- endif %}
Expand All @@ -16,7 +16,7 @@ include:
postgresql-client-libs:
pkg.installed:
- pkgs: {{ pkgs }}
{%- if postgres.use_upstream_repo %}
{%- if postgres.use_upstream_repo == true %}
- refresh: True
- require:
- pkgrepo: postgresql-repo
Expand Down
4 changes: 2 additions & 2 deletions postgres/codenamemap.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
#}

{# use upstream version if configured #}
{% if repo.use_upstream_repo %}
{% if repo.use_upstream_repo == true %}
{% set version = repo.version %}
{% endif %}

Expand Down Expand Up @@ -49,7 +49,7 @@
#}

{# use upstream version if configured #}
{% if repo.use_upstream_repo %}
{% if repo.use_upstream_repo == true %}
{% set version = repo.version %}
{% endif %}

Expand Down
17 changes: 17 additions & 0 deletions postgres/defaults.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ postgres:
pkg_dev: postgresql-devel
pkg_libpq_dev: postgresql-libs
python: python-psycopg2
userhomes: /home
systemuser:
user: postgres
group: postgres

Expand All @@ -21,6 +23,21 @@ postgres:
conf_dir: /var/lib/pgsql/data
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
acls:
# "local" is for Unix domain socket connections only
Expand Down
52 changes: 49 additions & 3 deletions postgres/dev.sls
Original file line number Diff line number Diff line change
@@ -1,13 +1,59 @@
{% 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:
pkg.installed:
- name: {{ postgres.pkg_dev }}
{% endif %}
{% endif %}

{% if postgres.pkg_libpq_dev %}
{% if postgres.pkg_libpq_dev %}
install-postgres-libpq-dev:
pkg.installed:
- 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 %}
5 changes: 5 additions & 0 deletions postgres/init.sls
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@

include:
{% if grains.os == 'MacOS' %}
- postgres.macos
{% else %}
- postgres.server
- postgres.client
- postgres.manage
{% endif %}
10 changes: 10 additions & 0 deletions postgres/macos/init.sls
Original file line number Diff line number Diff line change
@@ -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
64 changes: 64 additions & 0 deletions postgres/macos/postgresapp.sls
Original file line number Diff line number Diff line change
@@ -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

28 changes: 18 additions & 10 deletions postgres/osmap.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ RedHat:
gpgcheck: 1
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' %}

Expand Down Expand Up @@ -104,7 +104,7 @@ Suse:
gpgcheck: 1
gpgautoimport: True

{% if repo.use_upstream_repo %}
{% if repo.use_upstream_repo == true %}
{# Pillars needed are 'use_upstream_repo: True' and 'version: n.n'. #}
{# Avoid setting package names as pillars, as may corrupt postgres. #}
{% set lib_dir = '/var/lib/pgsql/' ~ repo.version ~ '/data' %}
Expand Down Expand Up @@ -133,18 +133,26 @@ Suse:

{% endif %}

{%- if grains.os == 'MacOS' %}
## jinja check avoids rendering noise/failure on Linux
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_client:
pkg_libpq_dev:
conf_dir: /usr/local/var/postgres
user: _postgres
group: _postgres
userhomes: /Users
user: {{ repo.user }}
group: {{ repo.group }}
conf_dir: /Users/{{ repo.user }}/Library/AppSupport/postgres_{{ repo.use_upstream_repo }}
prepare_cluster:
command: initdb -D /usr/local/var/postgres/
test: test -f /usr/local/var/postgres/PG_VERSION
user: _postgres
group: _postgres
command: initdb -D /Users/{{ repo.user }}/Library/AppSupport/postgres_{{ repo.use_upstream_repo }}
test: test -f /Users/{{ repo.user }}/Library/AppSupport/postgres_{{ repo.use_upstream_repo }}/PG_VERSION
user: {{ repo.user }}
group: {{ repo.group }}
{%- endif %}

# vim: ft=sls
8 changes: 8 additions & 0 deletions postgres/repo.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,12 @@ use_upstream_repo: {{ salt['pillar.get']('postgres:use_upstream_repo',
version: {{ salt['pillar.get']('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
Loading