diff --git a/defaults/main.yml b/defaults/main/main.yml similarity index 100% rename from defaults/main.yml rename to defaults/main/main.yml diff --git a/defaults/repmgr.yml b/defaults/main/repmgr.yml similarity index 100% rename from defaults/repmgr.yml rename to defaults/main/repmgr.yml diff --git a/tasks/extensions/configure_repmgr.yml b/tasks/extensions/configure_repmgr.yml index 2e687a43..6d1403a1 100644 --- a/tasks/extensions/configure_repmgr.yml +++ b/tasks/extensions/configure_repmgr.yml @@ -1,7 +1,7 @@ - name: Repmgr | Update configuration (repmgr.conf) template: src: "repmgr.conf-{{ repmgr_version }}.j2" - dest: "{{postgresql_conf_directory}}/repmgr.conf" + dest: "{{repmgr_config_directory}}/repmgr.conf" owner: "{{ postgresql_service_user }}" group: "{{ postgresql_service_group }}" mode: 0640 @@ -31,6 +31,7 @@ group: "{{ postgresql_service_group }}" mode: 0400 trim_blocks: no + no_log: true - name: Repmgr | Generate ssh keypair for postgres user command: "ssh-keygen -b {{repmgr_ssh_key_bits}} -t {{repmgr_ssh_key_type}} -f {{repmgr_private_key_path}} -N ''" @@ -75,7 +76,7 @@ mode: 0600 - name: Repmgr | Check cluster status - command: "{{postgresql_bin_directory}}/repmgr -f {{postgresql_conf_directory}}/repmgr.conf cluster show" + command: "{{postgresql_bin_directory}}/repmgr -f {{repmgr_config_directory}}/repmgr.conf cluster show" become: yes become_user: "{{ postgresql_service_user }}" changed_when: repmgr_cluster_show.rc != 0 @@ -83,7 +84,7 @@ ignore_errors: True - name: Repmgr | Register as primary - command: "{{postgresql_bin_directory}}/repmgr -f {{postgresql_conf_directory}}/repmgr.conf primary register" + command: "{{postgresql_bin_directory}}/repmgr -f {{repmgr_config_directory}}/repmgr.conf primary register" become: yes become_user: "{{ postgresql_service_user }}" when: repmgr_primary and not ansible_hostname in repmgr_cluster_show.stdout and not "primary" in repmgr_cluster_show.stdout @@ -95,7 +96,7 @@ when: not repmgr_primary and not ansible_hostname in repmgr_cluster_show.stdout and not "standby" in repmgr_cluster_show.stdout - name: Repmgr | Clone standby - command: "{{postgresql_bin_directory}}/repmgr -F -h {% for host, vars in hostvars.items() if 'repmgr_primary' in vars and vars['repmgr_primary'] == True %}{{ host }}{% endfor %} -U repmgr -d repmgr -f {{postgresql_conf_directory}}/repmgr.conf standby clone" + command: "{{postgresql_bin_directory}}/repmgr -F -h {% for host, vars in hostvars.items() if 'repmgr_primary' in vars and vars['repmgr_primary'] == True %}{{ host }}{% endfor %} -p {{ postgresql_port }} -U repmgr -d repmgr -f {{repmgr_config_directory}}/repmgr.conf standby clone" become: yes become_user: "{{ postgresql_service_user }}" when: not repmgr_primary and not ansible_hostname in repmgr_cluster_show.stdout and not "standby" in repmgr_cluster_show.stdout @@ -112,13 +113,13 @@ delegate_to: localhost - name: Repmgr | Register standby - command: "{{postgresql_bin_directory}}/repmgr -F -h {% for host, vars in hostvars.items() if 'repmgr_primary' in vars and vars['repmgr_primary'] == True %}{{ host }}{% endfor %} -U repmgr -d repmgr -f {{postgresql_conf_directory}}/repmgr.conf standby register" + command: "{{postgresql_bin_directory}}/repmgr -F -h {% for host, vars in hostvars.items() if 'repmgr_primary' in vars and vars['repmgr_primary'] == True %}{{ host }}{% endfor %} -U repmgr -d repmgr -f {{repmgr_config_directory}}/repmgr.conf standby register" become: yes become_user: "{{ postgresql_service_user }}" when: not repmgr_primary and not ansible_hostname in repmgr_cluster_show.stdout and not "standby" in repmgr_cluster_show.stdout - name: Repmgr | Verify cluster functionality - command: "{{postgresql_bin_directory}}/repmgr -F -h {% for host, vars in hostvars.items() if 'repmgr_primary' in vars and vars['repmgr_primary'] == True %}{{ host }}{% endfor %} -U repmgr -d repmgr -f {{postgresql_conf_directory}}/repmgr.conf cluster crosscheck" + command: "{{postgresql_bin_directory}}/repmgr -F -h {% for host, vars in hostvars.items() if 'repmgr_primary' in vars and vars['repmgr_primary'] == True %}{{ host }}{% endfor %} -U repmgr -d repmgr -f {{repmgr_config_directory}}/repmgr.conf cluster crosscheck" become: yes become_user: "{{ postgresql_service_user }}" @@ -142,7 +143,7 @@ - name: Repmgr | Setup cluster monitoring history cleanup copy: - content: "{{postgresql_bin_directory}}/repmgr -f {{postgresql_conf_directory}}/repmgr.conf cluster cleanup --keep-history={{repmgr_keep_history_days}}" + content: "{{postgresql_bin_directory}}/repmgr -f {{repmgr_config_directory}}/repmgr.conf cluster cleanup --keep-history={{repmgr_keep_history_days}}" dest: "/etc/cron.daily/repmgr_cleanup" mode: 0755 when: repmgr_monitoring_history == "true" or repmgr_failover == "automatic" diff --git a/tasks/extensions/detect_repmgr_primary.yml b/tasks/extensions/detect_repmgr_primary.yml index 8d6c3b01..fc8e6a31 100644 --- a/tasks/extensions/detect_repmgr_primary.yml +++ b/tasks/extensions/detect_repmgr_primary.yml @@ -1,5 +1,5 @@ - name: Repmgr | Detect primary - shell: "set -o pipefail ; {{ postgresql_bin_directory }}/repmgr -f {{ postgresql_conf_directory }}/repmgr.conf cluster show | grep primary | cut -d '|' -f 2" + shell: "set -o pipefail ; {{ postgresql_bin_directory }}/repmgr -f {{ repmgr_config_directory }}/repmgr.conf cluster show | grep primary | cut -d '|' -f 2" register: repmgr_primary_check become: yes become_user: postgres @@ -13,11 +13,14 @@ - name: Repmgr | Declare as primary for new installation set_fact: - repmgr_primary: "{{ True if ansible_hostname == ansible_play_hosts[0] or inventory_hostname == ansible_play_hosts[0] else False }}" + repmgr_primary: "{{ True if ansible_hostname == repmgr_master or inventory_hostname == repmgr_master else False }}" when: "repmgr_existing_installation_detected is skipped" - debug: var: repmgr_primary +- debug: + var: repmgr_master + - debug: var: ansible_hostname diff --git a/templates/pgpass.j2 b/templates/pgpass.j2 index abeae8f5..ea1cd2ea 100644 --- a/templates/pgpass.j2 +++ b/templates/pgpass.j2 @@ -1,4 +1,6 @@ {% for server in groups[repmgr_target_group] | sort %} -{{ server }}:{{postgresql_port}}:{{repmgr_database}}:{{repmgr_user}}:{% for user in postgresql_users if user['name'] == repmgr_user %}{{user['pass']}}{% endfor %} -{{ server }}:{{postgresql_port}}:replication:{{repmgr_replication_user}}:{% for user in postgresql_users if user['name'] == repmgr_user %}{{user['pass']}}{% endfor %} +{{ server }}:{{postgresql_port}}:{{repmgr_database}}:{{repmgr_user}}:{% for user in postgresql_users if user['name'] == repmgr_user %}{{user['pass']}}{% endfor %} +{{ server | regex_replace('^([^.]*)\.?.*$', '\\1') }}:{{postgresql_port}}:{{repmgr_database}}:{{repmgr_user}}:{% for user in postgresql_users if user['name'] == repmgr_user %}{{user['pass']}}{% endfor %} +{{ server }}:{{postgresql_port}}:replication:{{repmgr_replication_user}}:{% for user in postgresql_users if user['name'] == repmgr_user %}{{user['pass']}}{% endfor %} +{{ server | regex_replace('^([^.]*)\.?.*$', '\\1') }}:{{postgresql_port}}:replication:{{repmgr_replication_user}}:{% for user in postgresql_users if user['name'] == repmgr_user %}{{user['pass']}}{% endfor %} {% endfor %} diff --git a/templates/repmgr.conf-4.2.j2 b/templates/repmgr.conf-4.2.j2 index a992a26f..9637f540 100644 --- a/templates/repmgr.conf-4.2.j2 +++ b/templates/repmgr.conf-4.2.j2 @@ -52,7 +52,7 @@ data_directory='{{repmgr_data_directory}}' # The node's data directory. This is # Server settings #------------------------------------------------------------------------------ -config_directory='{{repmgr_config_directory}}' # If configuration files are located outside the data +config_directory='{{postgresql_conf_directory}}' # If configuration files are located outside the data # directory, specify the directory where the main # postgresql.conf file is located. diff --git a/templates/repmgr.conf-5.0.0.j2 b/templates/repmgr.conf-5.0.0.j2 new file mode 100644 index 00000000..8a8c5674 --- /dev/null +++ b/templates/repmgr.conf-5.0.0.j2 @@ -0,0 +1,448 @@ +################################################### +# repmgr sample configuration file +################################################### + +# Some configuration items will be set with a default value; this +# is noted for each item. Where no default value is shown, the +# parameter will be treated as empty or false. +# +# repmgr parses its configuration file in the same way as PostgreSQL itself +# does. In particular, strings must be enclosed in single quotes (although +# simple identifiers may be provided as-is). +# +# For details on the configuration file format see the documentation at: +# +# https://repmgr.org/docs/current/configuration-file.html#CONFIGURATION-FILE-FORMAT +# +# ============================================================================= +# Required configuration items +# ============================================================================= +# +# repmgr and repmgrd require the following items to be explicitly configured. + + +node_id='{{ repmgr_node_id if repmgr_node_id is defined else range(1, 65535) | random(seed=ansible_hostname) }}' # A unique integer greater than zero +node_name='{{ansible_hostname}}' # An arbitrary (but unique) string; we recommend + # using the server's hostname or another identifier + # unambiguously associated with the server to avoid + # confusion. Avoid choosing names which reflect the + # node's current role, e.g. 'primary' or 'standby1', + # as roles can change and it will be confusing if + # the current primary is called 'standby1'. + # The string's maximum length is 63 characters and it should + # contain only printable ASCII characters. + +conninfo='{{repmgr_conninfo}}' # Database connection information as a conninfo string. + # All servers in the cluster must be able to connect to + # the local node using this string. + # + # For details on conninfo strings, see: + # https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING + # + # If repmgrd is in use, consider explicitly setting + # "connect_timeout" in the conninfo string to determine + # the length of time which elapses before a network + # connection attempt is abandoned; for details see: + # https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNECT-CONNECT-TIMEOUT + +data_directory='{{repmgr_data_directory}}' # The node's data directory. This is needed by repmgr + # when performing operations when the PostgreSQL instance + # is not running and there's no other way of determining + # the data directory. + + +# ============================================================================= +# Optional configuration items +# ============================================================================= + + +#------------------------------------------------------------------------------ +# Server settings +#------------------------------------------------------------------------------ + +config_directory='{{postgresql_conf_directory}}' # If configuration files are located outside the data + # directory, specify the directory where the main + # postgresql.conf file is located. + +#------------------------------------------------------------------------------ +# Replication settings +#------------------------------------------------------------------------------ + +replication_user='{{repmgr_replication_user}}' # User to make replication connections with, if not set + # defaults to the user defined in "conninfo". + +replication_type='{{repmgr_replication_type}}' # Must be one of "physical" or "bdr". + # NOTE: "bdr" can only be used with BDR 2.x + +location='{{repmgr_location}}' # An arbitrary string defining the location of the node; this + # is used during failover to check visibility of the + # current primary node. For further details see: + # https://repmgr.org/docs/current/repmgrd-network-split.html + +use_replication_slots='{{repmgr_use_replication_slots}}' # whether to use physical replication slots + # NOTE: when using replication slots, + # 'max_replication_slots' should be configured for + # at least the number of standbys which will connect + # to the primary. + +#------------------------------------------------------------------------------ +# Witness server settings +#------------------------------------------------------------------------------ + +witness_sync_interval={{repmgr_witness_sync_interval}} # interval (in seconds) to synchronise node records + # to the witness server + +#------------------------------------------------------------------------------ +# Logging settings +#------------------------------------------------------------------------------ +# +# Note that logging facility settings will only apply to `repmgrd` by default; +# `repmgr` will always write to STDERR unless the switch `--log-to-file` is +# supplied, in which case it will log to the same destination as `repmgrd`. +# This is mainly intended for those cases when `repmgr` is executed directly +# by `repmgrd`. + +log_level='{{repmgr_log_level}}' # Log level: possible values are DEBUG, INFO, NOTICE, + # WARNING, ERROR, ALERT, CRIT or EMERG + +log_facility='{{repmgr_log_facility}}' # Logging facility: possible values are STDERR, or for + # syslog integration, one of LOCAL0, LOCAL1, ..., LOCAL7, USER + +{{ '' if repmgr_log_file else '#' }}log_file='{{repmgr_log_file}}' # STDERR can be redirected to an arbitrary file +log_status_interval={{repmgr_log_status_interval}} # interval (in seconds) for repmgrd to log a status message + + +#------------------------------------------------------------------------------ +# Event notification settings +#------------------------------------------------------------------------------ + +# event notifications can be passed to an arbitrary external program +# together with the following parameters: +# +# %n - node ID +# %e - event type +# %s - success (1 or 0) +# %t - timestamp +# %d - details +# +# the values provided for "%t" and "%d" will probably contain spaces, +# so should be quoted in the provided command configuration, e.g.: +# +# event_notification_command='/path/to/some/script %n %e %s "%t" "%d"' +# +# By default, all notifications will be passed; the notification types +# can be filtered to explicitly named ones, e.g.: +# +# event_notifications=primary_register,standby_register + +{{ '' if repmgr_event_notification_command else '#' }}event_notification_command='{{repmgr_event_notification_command}}' # An external program or script which + # can be executed by the user under which + # repmgr/repmgrd are run. + +{{ '' if repmgr_event_notifications else '#' }}event_notifications='{{repmgr_event_notifications}}' # A commas-separated list of notification + # types + +#------------------------------------------------------------------------------ +# Environment/command settings +#------------------------------------------------------------------------------ + +pg_bindir='{{repmgr_pg_bindir}}' # Path to PostgreSQL binary directory (location + # of pg_ctl, pg_basebackup etc.). Only needed + # if these files are not in the system $PATH. + # + # Debian/Ubuntu users: you will probably need to + # set this to the directory where `pg_ctl` is located, + # e.g. /usr/lib/postgresql/9.6/bin/ + # + # *NOTE* "pg_bindir" is only used when repmgr directly + # executes PostgreSQL binaries; any user-defined scripts + # *must* be specified with the full path + +repmgr_bindir='{{repmgr_repmgr_bindir}}' # Path to repmgr binary directory (location of the repmgr + # binary. Only needed if the repmgr executable is not in + # the system $PATH or the path defined in "pg_bindir". + +use_primary_conninfo_password={{repmgr_use_primary_conninfo_password}} # explicitly set "password" in "primary_conninfo" + # using the value contained in the environment variable + # PGPASSWORD +passfile='{{repmgr_passfile}}' # path to .pgpass file to include in "primary_conninfo" + +#------------------------------------------------------------------------------ +# external command options +#------------------------------------------------------------------------------ +# +# Options which can be passed to external commands invoked by repmgr/repmgrd. +# +# Examples: +# +# pg_ctl_options='-s' +# pg_basebackup_options='--label=repmgr_backup' +# rsync_options=--archive --checksum --compress --progress --rsh="ssh -o \"StrictHostKeyChecking no\"" +# ssh_options=-o "StrictHostKeyChecking no" + +{{ '' if repmgr_pg_ctl_options else '#' }}pg_ctl_options='{{repmgr_pg_ctl_options}}' # Options to append to "pg_ctl" +{{ '' if repmgr_pg_basebackup_options else '#' }}pg_basebackup_options='{{repmgr_pg_basebackup_options}}' # Options to append to "pg_basebackup" +{{ '' if repmgr_rsync_options else '#' }}rsync_options='{{repmgr_rsync_options}}' # Options to append to "rsync" +ssh_options='{{repmgr_ssh_options}}' # Options to append to "ssh" + + + +#------------------------------------------------------------------------------ +# "standby clone" settings +#------------------------------------------------------------------------------ +# +# These settings apply when cloning a standby ("repmgr standby clone"). +# +# Examples: +# +# tablespace_mapping='/path/to/original/tablespace=/path/to/new/tablespace' +# restore_command = 'cp /path/to/archived/wals/%f %p' + +{{ '' if repmgr_tablespace_mapping else '#' }}tablespace_mapping='{{repmgr_tablespace_mapping}}' # Tablespaces can be remapped from one + # file system location to another. This + # parameter can be provided multiple times. + +{{ '' if repmgr_restore_command else '#' }}restore_command='{{repmgr_restore_command}}' # This will be included in the recovery configuration + # generated by repmgr. + +{{ '' if repmgr_archive_cleanup_command else '#' }}archive_cleanup_command='{{repmgr_archive_cleanup_command}}' # This will be included in the recovery configuration + # generated by repmgr. Note we recommend using Barman for + # managing WAL archives (see: https://www.pgbarman.org ) + +{{ '' if repmgr_recovery_min_apply_delay else '#' }}recovery_min_apply_delay={{repmgr_recovery_min_apply_delay}} # If provided, "recovery_min_apply_delay" will be set to + # this value (PostgreSQL 9.4 and later). + + +#------------------------------------------------------------------------------ +# "standby promote" settings +#------------------------------------------------------------------------------ + +# These settings apply when instructing a standby to promote itself to the +# new primary ("repmgr standby promote"). + +promote_check_timeout={{repmgr_promote_check_timeout}} # The length of time (in seconds) to wait + # for the new primary to finish promoting +promote_check_interval={{repmgr_promote_check_interval}} # The interval (in seconds) to check whether + # the new primary has finished promoting + + +#------------------------------------------------------------------------------ +# "standby follow" settings +#------------------------------------------------------------------------------ + +# These settings apply when instructing a standby to follow the new primary +# ("repmgr standby follow"). + +primary_follow_timeout={{repmgr_primary_follow_timeout}} # The max length of time (in seconds) to wait + # for the new primary to become available +standby_follow_timeout={{repmgr_standby_follow_timeout}} # The max length of time (in seconds) to wait + # for the standby to connect to the primary + + +#------------------------------------------------------------------------------ +# "standby switchover" settings +#------------------------------------------------------------------------------ + +# These settings apply when switching roles between a primary and a standby +# ("repmgr standby switchover"). + +shutdown_check_timeout={{repmgr_shutdown_check_timeout}} # The max length of time (in seconds) to wait for the demotion + # candidate (current primary) to shut down +standby_reconnect_timeout={{repmgr_standby_reconnect_timeout}} # The max length of time (in seconds) to wait + # for the demoted standby to reconnect to the promoted + # primary (note: this value should be equal to or greater + # than that set for "node_rejoin_timeout") +#wal_receive_check_timeout=30 # The max length of time (in seconds) to wait for the walreceiver + # on the standby to flush WAL to disk before comparing location + # with the shut-down primary + +#------------------------------------------------------------------------------ +# "node rejoin" settings +#------------------------------------------------------------------------------ + +# These settings apply when reintegrating a node into a replication cluster +# with "repmgrd_node_rejoin" + +node_rejoin_timeout={{repmgr_node_rejoin_timeout}} # The maximum length of time (in seconds) to wait for + # the node to reconnect to the replication cluster + +#------------------------------------------------------------------------------ +# Barman options +#------------------------------------------------------------------------------ + +{{ '' if repmgr_barman_server else '#' }}barman_server='{{repmgr_barman_server}}' # The barman configuration section +{{ '' if repmgr_barman_host else '#' }}barman_host='{{repmgr_barman_host}}' # The host name of the barman server +{{ '' if repmgr_barman_config else '#' }}barman_config='{{repmgr_barman_config}}' # The Barman configuration file on the + # Barman server (needed if the file is + # in a non-standard location) + +#------------------------------------------------------------------------------ +# Failover and monitoring settings (repmgrd) +#------------------------------------------------------------------------------ +# +# These settings are only applied when repmgrd is running. Values shown +# are defaults. + +failover='{{repmgr_failover}}' # one of 'automatic', 'manual'. + # determines what action to take in the event of upstream failure + # + # 'automatic': repmgrd will automatically attempt to promote the + # node or follow the new upstream node + # 'manual': repmgrd will take no action and the node will require + # manual attention to reattach it to replication + # (does not apply to BDR mode) + +priority={{repmgr_priority}} # indicates a preferred priority for promoting nodes; + # a value of zero prevents the node being promoted to primary + # (default: 100) + +#connection_check_type=ping # How to check availability of the upstream node; valid options: + # 'ping': use PQping() to check if the node is accepting connections + # 'connection': execute a throwaway query on the current connection +reconnect_attempts={{repmgr_reconnect_attempts}} # Number of attempts which will be made to reconnect to an unreachable + # primary (or other upstream node) +reconnect_interval={{repmgr_reconnect_interval}} # Interval between attempts to reconnect to an unreachable + # primary (or other upstream node) +{{ '' if repmgr_promote_command else '#' }}promote_command={{repmgr_promote_command}} # command repmgrd executes when promoting a new primary; use something like: + # + # repmgr standby promote -f /etc/repmgr.conf + # +{{ '' if repmgr_follow_command else '#' }}follow_command={{repmgr_follow_command}} # command repmgrd executes when instructing a standby to follow a new primary; + # use something like: + # + # repmgr standby follow -f /etc/repmgr.conf -W --upstream-node-id=%n + # +primary_notification_timeout={{repmgr_primary_notification_timeout}} # Interval (in seconds) which repmgrd on a standby + # will wait for a notification from the new primary, + # before falling back to degraded monitoring +repmgrd_standby_startup_timeout={{repmgr_repmgrd_standby_startup_timeout}} # Interval (in seconds) which repmgrd on a standby will wait + # for the the local node to restart and become ready to accept connections after + # executing "follow_command" (defaults to the value set in "standby_reconnect_timeout") + +monitoring_history={{repmgr_monitoring_history}} # Whether to write monitoring data to the "montoring_history" table +monitor_interval_secs={{repmgr_monitor_interval_secs}} # Interval (in seconds) at which to write monitoring data +degraded_monitoring_timeout={{repmgr_degraded_monitoring_timeout}} # Interval (in seconds) after which repmgrd will terminate if the + # server(s) being monitored are no longer available. -1 (default) + # disables the timeout completely. +async_query_timeout={{repmgr_async_query_timeout}} # Interval (in seconds) which repmgrd will wait before + # cancelling an asynchronous query. +{{ '' if repmgr_repmgrd_pid_file else '#' }}repmgrd_pid_file={{repmgr_repmgrd_pid_file}} # Path of PID file to use for repmgrd; if not set, a PID file will + # be generated in a temporary directory specified by the environment + # variable $TMPDIR, or if not set, in "/tmp". This value can be overridden + # by the command line option "-p/--pid-file"; the command line option + # "--no-pid-file" will force PID file creation to be skipped. + # Note: there is normally no need to set this, particularly if + # repmgr was installed from packages. +#standby_disconnect_on_failover=false # If "true", in a failover situation wait for all standbys to + # disconnect their WAL receivers before electing a new primary + # (PostgreSQL 9.5 and later only; repmgr user must be a superuser for this) +#sibling_nodes_disconnect_timeout=30 # If "standby_disconnect_on_failover" is true, the maximum length of time + # (in seconds) to wait for other standbys to confirm they have disconnected their + # WAL receivers +#primary_visibility_consensus=false # If "true", only continue with failover if no standbys have seen + # the primary node recently. *Must* be the same on all nodes. +#failover_validation_command='' # Script to execute for an external mechanism to validate the failover + # decision made by repmgrd. One or both of the following parameter placeholders + # should be provided, which will be replaced by repmgrd with the appropriate + # value: %n (node_id), %a (node_name). *Must* be the same on all nodes. +#election_rerun_interval=15 # if "failover_validation_command" is set, and the command returns + # an error, pause the specified amount of seconds before rerunning the election. + # + # The following items are relevant for repmgrd running on the primary, + # and will be ignored on non-primary nodes +#child_nodes_check_interval=5 # Interval (in seconds) to check for attached child nodes (standbys) +#child_nodes_connected_min_count=-1 # Minimum number of child nodes which must remain connected, otherwise + # disconnection command will be triggered +#child_nodes_disconnect_min_count=-1 # Minimum number of disconnected child nodes required to execute disconnection command + # (ignored if "child_nodes_connected_min_count" set) +#child_nodes_disconnect_timeout=30 # Interval between child node disconnection and disconnection command execution +#child_nodes_disconnect_command='' # Command to execute if child node disconnection detected + +#------------------------------------------------------------------------------ +# service control commands +#------------------------------------------------------------------------------ +# +# repmgr provides options to override the default pg_ctl commands +# used to stop, start, restart, reload and promote the PostgreSQL cluster +# +# These options are useful when PostgreSQL has been installed from a package +# which provides OS-level service commands. In environments using an init system +# such as systemd, which keeps track of the state of various services, it is +# essential that the service commands are correctly configured and pg_ctl is +# not executed directly. +# +# NOTE: These commands must be runnable on remote nodes as well for switchover +# to function correctly. +# +# If you use sudo, the user repmgr runs as (usually 'postgres') must have +# passwordless sudo access to execute the command. +# +# For example, to use systemd, you can set +# +# service_start_command = 'sudo systemctl start postgresql-9.6' +# (...) +# +# and then use the following sudoers configuration: +# +# # this is required when running sudo over ssh without -t: +# Defaults:postgres !requiretty +# postgres ALL = NOPASSWD: /usr/bin/systemctl stop postgresql-9.6, \ +# /usr/bin/systemctl start postgresql-9.6, \ +# /usr/bin/systemctl restart postgresql-9.6 +# +# Debian/Ubuntu users: use "sudo pg_ctlcluster" to execute service control commands. +# +# For more details, see: https://repmgr.org/docs/current/configuration-service-commands.html + +service_start_command ='{{repmgr_service_start_command }}' +service_stop_command ='{{repmgr_service_stop_command }}' +service_restart_command ='{{repmgr_service_restart_command }}' +service_reload_command ='{{repmgr_service_reload_command }}' +{{ '' if repmgr_service_promote_command else '#' }}service_promote_command ='{{repmgr_service_promote_command }}' # This parameter is intended for systems which provide a + # package-level promote command, such as Debian's + # "pg_ctlcluster". *IMPORTANT*: it is *not* a substitute + # for "promote_command"; do not use "repmgr standby promote" + # (or a script which executes "repmgr standby promote") here. + +# Used by "repmgr service (start|stop)" to control repmgrd +# +#repmgrd_service_start_command = '' +#repmgrd_service_stop_command = '' + +#------------------------------------------------------------------------------ +# Status check thresholds +#------------------------------------------------------------------------------ + +# Various warning/critical thresholds used by "repmgr node check". + +archive_ready_warning={{repmgr_archive_ready_warning}} # repmgr node check --archive-ready +archive_ready_critical={{repmgr_archive_ready_critical}} # + # Numbers of files pending archiving via PostgreSQL's + # "archive_command" configuration parameter. If + # files can't be archived fast enough, or the archive + # command is failing, the buildup of files can + # cause various issues, such as server shutdown being + # delayed until all files are archived, or excessive + # space being occupied by unarchived files. + # + # Note that these values will be checked when executing + # "repmgr standby switchover" to warn about potential + # issues with shutting down the demotion candidate. + +replication_lag_warning={{repmgr_replication_lag_warning}} # repmgr node check --replication-lag +replication_lag_critical={{repmgr_replication_lag_critical}} # + # Note that these values will be checked when executing + # "repmgr standby switchover" to warn about potential + # issues with shutting down the demotion candidate. + + +#------------------------------------------------------------------------------ +# BDR monitoring options +#------------------------------------------------------------------------------ + +bdr_local_monitoring_only={{repmgr_bdr_local_monitoring_only}} # Only monitor the local node; no checks will be + # performed on the other node +bdr_recovery_timeout={{repmgr_bdr_recovery_timeout}} # If a BDR node was offline and has become available + # maximum length of time in seconds to wait for the + # node to reconnect to the cluster + diff --git a/templates/repmgr.conf-5.0.j2 b/templates/repmgr.conf-5.0.j2 index d972a33b..e39c1c10 100644 --- a/templates/repmgr.conf-5.0.j2 +++ b/templates/repmgr.conf-5.0.j2 @@ -60,7 +60,7 @@ data_directory='{{repmgr_data_directory}}' # The node's data directory. This i # Server settings #------------------------------------------------------------------------------ -config_directory='{{repmgr_config_directory}}' # If configuration files are located outside the data +config_directory='{{postgresql_conf_directory}}' # If configuration files are located outside the data # directory, specify the directory where the main # postgresql.conf file is located. @@ -445,4 +445,4 @@ bdr_local_monitoring_only={{repmgr_bdr_local_monitoring_only}} # Only monitor t bdr_recovery_timeout={{repmgr_bdr_recovery_timeout}} # If a BDR node was offline and has become available # maximum length of time in seconds to wait for the # node to reconnect to the cluster - \ No newline at end of file + diff --git a/templates/repmgr.custom.conf.j2 b/templates/repmgr.custom.conf.j2 index 6671cd01..2a0bec28 100644 --- a/templates/repmgr.custom.conf.j2 +++ b/templates/repmgr.custom.conf.j2 @@ -1,3 +1,3 @@ [Service] # Location of repmgr conf file: -Environment=REPMGRDCONF={{postgresql_conf_directory}}/repmgr.conf +Environment=REPMGRDCONF={{repmgr_config_directory}}/repmgr.conf