From 2f283f60b9f14137b3a7bb6264aeb9cc09b93e61 Mon Sep 17 00:00:00 2001 From: "Luis F. Esteban" Date: Fri, 12 Jul 2024 07:45:07 +0200 Subject: [PATCH] Add all consul configuration options in patroni_role --- CHANGELOG.md | 5 ++ defaults/main.yml | 44 +++++++++++++++- molecule/default/group_vars/all/main | 4 +- templates/patroni.yml.j2 | 49 ++++++++++++++++-- vars/main.yml | 76 +++++++++++++++++----------- 5 files changed, 142 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cebf9cb..f73c945 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,11 @@ This project adheres to [Semantic Versioning](http://semver.org/) and [Keep a ch ### Removed ### Fixed +## [1.0.3](https://github.com/idealista/patroni_role/tree/1.0.3) (2024-07-12) +### [Full Changelog](https://github.com/idealista/patroni_role/compare/1.0.2...1.0.3) +### Added +- *[#11](https://github.com/idealista/patroni_role/issues/11) Add all consul configuration options in patroni_role* @ledepedro + ## [1.0.2](https://github.com/idealista/patroni_role/tree/1.0.2) (2024-07-03) ### [Full Changelog](https://github.com/idealista/patroni_role/compare/1.0.1...1.0.2) ### Changed diff --git a/defaults/main.yml b/defaults/main.yml index 41d8417..bb719d5 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -20,9 +20,51 @@ patroni: # replication_username: "replicator" # replication_password: "replicator-pass" # pending_restart: false +# consul_namespace: 'service' +# consul_register_service: "{{ omit }}" # consul_host: '127.0.0.1:8500' -# consul_register_service: false +# consul_url: "{{ omit }}" +# consul_port: "{{ omit }}" +# consul_scheme: "{{ omit }}" +# consul_token: "{{ omit }}" +# consul_verify: "{{ omit }}" +# consul_cacert: "{{ omit }}" +# consul_cert: "{{ omit }}" +# consul_key: "{{ omit }}" +# consul_dc: "{{ omit }}" +# consul_consistency: "{{ omit }}" # consul_checks: [] +# consul.service_tags: "{{ omit }}" +# consul_service_check_interval: "{{ omit }}" +# consul_service_check_tls_server_name: "{{ omit }}" +# restapi_port: 8008 +# ttl: 30 +# loop_wait: 10 +# retry_timeout: 10 +# maximum_lag_on_failover: 1048576 +# master_start_timeout: 300 +# callbacks: [] +# tandby_cluster: +# host: "" +# port: "5432" +# log_dir: '/var/log/patroni' +# log_leve: 'info' +# log_traceback_level: 'error' +# log_format: '%(asctime)s %(levelname)s: %(message)s' +# log_dateformat: '' +# log_max_queue_size: 1000 +# log_file_num: 4 +# log_file_size: 25000000 # bytes +# log_loggers_patroni_postmaster: 'warning' +# log_loggers_urllib3: 'warning' # or 'debug' +# watchdog_mode: 'automatic' # or 'off', 'required' +# watchdog_device: '/dev/watchdog' +# postgresql_use_pg_rewind: true # or 'false' +# remove_data_directory_on_rewind_failure: false # or 'true' (if use_pg_rewind: 'true') +# remove_data_directory_on_diverged_timelines: false # or 'true' +# cluster_bootstrap_method: 'initdb' # or "wal-g", "pgbackrest", "pg_probackup" +# create_replica_methods: +# - basebackup postgresql: # install: true # or 'false' if postgres is already installed diff --git a/molecule/default/group_vars/all/main b/molecule/default/group_vars/all/main index 46e4ffa..61a6c47 100644 --- a/molecule/default/group_vars/all/main +++ b/molecule/default/group_vars/all/main @@ -8,7 +8,7 @@ pgbouncer_install: True pg_major_release: "{{ (lookup('env', 'PG_MAJOR_RELEASE', default='') | length > 0) | ternary(lookup('env', 'PG_MAJOR_RELEASE'), '16') }}" patroni: - cluster_name: "pgdbk-cluster" # the cluster name (must be unique for each cluster) + cluster_name: "pgdbk-cluster-test" # the cluster name (must be unique for each cluster) install_version: "3.3.0" # or 'latest' superuser_username: "postgres" @@ -19,6 +19,8 @@ patroni: pending_restart: true + consul_namespace: 'pgdb_service' + postgresql: locale: 'es_ES.UTF-8' cluster_name: "main" diff --git a/templates/patroni.yml.j2 b/templates/patroni.yml.j2 index 3bf7bfe..7fbc45b 100644 --- a/templates/patroni.yml.j2 +++ b/templates/patroni.yml.j2 @@ -3,7 +3,7 @@ scope: {{ patroni_cluster_name }} name: {{ ansible_hostname }} -namespace: /{{ patroni_etcd_namespace | default('service') }} +namespace: /{{ patroni_consul_namespace | default('service') }} {% if patroni_log_destination == 'logfile' %} log: @@ -48,12 +48,53 @@ etcd3: {% endif %} {% if dcs_type == 'consul' %} +{% set omit_placeholder_pattern = '__omit_place_holder__' %} consul: +{% if patroni_consul_url is defined and patroni_consul_url is not none and ( patroni_consul_url is not string or omit_placeholder_pattern not in patroni_consul_url ) %} + url: '{{ patroni_consul_url }}' +{% else %} host: {{ patroni_consul_host | default ('127.0.0.1:8500') }} - {% if patroni_consul_register_service | default(false) | bool %} - register_service: true - {% endif %} +{% endif %} +{% if patroni_consul_port is defined and patroni_consul_port is not none and ( patroni_consul_port is not string or omit_placeholder_pattern not in patroni_consul_port ) %} + port: {{ patroni_consul_port }} +{% endif %} +{% if patroni_consul_scheme is defined and patroni_consul_scheme is not none and ( patroni_consul_scheme is not string or omit_placeholder_pattern not in patroni_consul_scheme ) %} + scheme: {{ patroni_consul_scheme }} +{% endif %} +{% if patroni_consul_token is defined and patroni_consul_token is not none and ( patroni_consul_token is not string or omit_placeholder_pattern not in patroni_consul_token ) %} + token: {{ patroni_consul_token }} +{% endif %} +{% if patroni_consul_verify is defined and patroni_consul_verify is not none and ( patroni_consul_verify is not string or omit_placeholder_pattern not in patroni_consul_verify ) %} + verify: {{ patroni_consul_verify }} +{% endif %} +{% if patroni_consul_cacert is defined and patroni_consul_cacert is not none and ( patroni_consul_cacert is not string or omit_placeholder_pattern not in patroni_consul_cacert ) %} + cacert: {{ patroni_consul_cacert }} +{% endif %} +{% if patroni_consul_cert is defined and patroni_consul_cert is not none and ( patroni_consul_cert is not string or omit_placeholder_pattern not in patroni_consul_cert ) %} + cert: {{ patroni_consul_cert }} +{% endif %} +{% if patroni_consul_key is defined and patroni_consul_key is not none and ( patroni_consul_key is not string or omit_placeholder_pattern not in patroni_consul_key ) %} + key: {{ patroni_consul_key }} +{% endif %} +{% if patroni_consul_dc is defined and patroni_consul_dc is not none and ( patroni_consul_dc is not string or omit_placeholder_pattern not in patroni_consul_dc ) %} + dc: {{ patroni_consul_dc }} +{% endif %} +{% if patroni_consul_consistency is defined and patroni_consul_consistency is not none and ( patroni_consul_consistency is not string or omit_placeholder_pattern not in patroni_consul_consistency ) %} + consistency: {{ patroni_consul_consistency }} +{% endif %} checks: {{ patroni_consul_checks | default ([]) }} +{% if patroni_consul_register_service is defined and patroni_consul_register_service is not none and ( patroni_consul_register_service is not string or omit_placeholder_pattern not in patroni_consul_register_service ) %} + register_service: {{ patroni_consul_register_service }} +{% endif %} +{% if patroni_consul_service_tags is defined and patroni_consul_service_tags is not none and ( patroni_consul_service_tags is not string or omit_placeholder_pattern not in patroni_consul_service_tags ) %} + service_tags: {{ patroni_consul_service_tags }} +{% endif %} +{% if patroni_consul_service_check_interval is defined and patroni_consul_service_check_interval is not none and ( patroni_consul_service_check_interval is not string or omit_placeholder_pattern not in patroni_consul_service_check_interval ) %} + service_check_interval: {{ patroni_consul_service_check_interval }} +{% endif %} +{% if patroni_consul_service_check_tls_server_name is defined and patroni_consul_service_check_tls_server_name is not none and ( patroni_consul_service_check_tls_server_name is not string or omit_placeholder_pattern not in patroni_consul_service_check_tls_server_name) %} + service_check_tls_server_name: {{ patroni_consul_service_check_tls_server_name }} +{% endif %} {% endif %} bootstrap: diff --git a/vars/main.yml b/vars/main.yml index d49521a..3bf446b 100644 --- a/vars/main.yml +++ b/vars/main.yml @@ -79,16 +79,30 @@ patroni_etcd_password: "" # (optional) password for etcd authenticat patroni_etcd_protocol: "" # (optional) http or https, if not specified http is used # more options you can specify in the roles/patroni/templates/patroni.yml.j2 -# https://patroni.readthedocs.io/en/latest/SETTINGS.html#etcd -# https://patroni.readthedocs.io/en/latest/SETTINGS.html#consul +# https://patroni.readthedocs.io/en/latest/yaml_configuration.html +patroni_consul_namespace: "{{ patroni.consul_namespace | default('service') }}" +patroni_consul_register_service: "{{ patroni.consul_register_service | default (omit) }}" patroni_consul_host: "{{ patroni.consul_host | default ('127.0.0.1:8500') }}" -patroni_consul_register_service: "{{ patroni.consul_register_service | default (false) }}" +patroni_consul_url: "{{ patroni.consul_url | default(omit) }}" # http(s)://host:port. +patroni_consul_port: "{{ patroni.consul_port | default(omit) }}" # (optional) Consul port. +patroni_consul_scheme: "{{ patroni.consul_scheme | default(omit) }}" # (optional) http or https, defaults to http. +patroni_consul_token: "{{ patroni.consul_token | default(omit) }}" # (optional) ACL token. +patroni_consul_verify: "{{ patroni.consul_verify | default(omit) }}" # (optional) whether to verify the SSL certificate for HTTPS requests. +patroni_consul_cacert: "{{ patroni.consul_cacert | default(omit) }}" # (optional) The ca certificate. If present it will enable validation. +patroni_consul_cert: "{{ patroni.consul_cert | default(omit) }}" # (optional) file with the client certificate. +patroni_consul_key: "{{ patroni.consul_key | default(omit) }}" # (optional) file with the client key. Can be empty if the key is part of cert. +patroni_consul_dc: "{{ patroni.consul_dc | default(omit) }}" # (optional) Datacenter to communicate with. By default the datacenter of the host is used. +patroni_consul_consistency: "{{ patroni.consul_consistency | default(omit) }}" # (optional) Select consul consistency mode. Possible values are default, consistent, or stale (more details in consul API reference) patroni_consul_checks: "{{ patroni.consul_checks | default ([]) }}" # - { http: "http://{{ inventory_hostname }}:{{ patroni_restapi_port }}/primary", interval: "2s" } # - { args: ["systemctl", "status", "pgbouncer"], interval: "5s" } # comment out this check if pgbouncer_install: false # - { http: "http://{{ inventory_hostname }}:{{ patroni_restapi_port }}/replica", interval: "2s" } # - { args: ["systemctl", "status", "pgbouncer"], interval: "5s" } +patroni_consul_service_tags: "{{ patroni_consul.service_tags | default(omit) }}" # (optional) additional static tags to add to the Consul service apart from the role (master/primary/replica/standby-leader). By default an empty list is used. +patroni_consul_service_check_interval: "{{ patroni.consul_service_check_interval | default(omit) }}" # (optional) how often to perform health check against registered url. Defaults to ā€˜5sā€™. +patroni_consul_service_check_tls_server_name: "{{ patroni.consul_service_check_tls_server_name | default(omit) }}" # (optional) overide SNI host when connecting via TLS, see also consul agent check API reference. + # PostgreSQL variables postgresql_cluster_name: "{{ postgresql.cluster_name | default('main') }}" @@ -297,15 +311,15 @@ pgbouncer_pools_default: pgbouncer_pools: "{{ pgbouncer_pools_default | union(pgbouncer.pools | default([])) }}" # Extended variables (optional) -patroni_restapi_port: 8008 -patroni_ttl: 30 -patroni_loop_wait: 10 -patroni_retry_timeout: 10 -patroni_maximum_lag_on_failover: 1048576 -patroni_master_start_timeout: 300 +patroni_restapi_port: "{{ patroni.restapi_port | default(8008) }}" +patroni_ttl: "{{ patroni.ttl | default(30) }}" +patroni_loop_wait: "{{ patroni.loop_wait | default(10) }}" +patroni_retry_timeout: "{{ patroni.retry_timeout | default(10) }}" +patroni_maximum_lag_on_failover: "{{ patroni.maximum_lag_on_failover | default(1048576) }}" +patroni_master_start_timeout: "{{ patroni.master_start_timeout | default(300) }}" # https://patroni.readthedocs.io/en/latest/SETTINGS.html?highlight=callbacks#dynamic-configuration-settings -patroni_callbacks: [] +patroni_callbacks: "{{ patroni.callbacks | default([]) }}" # - {action: "on_role_change", script: ""} # - {action: "on_stop", script: ""} # - {action: "on_restart", script: ""} @@ -316,49 +330,51 @@ patroni_callbacks: [] # Requirements: # 1. the cluster name for Standby Cluster must be unique ('patroni_cluster_name' variable) # 2. the IP addresses (or network) of the Standby Cluster servers must be added to the pg_hba.conf of the Main Cluster ('postgresql_pg_hba' variable). -patroni_standby_cluster: +__patroni_standby_cluster_default: host: "" # an address of remote master port: "5432" # a port of remote master # primary_slot_name: "" # which slot on the remote master to use for replication (optional) # restore_command: "" # command to restore WAL records from the remote master to standby leader (optional) # recovery_min_apply_delay: "" # how long to wait before actually apply WAL records on a standby leader (optional) +patroni_standby_cluster: "{{ patroni.standby_cluster | default(__patroni_standby_cluster_default) }}" patroni_log_destination: logfile # stderr or 'logfile' # if patroni_log_destination: logfile -patroni_log_dir: /var/log/patroni -patroni_log_level: info -patroni_log_traceback_level: error -patroni_log_format: "%(asctime)s %(levelname)s: %(message)s" -patroni_log_dateformat: "" -patroni_log_max_queue_size: 1000 -patroni_log_file_num: 4 -patroni_log_file_size: 25000000 # bytes -patroni_log_loggers_patroni_postmaster: warning -patroni_log_loggers_urllib3: warning # or 'debug' - -patroni_watchdog_mode: automatic # or 'off', 'required' -patroni_watchdog_device: /dev/watchdog - -patroni_postgresql_use_pg_rewind: true # or 'false' +patroni_log_dir: "{{ patroni.log_dir | default('/var/log/patroni') }}" +patroni_log_level: "{{ patroni.log_level | default('info') }}" +patroni_log_traceback_level: "{{ patroni.log_traceback_level | default('error') }}" +patroni_log_format: "{{ patroni.log_format | default('%(asctime)s %(levelname)s: %(message)s') }}" +patroni_log_dateformat: "{{ patroni.log_dateformat | default('') }}" +patroni_log_max_queue_size: "{{ patroni.log_max_queue_size | default(1000) }}" +patroni_log_file_num: "{{ patroni.log_file_num | default(4) }}" +patroni_log_file_size: "{{ patroni.log_file_size | default(25000000) }}" # bytes +patroni_log_loggers_patroni_postmaster: "{{ patroni.log_loggers_patroni_postmaster | default('warning') }}" +patroni_log_loggers_urllib3: "{{ patroni.log_loggers_urllib3 | default('warning') }}" # or 'debug' + +patroni_watchdog_mode: "{{ patroni.watchdog_mode | default('automatic') }}" # or 'off', 'required' +patroni_watchdog_device: "{{ patroni.watchdog_device | default('/dev/watchdog') }}" + +patroni_postgresql_use_pg_rewind: "{{ patroni.postgresql_use_pg_rewind | default(true) }}" # or 'false' # try to use pg_rewind on the former leader when it joins cluster as a replica. -patroni_remove_data_directory_on_rewind_failure: false # or 'true' (if use_pg_rewind: 'true') +patroni_remove_data_directory_on_rewind_failure: "{{ patroni.remove_data_directory_on_rewind_failure | default(false) }}" # or 'true' (if use_pg_rewind: 'true') # avoid removing the data directory on an unsuccessful rewind # if 'true', Patroni will remove the PostgreSQL data directory and recreate the replica. -patroni_remove_data_directory_on_diverged_timelines: false # or 'true' +patroni_remove_data_directory_on_diverged_timelines: "{{ patroni.remove_data_directory_on_diverged_timelines | default(false) }}" # or 'true' # if 'true', Patroni will remove the PostgreSQL data directory and recreate the replica # if it notices that timelines are diverging and the former master can not start streaming from the new master. # https://patroni.readthedocs.io/en/latest/replica_bootstrap.html#bootstrap -patroni_cluster_bootstrap_method: "initdb" # or "wal-g", "pgbackrest", "pg_probackup" +patroni_cluster_bootstrap_method: "{{ patroni.cluster_bootstrap_method | default('initdb') }}" # or "wal-g", "pgbackrest", "pg_probackup" # https://patroni.readthedocs.io/en/latest/replica_bootstrap.html#building-replicas -patroni_create_replica_methods: +__patroni_create_replica_methods_default: # - pgbackrest # - wal_g # - pg_probackup - basebackup +patroni_create_replica_methods: "{{ patroni.create_replica_methods | default(__patroni_create_replica_methods_default) }}" pgbackrest: - { option: "command", value: "/usr/bin/pgbackrest --stanza={{ pgbackrest_stanza }} --delta restore" }