使用Ansible创建PostgreSQL数据库失败,求助排查Peer认证错误
看来你在Ansible部署PostgreSQL数据库时栽在了Peer认证这一步,我帮你梳理下问题根源和可行的解决方案:
问题根源
你遇到的FATAL: Peer authentication failed for user "postgres"错误,本质是PostgreSQL的Peer认证机制在起作用——这种认证方式会严格校验当前系统用户是否和PostgreSQL用户名完全一致。虽然你已经用了become_user: postgres切换用户,但Ansible的PostgreSQL模块在连接数据库时,可能没正确匹配到PostgreSQL的Unix套接字路径,导致认证失败。
修复方案
这里有几种靠谱的解决方式,按推荐程度排序:
1. 指定Unix套接字路径(推荐)
Debian/Ubuntu系的PostgreSQL,默认把Unix套接字放在/var/run/postgresql/目录下。你只需要在postgresql_db和postgresql_user模块里加上login_unix_socket参数,让模块明确知道该用哪个路径连接数据库:
修改后的完整Playbook:
- name: Installation of postgresql-9.6 apt: name=postgresql-9.6 state=present - name: Start postgresql service service: name=postgresql state=restarted enabled=yes - name: Create a database become: yes become_user: postgres postgresql_db: name: managys encoding: UTF-8 lc_collate: de_DE.UTF-8 template: template0 state: present login_unix_socket: /var/run/postgresql/ - name: Create user for database become: yes become_user: postgres postgresql_user: db: managys # 建议关联到目标数据库,而非template0 name: Odoo password: Odoo priv: ALL state: present login_unix_socket: /var/run/postgresql/
另外帮你修正了Playbook里的拼写错误:crate改成了Create,并且给创建数据库的任务补上了become: yes,确保切换用户的操作生效。
2. 临时调整认证规则(仅测试环境用)
如果是测试环境图省事,可以临时修改PostgreSQL的pg_hba.conf配置文件,把postgres用户的Peer认证改成Trust:
# 找到这一行 local all postgres peer # 修改成 local all postgres trust
修改后重启PostgreSQL服务:
sudo systemctl restart postgresql
⚠️ 注意:这种方式会让postgres用户无需密码直接登录,绝对不能在生产环境用!
3. 检查Become权限
确保执行Ansible的用户有足够权限切换到postgres用户,比如在sudoers里配置了免密切换,或者执行Playbook时加上--ask-become-pass输入sudo密码。
额外小提示
创建数据库用户时,db参数建议指定为你刚创建的managys数据库,而不是template0,这样权限会直接应用到目标业务数据库,后续使用更顺畅。
内容的提问来源于stack exchange,提问作者iyadhalaoui

