Описание плейбука Ansible по развертыванию кластера Postgresql + Patroni + Pgbouncer
YAML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
--- - hosts: postgresql_nodes become: yes tasks: # Установка необходимых пакетов - name: Install necessary packages for PostgreSQL, Patroni, and PgBouncer apt: name: - postgresql-{{ postgresql_version }} - postgresql-client-{{ postgresql_version }} - postgresql-contrib-{{ postgresql_version }} - pgbouncer - python3-pip - etcd state: present update_cache: yes - name: Установка psycopg>=3.0.0 через pip (альтернатива) pip: name: psycopg version: ">=3.0.0" state: present executable: /usr/bin/pip3 # Укажите путь к вашему pip # Установка Patroni - name: Install Patroni pip: name: patroni[etcd3] state: present - name: Install python-etcd pip: name: python-etcd state: present # Конфигурация Patroni - name: Create Patroni configuration directory file: path: "{{ patroni_config_dir }}" state: directory mode: '0755' - name: Create Patroni configuration file template: src: patroni.yml.j2 dest: "{{ patroni_config_dir }}/patroni.yml" mode: '0644' - name: Создание юнит-файла systemd для Patroni copy: dest: /etc/systemd/system/patroni.service content: | [Unit] Description=Patroni High Availability PostgreSQL After=network.target [Service] Type=simple User=postgres ExecStart=/usr/local/bin/patroni /etc/patroni/patroni.yml Restart=always LimitNOFILE=1024 [Install] WantedBy=multi-user.target - name: Перезагрузка systemd для загрузки нового юнит-файла command: systemctl daemon-reload - name: Ensure /var/lib/postgresql/.ansible/tmp exists with correct permissions file: path: /var/lib/postgresql/.ansible/tmp state: directory owner: postgres group: postgres mode: '0755' - name: Stop PostgreSQL service systemd: name: postgresql state: stopped enabled: yes - name: Enable and start Patroni service systemd: name: patroni enabled: yes state: restarted # Конфигурация PgBouncer - name: Установка PgBouncer apt: name: pgbouncer state: present - name: Настройка PgBouncer copy: dest: /etc/pgbouncer/pgbouncer.ini content: | [databases] * = host=localhost port=5432 [pgbouncer] listen_addr = {{ pgbouncer_listen_addr }} listen_port = {{ pgbouncer_listen_port }} auth_type = {{ pgbouncer_auth_type }} auth_file = /etc/pgbouncer/userlist.txt pool_mode = {{ pgbouncer_pool_mode }} max_client_conn = 1000 default_pool_size = 20 - name: Добавление пользователей PgBouncer copy: dest: /etc/pgbouncer/userlist.txt content: | "postgres" "{{ postgresql_superuser_password }}" # "postgres" "md5{{ postgresql_superuser_password | password_hash('md5') }}" - name: Configure systemd service for PgBouncer copy: content: | [Unit] Description=PgBouncer After=network.target [Service] Type=simple ExecStart=/usr/sbin/pgbouncer /etc/pgbouncer/pgbouncer.ini User=postgres Group=postgres Restart=always [Install] WantedBy=multi-user.target dest: /etc/systemd/system/pgbouncer.service owner: root group: root mode: '0644' - name: Reload systemd daemon systemd: daemon_reload: yes - name: Запуск PgBouncer systemd: name: pgbouncer enabled: yes state: restarted |
1. Хосты и привилегии
YAML
1 2 3 |
- hosts: postgresql_nodes become: yes |
- hosts: postgresql_nodes — плейбук выполняется на группе хостов, указанных как
postgresql_nodes
в инвентаре. - become: yes — команды будут выполняться с привилегиями суперпользователя (root).
2. Установка необходимых пакетов
YAML
1 2 3 4 5 6 7 8 9 10 11 12 |
- name: Install necessary packages for PostgreSQL, Patroni, and PgBouncer apt: name: - postgresql-{{ postgresql_version }} - postgresql-client-{{ postgresql_version }} - postgresql-contrib-{{ postgresql_version }} - pgbouncer - python3-pip - etcd state: present update_cache: yes |
- Устанавливаются пакеты PostgreSQL (с указанной версией), PgBouncer, python3-pip и etcd, необходимые для работы Patroni.
- postgresql_version — переменная, которая определяет, какая версия PostgreSQL будет установлена.
3. Установка библиотек Python
YAML
1 2 3 4 5 6 7 |
- name: Установка psycopg>=3.0.0 через pip (альтернатива) pip: name: psycopg version: ">=3.0.0" state: present executable: /usr/bin/pip3 |
- Устанавливается библиотека psycopg для работы с PostgreSQL из Python через pip. Это важно для Patroni, так как Patroni взаимодействует с PostgreSQL.
4. Установка и конфигурация Patroni
- Устанавливаются пакеты Patroni и Python-модуль для работы с etcd.
YAML12345678910- name: Install Patronipip:name: patroni[etcd3]state: present- name: Install python-etcdpip:name: python-etcdstate: present - Далее создаётся конфигурационный файл для Patroni с помощью шаблона Jinja2:
YAML123456789101112- name: Create Patroni configuration directoryfile:path: "{{ patroni_config_dir }}"state: directorymode: '0755'- name: Create Patroni configuration filetemplate:src: patroni.yml.j2dest: "{{ patroni_config_dir }}/patroni.yml"mode: '0644'- Шаблон patroni.yml.j2 содержит параметры, такие как кластерные настройки, информация для работы с etcd, параметры PostgreSQL и настройки репликации. Файл создаётся в каталоге, который указан в переменной patroni_config_dir.
- Настраивается systemd для запуска Patroni как сервиса:
YAML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
- name: Создание юнит-файла systemd для Patroni copy: dest: /etc/systemd/system/patroni.service content: | [Unit] Description=Patroni High Availability PostgreSQL After=network.target [Service] Type=simple User=postgres ExecStart=/usr/local/bin/patroni /etc/patroni/patroni.yml Restart=always LimitNOFILE=1024 [Install] WantedBy=multi-user.target |
- Юнит-файл описывает, как запускать Patroni, указывает пользователем для выполнения
postgres
и путь к конфигурации Patroni. - Затем перезагружается конфигурация systemd, и Patroni запускается:
YAML123456789- name: Перезагрузка systemd для загрузки нового юнит-файлаcommand: systemctl daemon-reload- name: Enable and start Patroni servicesystemd:name: patronienabled: yesstate: restarted
Конфигурация PgBouncer
- Устанавливается и настраивается PgBouncer — это пулер соединений для PostgreSQL:
YAML12345- name: Установка PgBouncerapt:name: pgbouncerstate: present - Создаётся конфигурационный файл для PgBouncer:
YAML12345678910111213141516- name: Настройка PgBouncercopy:dest: /etc/pgbouncer/pgbouncer.inicontent: |[databases]* = host=localhost port=5432[pgbouncer]listen_addr = {{ pgbouncer_listen_addr }}listen_port = {{ pgbouncer_listen_port }}auth_type = {{ pgbouncer_auth_type }}auth_file = /etc/pgbouncer/userlist.txtpool_mode = {{ pgbouncer_pool_mode }}max_client_conn = 1000default_pool_size = 20 - Этот файл определяет параметры подключения к базам данных PostgreSQL и настройки самого PgBouncer, такие как режим пула соединений, тип аутентификации и максимальное количество подключений.
- {{ pgbouncer_listen_addr }}, {{ pgbouncer_listen_port }} и другие — это переменные, которые могут быть заданы в Ansible для динамического управления параметрами PgBouncer.
- Добавляются пользователи для PgBouncer:
YAML123456- name: Добавление пользователей PgBouncercopy:dest: /etc/pgbouncer/userlist.txtcontent: |"postgres" "{{ postgresql_superuser_password }}" - Этот файл содержит список пользователей PostgreSQL и их пароли для аутентификации через PgBouncer.
- Создаётся юнит-файл systemd для PgBouncer:
YAML12345678910111213141516171819202122- name: Configure systemd service for PgBouncercopy:content: |[Unit]Description=PgBouncerAfter=network.target[Service]Type=simpleExecStart=/usr/sbin/pgbouncer /etc/pgbouncer/pgbouncer.iniUser=postgresGroup=postgresRestart=always[Install]WantedBy=multi-user.targetdest: /etc/systemd/system/pgbouncer.serviceowner: rootgroup: rootmode: '0644' - И наконец, перезагружается systemd и запускается PgBouncer:
YAML12345678910- name: Reload systemd daemonsystemd:daemon_reload: yes- name: Запуск PgBouncersystemd:name: pgbouncerenabled: yesstate: restarted
Заключение
Этот плейбук Ansible полностью автоматизирует процесс развертывания кластера PostgreSQL с Patroni и PgBouncer:
- Устанавливаются необходимые пакеты для PostgreSQL, Patroni и PgBouncer.
- Конфигурируются Patroni и PgBouncer, обеспечивая высокую доступность и пул соединений.
- Настраивается управление через systemd для Patroni и PgBouncer, что упрощает управление сервисами.
Recommended Posts
SKIP LOCKED в PostgreSQL
27.08.2024
Transactional Outbox таблица PostgreSQL
23.04.2024