Управление разными версиями Postgresql с помощью Ansible

Я очень люблю использовать Ансибль для управления серверами. Недавно столкнулся с проблемой при настройке репликации Постгреса. Для ее настройки нужно редактировать файл pg_hba.conf. Сложность в том, что Постгрес ставит свои файлы в папку с номером версии, например, /etc/postgresql/9.2/. Как написать плейбук, чтобы Ансибль нашел конфиг?

Поиск в инете не принес результата. Кто-то хардкодил путь в плейбуке, кто-то выносил номер версии в константы. Мне оба эти способа не понравились.

Придуманное решение основывается на использовании модулей shell, fail и set_fact.

С помощью shell смотрим, что лежит в /etc/postgresql. В директиве register можно указать имя переменной, куда надо сохранить объект, содержащий сведения о выполнении команды. В этом объекте будет содержаться и ее вывод.

fail проверяет, что в списке только один элемент. Если это не так, то мы не можем надежно определить номер версии, и надо прервать работу.

set_fact сохраняет нужный нам единственный элемент в отдельную переменную. Ее мы и используем в дальнейшем.

Сам код:

- name: get postgres version
  shell: ls -1 /etc/postgresql
  register: postgres_versions

- name: check one version is present
  fail: msg="Can't get postgresql version"
  when: postgres_versions.stdout_lines|length != 1

- name: store postgres version
  set_fact: postgres_version="{{ postgres_versions.stdout_lines[0] }}"

- name: update pg_hba if replication
  lineinfile: dest=/etc/postgresql/{{ postgres_version }}/main/pg_hba.conf regexp="^#?\s*host    replication    postgres" line="host    replication    postgres    {{ hot_standby_ip }}/32    trust" state=present
  notify: restart postgresql
Управление разными версиями Postgresql с помощью Ansible

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s