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

使用Ansible Playbook安装PostgreSQL 12并创建用户及数据库时遇到权限错误的解决方法咨询

Ansible Playbook安装PostgreSQL 12并创建用户及数据库时遇到权限错误的解决方法咨询

我尝试用下面的Playbook在Ubuntu 22和23版本的机器上安装PostgreSQL 12,同时给postgres用户设置默认密码,之后创建新的用户和数据库:

- hosts: local
  become: yes
  become_method: sudo
  vars:
    postgresql_version: 12
    db_name: your_database
    db_user: your_user
    db_password: your_password
    postgres_password: your_postgres_password
  tasks:
    - name: Update apt cache
      apt: update_cache=yes

    - name: Add the PostgreSQL APT key
      apt_key:
        url: https://www.postgresql.org/media/keys/ACCC4CF8.asc
        state: present

    - name: Add the PostgreSQL APT repositories
      apt_repository:
        repo: deb http://apt.postgresql.org/pub/repos/apt/ {{ ansible_distribution_release }}-pgdg main
        state: present

    - name: Update apt cache
      apt: update_cache=yes

    - name: Install PostgreSQL
      apt:
        name: postgresql-{{ postgresql_version }}
        state: present

    - name: Set password for the default PostgreSQL user
      become: yes
      become_user: postgres
      shell: 'psql -c "ALTER USER postgres WITH PASSWORD ''{{ postgres_password }}'';"'

    - name: Create a new user in PostgreSQL
      become: yes
      become_user: postgres
      shell: 'psql -c "CREATE USER {{ db_user }} WITH PASSWORD ''{{ db_password }}'' SUPERUSER;"'

    - name: Create a new database in PostgreSQL
      become: yes
      become_user: postgres
      shell: 'psql -c "CREATE DATABASE {{ db_name }} WITH OWNER {{ db_user }};"'

    - name: Create a new database in PostgreSQL
      become: yes
      become_user: postgres
      command: 'psql -c "CREATE DATABASE {{ db_name }} WITH OWNER {{ db_user }};"'

但运行时遇到了下面的错误:

TASK [Set password for the default PostgreSQL user]
******************************************************************** fatal: [localhost]: FAILED! => {"msg": "Failed to set permissions on
the temporary files Ansible needs to create when becoming an
unprivileged user (rc: 1, err: chmod: invalid mode:
‘A+user:postgres:rx:allow’\nTry 'chmod --help' for more
information.\n}). For information on working around this, see
https://docs.ansible.com/ansible-core/2.14/user_guide/become.html#risks-of-becoming-an-unprivileged-user"}

PLAY RECAP
************************************************************************************************************* localhost : ok=6 changed=2 unreachable=0
failed=1 skipped=0 rescued=0 ignored=0

我的inventory文件内容是:

[local]
localhost ansible_connection=local

请问该怎么修复这个问题?


嘿,这个权限错误我之前也碰到过,主要是Ansible在切换到非特权用户(比如postgres)时,需要用ACL来设置临时文件的权限,但你的系统可能没装ACL工具,或者用shell模块切换用户的方式容易踩坑。给你两个靠谱的解决办法:

方法一:先安装ACL工具

在Playbook的开头,添加一个安装acl包的任务,这样Ansible就能正确处理临时文件的权限了:

- name: Install ACL package
  apt:
    name: acl
    state: present

把这个任务放在第一个Update apt cache任务之后就行,安装完ACL再继续后面的步骤,应该就能解决权限问题。

方法二:改用Ansible官方的PostgreSQL模块(更推荐)

用shell/command模块直接执行psql命令虽然直观,但容易遇到权限问题,而且不符合Ansible的最佳实践。Ansible有专门的postgresql_user和postgresql_db模块,这些模块会自动处理用户切换和权限问题,更稳定。

修改后的Playbook任务部分如下:

# 先确保安装postgresql模块依赖
- name: Install python3-psycopg2 (PostgreSQL module dependency)
  apt:
    name: python3-psycopg2
    state: present

- name: Set password for default postgres user
  postgresql_user:
    name: postgres
    password: "{{ postgres_password }}"
    login_unix_socket: /var/run/postgresql
  become: yes
  become_user: postgres

- name: Create new PostgreSQL user
  postgresql_user:
    name: "{{ db_user }}"
    password: "{{ db_password }}"
    role_attr_flags: SUPERUSER
    login_unix_socket: /var/run/postgresql
  become: yes
  become_user: postgres

- name: Create new PostgreSQL database
  postgresql_db:
    name: "{{ db_name }}"
    owner: "{{ db_user }}"
    login_unix_socket: /var/run/postgresql
  become: yes
  become_user: postgres

注意要先安装python3-psycopg2,这是PostgreSQL模块的依赖包。用这些模块的话,不仅能避免权限错误,还能让Playbook更具幂等性(重复运行不会报错)。

另外,我看到你Playbook里有两个重复的创建数据库任务,记得删掉其中一个哦~

备注:内容来源于stack exchange,提问作者user2331760

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 08:37:58