You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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无密码登录:

  1. 添加或修改如下配置行:
    host    all             postgres        127.0.0.1/32            trust
    
  2. 重启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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:01:22