我尝试使用下面的剧本在我的 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 }}';"