Создать User & DB в PostgreSQL средствами Ansible
Развернул чистый VPS на Ubuntu 20.04 чтобы развернуть проект Django.
Не удается создать пользователя и базу PostgreSQL
код таска:
- name: Create database user
become: yes
become_user: postgres
postgresql_user:
name: "{{ db_user }}"
password: "{{ db_password }}"
role_attr_flags: SUPERUSER
- name: Create a new database
become_user: postgres
community.general.postgresql_db:
name="{{ db_name }}"
encoding='UTF-8'
lc_collate='en_US.UTF-8'
lc_ctype='en_US.UTF-8'
template='template0'
state=present
pg_hba.conf:
local all postgres md5
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all md5
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all md5
host replication all 127.0.0.1/32 md5
host replication all ::1/128 md5
Выдает ошибку:
TASK [system : Create database user] ************************************************************************************
[WARNING]: Module did not set no_log for no_password_changes
fatal: [root]: FAILED! => {"changed": false, "msg": "unable to connect to database: fe_sendauth: no password supplied\n"}
Что делать?
Ответы (2 шт):
часть I. В поисках документации
Из офицальной документации можно достать пример кода:
- name: Create a new database with name "acme" and specific encoding and locale # settings.
community.general.postgresql_db:
name: acme
encoding: UTF-8
lc_collate: de_DE.UTF-8
lc_ctype: de_DE.UTF-8
template: template0
Он не верный, не хватает
become: yes
become_user: postgres
Данный участок, если я все правильно понимаю, меняет пользователя с root на postgres (пароль которого не известен). Администрировать СУБД может только postgres, который заводиться в системе автоматически при установке PostgreSQL
Иногда можно встетить неверную альтернативу этого кода:
sudo: postgres
Это не верно, не делайте так
часть II. Конфигурация PostgreSQL
На форумах встречал ссылки на
/etc/postgresql/12/main/pg_hba.conf/etc/postgresql/12/main/postgresql.conf
Так вот, в pg_hba.conf нужно поменять peer на `md5. У меня получилось вот так:
local all postgres peer
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all md5
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all peer
host replication all 127.0.0.1/32 md5
host replication all ::1/128 md5
А вот в postgresql.conf нужно заменить
# listen_addresses = 'localhost'
на
listen_addresses = '*'
часть III. Подготовка окружения
Чтобы все это хозяйство работало установите на своей машине плагин для ansible community.general
ansible-galaxy collection install community.general
Для работы Ansible с PostgreSQL на целевой машине должен быть установлен python3-psycopg2
- name: Install packages
when: ansible_distribution == 'Ubuntu'
become: yes
apt:
name:
- postgresql
- postgresql-contrib
- python3-pip
- python3-dev
- python3-venv
- python3-psycopg2
state: present
Моя спагетти-пелёнка (роль сильно напряг и времени нет), которой я делал ноду для обучения студентов по предмету "БД":
---
# WORK
# https://www.postgresql.org/download/linux/ubuntu/
# https://info-comp.ru/sisadminst/598-install-postgresql-10-on-ubuntu-server.html
# https://www.digitalocean.com/community/tutorials/postgresql-ubuntu-16-04-ru
# https://eax.me/postgresql-install/
- name: Install PostgreSQL
hosts: all
strategy: free
serial:
- "100%"
tasks:
# https://wiki.postgresql.org/wiki/Apt
- name: Install PostgreSQL server 4 Ubuntu
when:
- ansible_distribution == 'Ubuntu'
- ansible_architecture == 'x86_64'
become: yes
block:
- apt_key:
url: https://www.postgresql.org/media/keys/ACCC4CF8.asc
state: present
- apt_repository:
repo: deb [arch=amd64] http://apt.postgresql.org/pub/repos/apt/ {{ ansible_distribution_release }}-pgdg main
state: present
filename: pgdg
# Как видно из register - вычисляем последнюю версию pg.
- shell: aptitude search -F %p postgresql- | grep postgresql-[0-9][0-9]$ | sort --version-sort | tail -1 | cut -d '-' -f 2
register: pg_latest_version
changed_when: pg_latest_version.rc != 0
- debug:
msg: '{{ pg_latest_version }}'
- apt:
name:
- postgresql-{{ pg_latest_version.stdout }}
# Советуют в интернетах поставить, чтобы было меньше геморняка.
- postgresql-contrib
- libpq-dev
# Это чтобы ansible мог дальше рулить базами.
- python-psycopg2
state: latest
install_recommends: yes
- service:
name: postgresql
state: started
tags:
- linux
- ubuntu
- install
- db
- postgresql
- pg
# https://info-comp.ru/sisadminst/598-install-postgresql-10-on-ubuntu-server.html
# По идее - тут универсальный путь до конфига. Но пока пусть будет бубунта.
- name: Config files PostgreSQL 4 Ubuntu
when:
- ansible_distribution == 'Ubuntu'
- ansible_architecture == 'x86_64'
become: yes
block:
- lineinfile:
path: /etc/postgresql/{{ pg_latest_version.stdout }}/main/postgresql.conf
insertafter: 'Connection Settings'
# line: listen_addresses = '10.0.0.0/8'
# line: listen_addresses = '10.0.0.0'
line: listen_addresses = '*'
state: present
backup: yes
register: pgsql_config
- debug:
msg: '{{ pgsql_config.changed }}'
- lineinfile:
path: /etc/postgresql/{{ pg_latest_version.stdout }}/main/pg_hba.conf
# Порядок строк - влияет на права. Поэтому, если воткнуть в конец - ничего работать не будет.
# https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1195193&msg=18678315
insertafter: '# TYPE'
line: host all all 10.0.0.0/8 md5
state: present
backup: yes
register: pgsql_hba_config
- service:
name: postgresql
state: restarted
# Этот вариант пашет, когда поменялся хоть какой-нибудь.
when: (pgsql_config.changed == true) or (pgsql_hba_config.changed == true)
# Этот вариант пашет, когда ОБА конфига поменялись.
# when:
# - pgsql_config.changed == true
# - pgsql_hba_config.changed == true
tags:
- linux
- ubuntu
- db
- postgresql
- pg
- config
- name: Create test database PostgreSQL 4 Linux
when:
- ansible_system == 'Linux'
become: yes
become_user: postgres
vars:
student_database: student_db
student_user: student
student_password: student
password_for_default_postgres_user: qazwsxedc
block:
- postgresql_user:
name: postgres
password: '{{ password_for_default_postgres_user }}'
- postgresql_db:
db: '{{ student_database }}'
encoding: UTF-8
state: present
- postgresql_user:
db: '{{ student_database }}'
name: '{{ student_user }}'
password: '{{ student_password }}'
state: present
expires: infinity
priv: CREATE,CONNECT,TEMPORARY
- postgresql_db:
db: '{{ student_database }}'
owner: '{{ student_user }}'
encoding: UTF-8
state: present
- postgresql_privs:
database: '{{ student_database }}'
state: present
host: 127.0.0.1
privs: '{{ item }}'
type: database
roles: '{{ student_user }}'
login: '{{ student_user }}'
password: '{{ student_password }}'
with_items:
- CREATE
- CONNECT
- TEMPORARY
tags:
- linux
- ubuntu
- db
- postgresql
- pg
- config
- create
- student
Какие куски непонятны - спроси в каментах.