Ansible连接无密码PostgreSQL创建用户报错求助
解决PostgreSQL无密码时Ansible创建用户的问题
核心原因
你指定了login_host: 127.0.0.1,这会强制Ansible通过TCP连接PostgreSQL。默认情况下,PostgreSQL对TCP连接的postgres用户要求密码认证,但该用户未设置密码,因此触发fe_sendauth: no password supplied错误。如果是本地连接,PostgreSQL默认用peer认证(系统用户postgres可直接登录数据库,无需密码),但TCP连接不会采用该认证方式。
解决方案
方案1:改用Unix Socket本地连接(推荐)
去掉login_host参数,让Ansible通过Unix Socket连接PostgreSQL,此时会使用peer认证,无需postgres用户密码。修改后的任务代码:
- name: Connect to postgres database, create toto user, and grant access SUPERUSER, INHERIT When PGversion > 10 postgresql_user: db: postgres name: toto password: "{{ toto }}" role_attr_flags: SUPERUSER,INHERIT login_user: postgres port: "{{ port_postgres }}"
注意:此方案要求Ansible任务在PostgreSQL所在服务器上执行。
方案2:调整PostgreSQL认证规则允许无密码TCP连接
修改PostgreSQL的pg_hba.conf配置文件,允许postgres用户从127.0.0.1无密码登录:
- 添加或修改如下配置行:
host all postgres 127.0.0.1/32 trust - 重启PostgreSQL服务使配置生效:
systemctl restart postgresql
⚠️ 注意:trust认证会允许匹配IP的任何用户无需密码登录,存在安全风险,仅适合测试环境或严格隔离的内网环境。
方案3:临时设置postgres密码后执行任务
如果必须使用TCP连接,可以先临时给postgres设置密码,完成用户创建后再移除密码:
- name: Temporary set postgres password shell: psql -U postgres -c "ALTER USER postgres WITH PASSWORD 'toto';" - name: Connect to postgres database, create toto user, and grant access SUPERUSER, INHERIT When PGversion > 10 postgresql_user: login_host: 127.0.0.1 db: postgres name: toto password: "{{ toto }}" role_attr_flags: SUPERUSER,INHERIT login_user: postgres login_password: "toto" port: "{{ port_postgres }}" - name: Remove postgres password (optional) shell: psql -U postgres -c "ALTER USER postgres WITH PASSWORD NULL;"
内容的提问来源于stack exchange,提问作者farnould
相关产品推荐
相关产品推荐

