Ansible:变成两次

bad*_*hop 4 postgresql ansible ansible-playbook

我想运行 ansible 以便:

  • 远程用户是“普通”用户

  • ... 谁become的 root 通过sudo来运行一堆任务

  • ... 谁become的 postgres 用户通过su - postgres,从 root 创建一个 PostgreSQL 数据库。

这是 PostgreSQL 世界的典型程序:只能通过sufrom访问的特殊用户root

只有在以 root 身份连接时,才能在 play 中指定 become-ish 参数,因为 CLI 选项会覆盖 play 中定义的任何内容。

除了添加sudo规则或运行之外,是否有更优雅的方法来实现这一目标

command: /usr/bin/su - postgres -c '/bin/createuser -D -R -S myuser

从ansible,告诉它关闭警告?

HBr*_*ijn 5

为什么您必须两次更改有效用户?

您可以指定 ansible 需要按任务运行的有效用户 ID,因此当您需要以 postgres 用户身份运行命令时,直接设置。

tasks:
  - name: Create Postgres User
    shell: /bin/createuser -D -R -S myuser
    become: yes
    become_user: postgres
Run Code Online (Sandbox Code Playgroud)

通常,当用户获得sudo权限时,root他们已经获得ALL并成为任何用户,包括 postgres。

或者,创建一个额外的 sudo 权限,以便您的 ansible 用户可以作为 postgres 用户执行(特定)命令。

注意:考虑使用 Ansible Postgres数据库模块来管理您的数据库、角色和权限。


回应您的评论:我以普通用户的身份与 Ansible 联系:

ansible example -a "/bin/whoami"
example | SUCCESS | rc=0 >>
hbruijn
Run Code Online (Sandbox Code Playgroud)

我有一个相当典型的“ /etc/sudoers.d/hbruijn”片段,它对我(我的 Ansible 用户)可以做的事情没有任何限制:

# /etc/sudoers.d/hbruijn
hbruijn  ALL = NOPASSWD: ALL
Run Code Online (Sandbox Code Playgroud)

然后我可以让become任何用户在不同的用户 ID 和任务下执行命令,而无需调用sudosu首先:

ansible example -b --become-user=root  -a "/bin/whoami"
example | SUCCESS | rc=0 >>
root
Run Code Online (Sandbox Code Playgroud)

或者:

ansible example -b --become-user=postgres  -a "/bin/whoami"
example | SUCCESS | rc=0 >>
postgres
Run Code Online (Sandbox Code Playgroud)

所有这些都没有以超级用户身份直接连接 Ansible。

  • 不,`become` 将尝试使用 `become_method` 切换到 `become_user`。如果我与用户 john 连接,并且我有一个 sudo 规则允许 john 作为 postgres 运行东西,这可以工作。su 有一个“become_method”,但是除非您已经是 root,否则这受到需要凭据的 su 限制。 (2认同)