如何使用 ansible playbook 安装 postgres 并创建新的用户和数据库?

如何使用 ansible playbook 安装 postgres 并创建新的用户和数据库?

我尝试使用下面的剧本在我的 ubuntu 机器上安装 postgres 12,该机器有 22 和 23 版本的 ubuntu。安装 postgres 并为 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 }};"'

但是,低于错误

任务 [设置默认 PostgreSQL 用户的密码] ************************************************************************ 致命:[localhost]:失败! => {“msg”:“无法设置 Ansible 在成为非特权用户时需要创建的临时文件的权限(rc:1,错误:chmod:无效模式:'A + user:postgres:rx:allow'\n尝试'chmod --help'获取更多信息。\n})。有关解决此问题的信息,请参阅 https://docs.ansible.com/ansible-core/2.14/user_guide/become.html#risks-of-becoming-an-unprivileged-user"}

播放回顾 ********************************************************************************************************************* localhost:ok=6 已更改=2 无法访问=0
已失败=1 已跳过=0 已获救=0 已忽略=0

如何修复?

我的库存文件:

[local]
localhost ansible_connection=local

答案1

你可以阅读在此链接中那:

Ansible 模块在远程机器上的执行方式是先将参数代入模块文件,再将文件复制到远程机器,最后在远程机器上执行。

如果在不使用 become 的情况下执行模块文件,当 become_user 是 root 时,或者以 root 身份连接到远程计算机时,一切都会正常。在这些情况下,Ansible 会创建具有权限的模块文件,这些权限仅允许用户和 root 读取,或者仅允许切换到的非特权用户读取。

但是,当连接用户和成为用户都无特权时,模块文件将以 Ansible 连接的用户(remote_user)的身份写入,但该文件需要对 Ansible 设置为成为的用户具有可读性。

因此,如果您使用没有 root 权限的 ansible 用户,则当用于更改密码的模块 shell 发送到远程机器时,postgres 用户将无法正确执行它。

另一种方法是使用 sudo 执行 psql(不执行任务,只执行命令):

- name: Set password for the default PostgreSQL user
  command: sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD '{{ postgres_password }}';"

相关内容