Ansible配置PostgreSQL时Peer认证失败问题求助
解决Ansible配置PostgreSQL时的Peer认证失败问题
错误核心原因
你的问题出在PostgreSQL的pg_hba.conf和用户映射(user_map)配置错误:
- 日志显示
no match in usermap "user_map" for user "postgres" authenticated as "postgres",说明你的user_map规则格式错误,且实际上当你以postgres系统用户执行Ansible任务时,不需要额外映射即可通过peer认证。 - 错误的映射规则和pg_hba配置导致认证失败,而添加
become: yes会切换到root用户执行,触发PostgreSQL socket权限的其他问题。
分步解决方案
1. 修正pg_hba.conf配置
编辑目标机器上的/etc/postgresql/<your-postgres-version>/main/pg_hba.conf(Ubuntu 22.04默认是14版本,路径为/etc/postgresql/14/main/pg_hba.conf):
- 针对
postgres用户的本地连接,恢复默认的peer认证(无需映射):local all postgres peer - 如果你想对所有本地用户统一使用映射,确保规则正确:
local all all peer map=user_map
2. 正确配置用户映射(pg_ident.conf)
如果保留map=user_map,编辑/etc/postgresql/<version>/main/pg_ident.conf,添加正确的映射规则:
user_map postgres postgres
规则格式为:[映射名] [操作系统用户名] [数据库用户名],你之前的postgres boop postgres格式完全错误,导致无法匹配。
3. 调整Ansible任务的连接参数
在创建数据库用户的任务中,明确指定PostgreSQL登录参数,确保模块用正确的身份连接:
- name: create database user postgresql_user: name: test1 password: boop login_user: postgres login_unix_socket: /var/run/postgresql/
login_user: postgres指定用postgres数据库用户登录login_unix_socket指定socket路径,避免连接问题
4. 重启PostgreSQL服务生效配置
在Ansible的Setup playbook末尾添加重启任务(确保用become: true获取权限):
- name: Restart PostgreSQL to apply config changes become: true service: name: postgresql state: restarted
5. 验证配置有效性
先在目标机器上手动验证:
su - postgres psql -U postgres
如果能正常进入PostgreSQL命令行,说明认证配置正确,再重新运行Ansible playbook即可。
关键注意事项
- 不要在数据库任务块中添加
become: yes,因为你已经通过become_user: postgres切换到了PostgreSQL专用用户,root用户连接PostgreSQL需要额外的认证配置,反而容易引发权限问题。 - Ubuntu 22.04默认安装的PostgreSQL版本为14,注意配置文件的路径要对应版本号。
内容的提问来源于stack exchange,提问作者deeply confused shrimp
相关产品推荐
相关产品推荐

