From b4edec9f4350f5408f13778f6ef3fe57e830c25c Mon Sep 17 00:00:00 2001 From: Denys Havrysh Date: Tue, 20 Sep 2016 15:44:49 +0300 Subject: [PATCH 1/2] Ensure upstream repo is configured or absent depending on `use_upstream_repo` --- README.rst | 40 +++++++++++++++++++++++------------ postgres/codenamemap.yaml | 16 +++++++------- postgres/defaults.yaml | 4 ++-- postgres/macros.jinja | 14 ++++++++++--- postgres/osmap.yaml | 23 +++++++++++++------- postgres/upstream.sls | 44 +++++++++++++++++++++------------------ 6 files changed, 88 insertions(+), 53 deletions(-) diff --git a/README.rst b/README.rst index 71ebb2d..47e5191 100644 --- a/README.rst +++ b/README.rst @@ -16,40 +16,54 @@ Available states ``postgres`` ------------ -Installs the postgresql package. - -``postgres.python`` -------------------- - -Installs the postgresql python module +Installs the PostgreSQL server package and prepares the DB cluster. ``postgres.client`` ------------------- -Installs the postgresql client +Installs the PostgreSQL client binaries and libraries. + +``postgres.python`` +------------------- + +Installs the PostgreSQL adapter for Python. + +``postgres.upstream`` +--------------------- + +Configures the PostgreSQL Official (upstream) repository on target system if +applicable. + +The state relies on the ``postgres:use_upstream_repo`` Pillar value which could +be set as following: + +* ``False`` (default): makes sure that the repository configuration is absent +* ``True``: adds the upstream repository to install packages from + +The ``postgres:version`` Pillar controls which version of the PostgreSQL +packages should be installed from the upstream repository. Defaults to ``9.5``. Testing ======= -Testing is done wit kitchen-salt +Testing is done with the ``kitchen-salt``. ``kitchen converge`` -------------------- -Runs the postgres main state +Runs the ``postgres`` main state. ``kitchen verify`` ------------------ -Runs serverspec tests on the actual instance +Runs ``serverspec`` tests on the actual instance. ``kitchen test`` ---------------- -Builds and runs test from scratch +Builds and runs tests from scratch. ``kitchen login`` ----------------- -Gives you ssh to the vagrant machine for manual testing - +Gives you ssh to the vagrant machine for manual testing. diff --git a/postgres/codenamemap.yaml b/postgres/codenamemap.yaml index 7b940c7..6a91e1c 100644 --- a/postgres/codenamemap.yaml +++ b/postgres/codenamemap.yaml @@ -1,5 +1,8 @@ ### Set parameters based on PostgreSQL version supplied with particular distro +{% set use_upstream_repo = salt['pillar.get']('postgres:use_upstream_repo', false) %} +{% set upstream_version = salt['pillar.get']('postgres:version', '9.5') %} + {% macro debian_codename(name, version, codename=none) %} {# Generate lookup dictionary map for Debian and derivative distributions @@ -14,12 +17,14 @@ #} {# use upstream version if configured #} - {% set version = upstream_version|default(version) %} + {% if use_upstream_repo %} + {% set version = upstream_version %} + {% endif %} {{ codename|default(name, true) }}: # PostgreSQL packages are mostly downloaded from `main` repo component - pkg_repo: 'deb http://apt.postgresql.org/pub/repos/apt/ {{ name }}-pgdg main {{ version }}' - pkg_repo_humanname: PostgreSQL Official Repository + pkg_repo: + name: 'deb http://apt.postgresql.org/pub/repos/apt {{ name }}-pgdg main {{ upstream_version }}' pkg: postgresql-{{ version }} pkg_client: postgresql-client-{{ version }} conf_dir: /etc/postgresql/{{ version }}/main @@ -31,11 +36,6 @@ {% endmacro %} -{% if salt['pillar.get']('postgres:use_upstream_repo', false) %} - {# upstream version will always override all versions given below #} - {% set upstream_version = salt['pillar.get']('postgres:version', '9.5') %} -{% endif %} - ## Debian GNU/Linux {{ debian_codename('wheezy', '9.1') }} {{ debian_codename('jessie', '9.4') }} diff --git a/postgres/defaults.yaml b/postgres/defaults.yaml index 4b95b7b..2969194 100644 --- a/postgres/defaults.yaml +++ b/postgres/defaults.yaml @@ -1,10 +1,10 @@ postgres: use_upstream_repo: False pkg: postgresql + pkgs_extra: [] + pkg_client: postgresql-client pkg_dev: postgresql-devel pkg_libpq_dev: postgresql-libs - pkg_client: postgresql-client - pkgs_extra: [] python: python-psycopg2 user: postgres group: postgres diff --git a/postgres/macros.jinja b/postgres/macros.jinja index d30bb9b..3732df6 100644 --- a/postgres/macros.jinja +++ b/postgres/macros.jinja @@ -1,5 +1,15 @@ {%- from "postgres/map.jinja" import postgres with context -%} +{%- macro format_kwargs(kwarg) -%} + + {%- filter indent(4) %} + {%- for k, v in kwarg|dictsort() %} +- {{ k }}: {{ v }} + {%- endfor %} + {%- endfilter %} + +{%- endmacro %} + {%- macro format_state(name, state, kwarg) %} {%- do kwarg.update({'name': name}) %} @@ -12,9 +22,7 @@ {{ state }}-{{ name }}: {{ state }}.{{ ensure|default('present') }}: - {%- for k, v in kwarg|dictsort() %} - - {{ k }}: {{ v }} - {%- endfor %} + {{- format_kwargs(kwarg) }} {%- endmacro %} diff --git a/postgres/osmap.yaml b/postgres/osmap.yaml index 77c9083..e3a6cfd 100644 --- a/postgres/osmap.yaml +++ b/postgres/osmap.yaml @@ -1,3 +1,6 @@ +{% set version = salt['pillar.get']('postgres:version', '9.5') %} +{% set release = version|replace('.', '') %} + Arch: conf_dir: /var/lib/postgres/data prepare_cluster: @@ -9,7 +12,11 @@ Arch: pkg_dev: postgresql Debian: - pkg_repo_file: /etc/apt/sources.list.d/pgdg.list + pkg_repo: + humanname: PostgreSQL Official Repository + key_url: 'https://www.postgresql.org/media/keys/ACCC4CF8.asc' + file: /etc/apt/sources.list.d/pgdg.list + pkg_repo_keyid: ACCC4CF8 pkg_dev: postgresql-server-dev-all pkg_libpq_dev: libpq-dev @@ -20,13 +27,15 @@ OpenBSD: user: _postgresql RedHat: -{% if salt['pillar.get']('postgres:use_upstream_repo', False) %} - {% set version = salt['pillar.get']('postgres:version', '9.5') %} - {% set release = version|replace('.', '') %} + pkg_repo: + name: pgdg{{ release }} + humanname: PostgreSQL {{ version }} $releasever - $basearch + baseurl: 'https://download.postgresql.org/pub/repos/yum/{{ version }}/redhat/rhel-$releasever-$basearch' + gpgcheck: 1 + gpgkey: 'https://download.postgresql.org/pub/repos/yum/RPM-GPG-KEY-PGDG-{{ release }}' + +{% if salt['pillar.get']('postgres:use_upstream_repo', false) %} - pkg_repo: pgdg{{ release }} - pkg_repo_humanname: PostgreSQL {{ version }} $releasever - $basearch - pkg_repo_url: https://download.postgresql.org/pub/repos/yum/{{ version }}/redhat/rhel-$releasever-$basearch pkg: postgresql{{ release }}-server pkg_client: postgresql{{ release }} conf_dir: /var/lib/pgsql/{{ version }}/data diff --git a/postgres/upstream.sls b/postgres/upstream.sls index b17799b..1d5c886 100644 --- a/postgres/upstream.sls +++ b/postgres/upstream.sls @@ -1,29 +1,33 @@ -{%- from "postgres/map.jinja" import postgres with context %} +{%- from "postgres/map.jinja" import postgres with context -%} +{%- from "postgres/macros.jinja" import format_kwargs with context -%} -{%- if grains['os_family'] == 'Debian' -%} +{%- if 'pkg_repo' in postgres -%} + {%- if postgres.use_upstream_repo -%} + +# Add upstream repository for your distro install-postgresql-repo: pkgrepo.managed: - - humanname: {{ postgres.pkg_repo_humanname }} - - name: {{ postgres.pkg_repo }} - - keyid: B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8 - - keyserver: keyserver.ubuntu.com - - file: {{ postgres.pkg_repo_file }} + {{- format_kwargs(postgres.pkg_repo) }} -{%- elif grains['os_family'] == 'RedHat' -%} + {%- else -%} +# Remove the repo configuration (and GnuPG key) as requested +remove-postgresql-repo: + pkgrepo.absent: + - name: {{ postgres.pkg_repo.name }} + {%- if 'pkg_repo_keyid' in postgres %} + - keyid: {{ postgres.pkg_repo_keyid }} + {%- endif %} + + {%- endif -%} + +{%- else -%} + +# Notify that we don't manage this distro install-postgresql-repo: - file.managed: - - name: /etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG - - source: https://download.postgresql.org/pub/repos/yum/RPM-GPG-KEY-PGDG - - source_hash: md5=78b5db170d33f80ad5a47863a7476b22 - pkgrepo.managed: - - name: {{ postgres.pkg_repo }} - - humanname: {{ postgres.pkg_repo_humanname }} - - baseurl: {{ postgres.pkg_repo_url }} - - gpgcheck: 1 - - gpgkey: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG - - require: - - file: install-postgresql-repo + test.show_notification: + - text: | + PostgreSQL does not provide package repository for {{ grains['osfinger'] }} {%- endif %} From 84713e8feafa1c06beb92cb62947883460dd80fc Mon Sep 17 00:00:00 2001 From: Denys Havrysh Date: Fri, 23 Sep 2016 17:50:57 +0300 Subject: [PATCH 2/2] Set `use_upstream_repo: True` by default --- README.rst | 4 ++-- postgres/codenamemap.yaml | 9 ++++----- postgres/defaults.yaml | 5 ++++- postgres/osmajorreleasemap.yaml | 15 +++++++++------ postgres/osmap.yaml | 15 ++++++++------- postgres/repo.yaml | 11 +++++++++++ 6 files changed, 38 insertions(+), 21 deletions(-) create mode 100644 postgres/repo.yaml diff --git a/README.rst b/README.rst index 47e5191..c77adee 100644 --- a/README.rst +++ b/README.rst @@ -37,8 +37,8 @@ applicable. The state relies on the ``postgres:use_upstream_repo`` Pillar value which could be set as following: -* ``False`` (default): makes sure that the repository configuration is absent -* ``True``: 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 The ``postgres:version`` Pillar controls which version of the PostgreSQL packages should be installed from the upstream repository. Defaults to ``9.5``. diff --git a/postgres/codenamemap.yaml b/postgres/codenamemap.yaml index 6a91e1c..eaf18f3 100644 --- a/postgres/codenamemap.yaml +++ b/postgres/codenamemap.yaml @@ -1,7 +1,6 @@ ### Set parameters based on PostgreSQL version supplied with particular distro -{% set use_upstream_repo = salt['pillar.get']('postgres:use_upstream_repo', false) %} -{% set upstream_version = salt['pillar.get']('postgres:version', '9.5') %} +{% import_yaml "postgres/repo.yaml" as repo %} {% macro debian_codename(name, version, codename=none) %} {# @@ -17,14 +16,14 @@ #} {# use upstream version if configured #} - {% if use_upstream_repo %} - {% set version = upstream_version %} + {% if repo.use_upstream_repo %} + {% set version = repo.version %} {% endif %} {{ codename|default(name, true) }}: # PostgreSQL packages are mostly downloaded from `main` repo component pkg_repo: - name: 'deb http://apt.postgresql.org/pub/repos/apt {{ name }}-pgdg main {{ upstream_version }}' + name: 'deb http://apt.postgresql.org/pub/repos/apt {{ name }}-pgdg main {{ repo.version }}' pkg: postgresql-{{ version }} pkg_client: postgresql-client-{{ version }} conf_dir: /etc/postgresql/{{ version }}/main diff --git a/postgres/defaults.yaml b/postgres/defaults.yaml index 2969194..9172a9b 100644 --- a/postgres/defaults.yaml +++ b/postgres/defaults.yaml @@ -1,5 +1,8 @@ +# Default lookup dictionary + postgres: - use_upstream_repo: False + use_upstream_repo: True + version: '9.5' pkg: postgresql pkgs_extra: [] pkg_client: postgresql-client diff --git a/postgres/osmajorreleasemap.yaml b/postgres/osmajorreleasemap.yaml index 24a95e9..b49590d 100644 --- a/postgres/osmajorreleasemap.yaml +++ b/postgres/osmajorreleasemap.yaml @@ -1,33 +1,36 @@ +{% import_yaml "postgres/repo.yaml" as repo %} + {% if grains['os_family'] == 'RedHat' %} ### RedHat releases - {% if salt['pillar.get']('postgres:use_upstream_repo', False) %} - {% set version = salt['pillar.get']('postgres:version', '9.5') %} - {% set data_dir = '/var/lib/pgsql/' ~ version ~ '/data' %} + {% if repo.use_upstream_repo %} + + {% set data_dir = '/var/lib/pgsql/' ~ repo.version ~ '/data' %} # PostgreSQL from upstream repository default: prepare_cluster: user: postgres - command: /usr/pgsql-{{ version }}/bin/initdb -D {{ data_dir }} + command: /usr/pgsql-{{ repo.version }}/bin/initdb -D {{ data_dir }} test: test -f {{ data_dir }}/PG_VERSION env: {} '6': prepare_cluster: user: root - command: service postgresql-{{ version }} initdb + command: service postgresql-{{ repo.version }} initdb test: test -f {{ data_dir }}/PG_VERSION env: {} '7': prepare_cluster: user: root - command: /usr/pgsql-{{ version }}/bin/postgresql95-setup initdb + command: /usr/pgsql-{{ repo.version }}/bin/postgresql95-setup initdb test: test -f {{ data_dir }}/PG_VERSION env: {} {% else %} + {% set data_dir = '/var/lib/pgsql/data' %} # PostgreSQL from OS repositories diff --git a/postgres/osmap.yaml b/postgres/osmap.yaml index e3a6cfd..23a1085 100644 --- a/postgres/osmap.yaml +++ b/postgres/osmap.yaml @@ -1,5 +1,6 @@ -{% set version = salt['pillar.get']('postgres:version', '9.5') %} -{% set release = version|replace('.', '') %} +{% import_yaml "postgres/repo.yaml" as repo %} + +{% set release = repo.version|replace('.', '') %} Arch: conf_dir: /var/lib/postgres/data @@ -29,17 +30,17 @@ OpenBSD: RedHat: pkg_repo: name: pgdg{{ release }} - humanname: PostgreSQL {{ version }} $releasever - $basearch - baseurl: 'https://download.postgresql.org/pub/repos/yum/{{ version }}/redhat/rhel-$releasever-$basearch' + humanname: PostgreSQL {{ repo.version }} $releasever - $basearch + baseurl: 'https://download.postgresql.org/pub/repos/yum/{{ repo.version }}/redhat/rhel-$releasever-$basearch' gpgcheck: 1 gpgkey: 'https://download.postgresql.org/pub/repos/yum/RPM-GPG-KEY-PGDG-{{ release }}' -{% if salt['pillar.get']('postgres:use_upstream_repo', false) %} +{% if repo.use_upstream_repo %} pkg: postgresql{{ release }}-server pkg_client: postgresql{{ release }} - conf_dir: /var/lib/pgsql/{{ version }}/data - service: postgresql-{{ version }} + conf_dir: /var/lib/pgsql/{{ repo.version }}/data + service: postgresql-{{ repo.version }} {% else %} diff --git a/postgres/repo.yaml b/postgres/repo.yaml new file mode 100644 index 0000000..e37eec7 --- /dev/null +++ b/postgres/repo.yaml @@ -0,0 +1,11 @@ +# This file allows to get PostgreSQL version and upstream repo settings +# early from Pillar to set correct lookup dictionaty items + +{% import_yaml "postgres/defaults.yaml" as defaults %} + +use_upstream_repo: {{ salt['pillar.get']('postgres:use_upstream_repo', + defaults.postgres.use_upstream_repo) }} +version: {{ salt['pillar.get']('postgres:version', + defaults.postgres.version) }} + +# vim: ft=sls